if (($force || !file_exists($newfile)) && !@rename($tmpfile, $newfile)) { ic2_error('x02', "リネーム失敗。({$tmpfile} → {$newfile})"); } @chmod($newfile, 0644); // データベースにファイル情報を記録する $record = new ImageCache2_DataObject_Images(); if ($retry && $size == $_size && $md5 == $_md5 && $mime == $_mime) { $record->time = time(); if ($ini['General']['automemo'] && !is_null($memo)) { $record->memo = $memo; } $record->whereAddQuoted('uri', '=', $uri); $record->whereAddQuoted('size', '=', $size); $record->whereAddQuoted('md5', '=', $md5); $record->whereAddQuoted('mime', '=', $mime); $record->update(); } else { $record->uri = $uri; $record->host = $host; $record->name = $name; $record->size = $size; $record->md5 = $md5; $record->width = $width; $record->height = $height; $record->mime = $mime; $record->time = time(); $record->rank = $rank; if ($ini['General']['automemo'] && !is_null($memo)) { $record->memo = $memo; } $record->insert();
/** * メモを追加 */ public static function addMemo($target, $memo) { if (empty($target)) { return; } if (!is_array($target)) { if (is_integer($updated) || ctype_digit($updated)) { $id = (int) $updated; if ($id > 0) { $updated = array($id); } else { return; } } else { P2Util::pushInfoHtml('<p>WARNING! ImageCache2_DatabaseManager::addMemo(): 不正な引数</p>'); return $removed_files; } } // トランザクションの開始 $ta = new ImageCache2_DataObject_Images(); $db = $ta->getDatabaseConnection(); if ($db->phptype == 'pgsql') { $ta->query('BEGIN'); } elseif ($db->phptype == 'sqlite') { $db->query('BEGIN;'); } // メモに指定文字列が含まれていなければ更新 foreach ($target as $id) { $find = new ImageCache2_DataObject_Images(); $find->whereAdd("id = {$id}"); if ($find->find(true) && strpos($find->memo, $memo) === false) { $update = new ImageCache2_DataObject_Images(); $update->whereAdd("id = {$id}"); if (strlen($find->memo) > 0) { $update->memo = $find->memo . ' ' . $memo; } else { $update->memo = $memo; } $update->update(); unset($update); } unset($find); } // トランザクションのコミット if ($db->phptype == 'pgsql') { $ta->query('COMMIT'); } elseif ($db->phptype == 'sqlite') { $db->query('COMMIT;'); } }
/** * 置換画像URL+ImageCache2 */ public function plugin_replaceImageUrl($url, $purl, $str) { static $serial = 0; global $_conf; global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit; // +Wiki global $replaceImageUrlCtl; $url = $purl[0]; $replaced = $replaceImageUrlCtl->replaceImageUrl($url); if (!$replaced[0]) { return false; } foreach ($replaced as $v) { $url_en = rawurlencode($v['url']); $url_ht = p2h($v['url']); $ref_en = $v['referer'] ? '&ref=' . rawurlencode($v['referer']) : ''; // 準備 $serial++; $thumb_id = 'thumbs' . $serial . $this->thumb_id_suffix; $tmp_thumb = './img/ic_load.png'; $icdb = new ImageCache2_DataObject_Images(); // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ // +Wiki $img_url = 'ic2.php?r=1&uri=' . $url_en . $ref_en; $thumb_url = 'ic2.php?r=1&t=1&uri=' . $url_en . $ref_en; // お気にスレ自動画像ランク $rank = null; if ($_conf['expack.ic2.fav_auto_rank']) { $rank = $this->getAutoFavRank(); if ($rank !== null) { $thumb_url .= '&rank=' . $rank; } } // DBに画像情報が登録されていたとき if ($icdb->get($v['url'])) { // ウィルスに感染していたファイルのとき if ($icdb->mime == 'clamscan/infected') { $result .= "<img class=\"thumbnail\" src=\"./img/x04.png\" width=\"32\" height=\"32\" hspace=\"4\" vspace=\"4\" align=\"middle\">"; continue; } // あぼーん画像のとき if ($icdb->rank < 0) { $result .= "<img class=\"thumbnail\" src=\"./img/x01.png\" width=\"32\" height=\"32\" hspace=\"4\" vspace=\"4\" align=\"middle\">"; continue; } // オリジナルがキャッシュされているときは画像を直接読み込む $_img_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); if (file_exists($_img_url)) { $img_url = $_img_url; $cached = true; } else { $cached = false; } // サムネイルが作成されていているときは画像を直接読み込む $_thumb_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); if (file_exists($_thumb_url)) { $thumb_url = $_thumb_url; // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false) { $update = new ImageCache2_DataObject_Images(); if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { $update->memo = $this->img_memo . ' ' . $icdb->memo; } else { $update->memo = $this->img_memo; } $update->whereAddQuoted('uri', '=', $v['url']); } // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら // お気にスレ自動画像ランクを上書き更新 if ($rank !== null && self::isAutoFavRankOverride($icdb->rank, $rank)) { if ($update === null) { $update = new ImageCache2_DataObject_Images(); $update->whereAddQuoted('uri', '=', $v['url']); } $update->rank = $rank; } if ($update !== null) { $update->update(); } } // サムネイルの画像サイズ $thumb_size = $this->thumbnailer->calc($icdb->width, $icdb->height); $thumb_size = preg_replace('/(\\d+)x(\\d+)/', 'width="$1" height="$2"', $thumb_size); $tmp_thumb = './img/ic_load1.png'; $orig_img_url = $img_url; $orig_thumb_url = $thumb_url; // 画像がキャッシュされていないとき // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める } else { // 画像がブラックリストorエラーログにあるか確認 if (false !== ($errcode = $icdb->ic2_isError($v['url']))) { $result .= "<img class=\"thumbnail\" src=\"./img/{$errcode}.png\" width=\"32\" height=\"32\" hspace=\"4\" vspace=\"4\" align=\"middle\">"; continue; } $cached = false; $orig_img_url = $img_url; $orig_thumb_url = $thumb_url; $img_url .= $this->img_memo_query; $thumb_url .= $this->img_memo_query; $thumb_size = ''; $tmp_thumb = './img/ic_load2.png'; } // キャッシュされておらず、表示数制限が有効のとき if (!$cached && !$pre_thumb_unlimited && !$pre_thumb_ignore_limit) { // 表示制限を超えていたら、表示しない // 表示制限を超えていなければ、表示制限カウンタを下げる if ($pre_thumb_limit <= 0) { $show_thumb = false; } else { $show_thumb = true; $pre_thumb_limit--; } } else { $show_thumb = true; } // 表示モード if ($show_thumb) { $img_tag = "<img class=\"thumbnail\" src=\"{$thumb_url}\" {$thumb_size} hspace=\"4\" vspace=\"4\" align=\"middle\">"; if ($_conf['iframe_popup']) { $view_img = $this->imageHtmlPopup($img_url, $img_tag, ''); } else { $view_img = "<a href=\"{$img_url}\"{$_conf['ext_win_target_at']}>{$img_tag}</a>"; } } else { $img_tag = "<img id=\"{$thumb_id}\" class=\"thumbnail\" src=\"{$tmp_thumb}\" width=\"32\" height=\"32\" hspace=\"4\" vspace=\"4\" align=\"middle\">"; $view_img = "<a href=\"{$img_url}\" onclick=\"return loadThumb('{$thumb_url}','{$thumb_id}')\"{$_conf['ext_win_target_at']}>{$img_tag}</a><a href=\"{$img_url}\"{$_conf['ext_win_target_at']}></a>"; } $view_img .= '<img class="ic2-info-opener" src="img/s2a.png" width="16" height="16" onclick="ic2info.show(' . "'{$url_ht}', event)\">"; $result .= $view_img; } // ソースへのリンクをime付きで表示 $ime_url = P2Util::throughIme($url); $result .= "<a class=\"img_through_ime\" href=\"{$ime_url}\"{$_conf['ext_win_target_at']}>{$str}</a>"; return $result; }
public function plugin_replaceImageUrl($url, $purl, $str) { global $_conf; global $pre_thumb_unlimited, $pre_thumb_ignore_limit, $pre_thumb_limit_k; if (P2Util::isUrlWikipediaJa($url)) { return false; } // if (preg_match('{^https?://.+?\\.(jpe?g|gif|png)$}i', $url) && empty($purl['query'])) { // +Wiki global $replaceImageUrlCtl; $url = $purl[0]; $replaced = $replaceImageUrlCtl->replaceImageUrl($url); if (!$replaced[0]) { return false; } foreach ($replaced as $v) { // インラインプレビューの有効判定 if ($pre_thumb_unlimited || $pre_thumb_ignore_limit || $pre_thumb_limit_k > 0) { $inline_preview_flag = true; $inline_preview_done = false; } else { $inline_preview_flag = false; $inline_preview_done = false; } // +Wiki // $url_en = rawurlencode($url); $url_ht = $url; $url_en = rawurlencode($v['url']); $ref_en = $v['referer'] ? '&ref=' . rawurlencode($v['referer']) : ''; $img_str = null; $img_id = null; $icdb = new ImageCache2_DataObject_Images(); // r=0:リンク;r=1:リダイレクト;r=2:PHPで表示 // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ $img_url = 'ic2.php?r=0&t=2&uri=' . $url_en . $ref_en; $img_url2 = 'ic2.php?r=0&t=2&id='; $src_url = 'ic2.php?r=1&t=0&uri=' . $url_en . $ref_en; $src_url2 = 'ic2.php?r=1&t=0&id='; $src_exists = false; // お気にスレ自動画像ランク $rank = null; if ($_conf['expack.ic2.fav_auto_rank']) { $rank = $this->getAutoFavRank(); } // DBに画像情報が登録されていたとき if ($icdb->get($v['url'])) { $img_id = $icdb->id; // ウィルスに感染していたファイルのとき if ($icdb->mime == 'clamscan/infected') { return '[IC2:ウィルス警告]'; } // あぼーん画像のとき if ($icdb->rank < 0) { return '[IC2:あぼーん画像]'; } // オリジナルの有無を確認 $_src_url = $this->thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); if (file_exists($_src_url)) { $src_exists = true; $img_url = $img_url2 . $icdb->id; $src_url = $_src_url; } else { $img_url = $this->thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); $src_url = $src_url2 . $icdb->id; } // インラインプレビューが有効のとき $prv_url = null; if ($this->thumbnailer->ini['General']['inline'] == 1) { // PCでread_new_k.phpにアクセスしたとき等 if (!isset($this->inline_prvw) || !is_object($this->inline_prvw)) { $this->inline_prvw = $this->thumbnailer; } $prv_url = $this->inline_prvw->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); // サムネイル表示制限数以内のとき if ($inline_preview_flag) { // プレビュー画像が作られているかどうかでimg要素の属性を決定 if (file_exists($prv_url)) { $prvw_size = explode('x', $this->inline_prvw->calc($icdb->width, $icdb->height)); $img_str = "<img src=\"{$prv_url}\" width=\"{$prvw_size[0]}\" height=\"{$prvw_size[1]}\">"; } else { $r_type = $this->thumbnailer->ini['General']['redirect'] == 1 ? 1 : 2; if ($src_exists) { $prv_url = "ic2.php?r={$r_type}&t=1&id={$icdb->id}"; } else { $prv_url = "ic2.php?r={$r_type}&t=1&uri={$url_en}"; } $prv_url .= $this->img_dpr_query; if ($this->img_dpr === 1.5 || $this->img_dpr === 2.0) { $prv_onload = sprintf(' onload="autoAdjustImgSize(this, %f);"', $this->img_dpr); } else { $prv_onload = ''; } $img_str = "<img src=\"{$prv_url}\"{$prv_onload}>"; } $inline_preview_done = true; } else { $img_str = '[p2:既得画像(ランク:' . $icdb->rank . ')]'; } } // 自動スレタイメモ機能がONでスレタイが記録されていないときはDBを更新 if (!is_null($this->img_memo) && strpos($icdb->memo, $this->img_memo) === false) { $update = new ImageCache2_DataObject_Images(); if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { $update->memo = $this->img_memo . ' ' . $icdb->memo; } else { $update->memo = $this->img_memo; } $update->whereAddQuoted('uri', '=', $v['url']); } // expack.ic2.fav_auto_rank_override の設定とランク条件がOKなら // お気にスレ自動画像ランクを上書き更新 if ($rank !== null && self::isAutoFavRankOverride($icdb->rank, $rank)) { if ($update === null) { $update = new ImageCache2_DataObject_Images(); $update->whereAddQuoted('uri', '=', $v['url']); } $update->rank = $rank; } if ($update !== null) { $update->update(); } // 画像がキャッシュされていないとき // 自動スレタイメモ機能がONならクエリにUTF-8エンコードしたスレタイを含める } else { // 画像がブラックリストorエラーログにあるか確認 if (false !== ($errcode = $icdb->ic2_isError($v['url']))) { return "<s>[IC2:エラー({$errcode})]</s>"; } // インラインプレビューが有効で、サムネイル表示制限数以内なら if ($this->thumbnailer->ini['General']['inline'] == 1 && $inline_preview_flag) { $rank_str = $rank !== null ? '&rank=' . $rank : ''; $img_str = "<img src=\"ic2.php?r=2&t=1&uri={$url_en}{$this->img_memo_query}{$rank_str}{$ref_en}\">"; $inline_preview_done = true; } else { $img_url .= $this->img_memo_query; } } // 表示数制限をデクリメント if ($inline_preview_flag && $inline_preview_done) { $pre_thumb_limit_k--; } if (!empty($_SERVER['REQUEST_URI'])) { $backto = '&from=' . rawurlencode($_SERVER['REQUEST_URI']); } else { $backto = ''; } if (is_null($img_str)) { $result .= sprintf('<a href="%s%s">[IC2:%s:%s]</a>', $img_url, $backto, p2h($purl['host']), p2h(basename($purl['path']))); } if ($_conf['iphone']) { $img_title = p2h($purl['host']) . ' ' . p2h(basename($purl['path'])); $result .= "<a class=\"limelight\" href=\"{$src_url}\" title=\"{$img_title}\" target=\"_blank\">{$img_str}</a>" . ' <input type="button" class="ic2-show-info" value="i" onclick="ic2info.show(' . ($img_id ? $img_id : "'{$v['url']}'") . ', event)">'; } else { $result .= "<a href=\"{$img_url}{$backto}\">{$img_str}</a>"; } } $linkUrlResult = $this->plugin_linkURL($url, $purl, $str); if ($linkUrlResult !== false) { $result .= $linkUrlResult; } return $result; }
/** * イメージキャッシュのURLと画像サイズを返す (ImageCache2) */ function rss_get_image_ic2($src_url, $memo = '') { static $thumbnailer = null; static $thumbnailer_k = null; if (is_null($thumbnailer)) { $thumbnailer = new ImageCache2_Thumbnailer(ImageCache2_Thumbnailer::SIZE_PC); $thumbnailer_k = new ImageCache2_Thumbnailer(ImageCache2_Thumbnailer::SIZE_MOBILE); } $icdb = new ImageCache2_DataObject_Images(); if ($thumbnailer->ini['General']['automemo'] && $memo !== '') { $img_memo = $icdb->uniform($memo, 'CP932'); if ($memo !== '') { $img_memo_query = '&' . $_conf['detect_hint_q_utf8']; $img_memo_query .= '&memo=' . rawurlencode($img_memo); } else { $img_memo = null; $img_memo_query = ''; } } else { $img_memo = null; $img_memo_query = ''; } $url_en = rawurlencode($src_url); // 画像表示方法 // r=0:HTML;r=1:リダイレクト;r=2:PHPで表示 // インライン表示用サムネイルはオリジナルがキャッシュされているとURLが短くなるのでr=2 // 携帯用サムネイル(全画面表示が目的)はインライン表示しないのでr=0 // サムネイルの大きさ // t=0:オリジナル;t=1:PC用サムネイル;t=2:携帯用サムネイル;t=3:中間イメージ $img_url = 'ic2.php?r=1&uri=' . $url_en; $img_size = ''; $thumb_url = 'ic2.php?r=2&t=1&uri=' . $url_en; $thumb_url2 = 'ic2.php?r=2&t=1&id='; $thumb_size = ''; $thumb_k_url = 'ic2.php?r=0&t=2&uri=' . $url_en; $thumb_k_url2 = 'ic2.php?r=0&t=1&id='; $thumb_k_size = ''; $src_exists = false; // DBに画像情報が登録されていたとき if ($icdb->get($src_url)) { // ウィルスに感染していたファイルのとき if ($icdb->mime == 'clamscan/infected') { $aborn_img = array('./img/x04.png', 'width="32" height="32"'); return array($aborn_img, $aborn_img, $aborn_img, P2_IMAGECACHE_ABORN); } // あぼーん画像のとき if ($icdb->rank < 0) { $virus_img = array('./img/x01.png', 'width="32" height="32"'); return array($virus_img, $virus_img, $virus_img, P2_IMAGECACHE_VIRUS); } // オリジナルがキャッシュされているときは画像を直接読み込む $_img_path = $thumbnailer->srcPath($icdb->size, $icdb->md5, $icdb->mime); if (file_exists($_img_path)) { $img_url = $thumbnailer->srcUrl($icdb->size, $icdb->md5, $icdb->mime); $img_size = "width=\"{$icdb->width}\" height=\"{$icdb->height}\""; $src_exists = true; } // サムネイルが作成されていているときは画像を直接読み込む $_thumb_path = $thumbnailer->thumbPath($icdb->size, $icdb->md5, $icdb->mime); if (file_exists($_thumb_path)) { $thumb_url = $thumbnailer->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); // 自動タイトルメモ機能がONでタイトルが記録されていないときはDBを更新 if (!is_null($img_memo) && strpos($icdb->memo, $img_memo) === false) { $update = new ImageCache2_DataObject_Images(); if (!is_null($icdb->memo) && strlen($icdb->memo) > 0) { $update->memo = $img_memo . ' ' . $icdb->memo; } else { $update->memo = $img_memo; } $update->whereAddQuoted('uri', '=', $src_url); $update->update(); } } elseif ($src_exists) { $thumb_url = $thumb_url2 . $icdb->id; } // 携帯用サムネイルが作成されていているときは画像を直接読み込む $_thumb_k_path = $thumbnailer_k->thumbPath($icdb->size, $icdb->md5, $icdb->mime); if (file_exists($_thumb_k_path)) { $thumb_k_url = $thumbnailer_k->thumbUrl($icdb->size, $icdb->md5, $icdb->mime); } elseif ($src_exists) { $thumb_k_url = $thumb_k_url2 . $icdb->id; } // サムネイルの画像サイズ $thumb_size = $thumbnailer->calc($icdb->width, $icdb->height); $thumb_size = preg_replace('/(\\d+)x(\\d+)/', 'width="$1" height="$2"', $thumb_size); // 携帯用サムネイルの画像サイズ $thumb_k_size = $thumbnailer_k->calc($icdb->width, $icdb->height); $thumb_k_size = preg_replace('/(\\d+)x(\\d+)/', 'width="$1" height="$2"', $thumb_k_size); // 画像がキャッシュされていないとき // 自動タイトルメモ機能がONならクエリにUTF-8エンコードしたタイトルを含める } else { $img_url .= $img_memo_query; $thumb_url .= $img_memo_query; $thumb_k_url .= $img_memo_query; } $result = array(); $result[] = array($img_url, $img_size); $result[] = array($thumb_url, $thumb_size); $result[] = array($thumb_k_url, $thumb_k_size); $result[] = P2_IMAGECACHE_OK; return $result; }
} // ライブラリ読み込み require_once P2EX_LIB_DIR . '/ImageCache2/bootstrap.php'; // }}} // {{{ execute $finder = new ImageCache2_DataObject_Images(); $finder->whereAdd(sprintf('id = %d', $id)); $code = -1; if ($finder->find(1)) { if ($rank != -5) { $setter = new ImageCache2_DataObject_Images(); $setter->rank = $rank; $setter->whereAddQuoted('size', '=', $finder->size); $setter->whereAddQuoted('md5', '=', $finder->md5); $setter->whereAddQuoted('mime', '=', $finder->mime); if ($setter->update()) { $code = 1; } else { $code = 0; } } if ($remove) { $orig_info_msg_ht = P2Util::getInfoHtml(); $removed_files = ImageCache2_DatabaseManager::remove(array($finder->id), $rank < 0); if ($code != 0 && !P2Util::hasInfoHtml()) { $code = 1; } else { $code = 0; } P2Util::pushInfoHtml($orig_info_msg_ht); }