diff options
author | Andrew Dolgov <[email protected]> | 2011-12-26 13:11:08 +0400 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2011-12-26 13:11:08 +0400 |
commit | 3c696512fcf85331158f26078616e5684f46a68e (patch) | |
tree | 1884f68866d25cc738e631f8a2bfdc38c06f607f | |
parent | 7a5d9b95c4298660c282dc8879d057e6269d2521 (diff) |
universal image caching and automatic cache directories maintenance
-rw-r--r-- | cache/images/.empty | 0 | ||||
-rw-r--r-- | classes/feeds.php | 7 | ||||
-rw-r--r-- | classes/pref_feeds.php | 29 | ||||
-rw-r--r-- | config.php-dist | 6 | ||||
-rw-r--r-- | image.php | 12 | ||||
-rw-r--r-- | include/rssfuncs.php | 81 | ||||
-rw-r--r-- | mobile/image.php | 19 |
7 files changed, 110 insertions, 44 deletions
diff --git a/cache/images/.empty b/cache/images/.empty new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/cache/images/.empty diff --git a/classes/feeds.php b/classes/feeds.php index 6b498ac00..f9f82cd16 100644 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -184,9 +184,10 @@ class Feeds extends Protected_Handler { catchupArticlesById($this->link, $ids, $cmode);
} */
- //if ($method == "ForceUpdate" && $feed && is_numeric($feed) > 0) {
- // update_rss_feed($this->link, $feed, true);
- //}
+ if ($method == "ForceUpdate" && $feed && is_numeric($feed) > 0) {
+ include "rssfuncs.php";
+ update_rss_feed($this->link, $feed, true);
+ }
if ($method == "MarkAllRead") {
catchup_feed($this->link, $feed, $cat_view);
diff --git a/classes/pref_feeds.php b/classes/pref_feeds.php index b83abd789..5937bfc8a 100644 --- a/classes/pref_feeds.php +++ b/classes/pref_feeds.php @@ -448,12 +448,10 @@ class Pref_Feeds extends Protected_Handler { $checked = ""; } - if (SIMPLEPIE_CACHE_IMAGES) { - print "<hr/><input dojoType=\"dijit.form.CheckBox\" type=\"checkbox\" id=\"cache_images\" - name=\"cache_images\" + print "<hr/><input dojoType=\"dijit.form.CheckBox\" type=\"checkbox\" id=\"cache_images\" + name=\"cache_images\" $checked> <label for=\"cache_images\">". - __('Cache images locally (SimplePie only)')."</label>"; - } + __('Cache images locally')."</label>"; $mark_unread_on_update = sql_bool_to_bool(db_fetch_result($result, 0, "mark_unread_on_update")); @@ -655,16 +653,13 @@ class Pref_Feeds extends Protected_Handler { print " "; $this->batch_edit_cbox("always_display_enclosures", "always_display_enclosures_l"); - if (SIMPLEPIE_CACHE_IMAGES) { - print "<br/><input disabled=\"1\" type=\"checkbox\" id=\"cache_images\" - name=\"cache_images\" - dojoType=\"dijit.form.CheckBox\"> <label class='insensitive' id=\"cache_images_l\" - for=\"cache_images\">". - __('Cache images locally')."</label>"; + print "<br/><input disabled=\"1\" type=\"checkbox\" id=\"cache_images\" + name=\"cache_images\" + dojoType=\"dijit.form.CheckBox\"> <label class='insensitive' id=\"cache_images_l\" + for=\"cache_images\">". + __('Cache images locally')."</label>"; - - print " "; $this->batch_edit_cbox("cache_images", "cache_images_l"); - } + print " "; $this->batch_edit_cbox("cache_images", "cache_images_l"); print "<br/><input disabled=\"1\" type=\"checkbox\" id=\"mark_unread_on_update\" name=\"mark_unread_on_update\" @@ -741,11 +736,7 @@ class Pref_Feeds extends Protected_Handler { $category_qpart_nocomma = ""; } - if (SIMPLEPIE_CACHE_IMAGES) { - $cache_images_qpart = "cache_images = $cache_images,"; - } else { - $cache_images_qpart = ""; - } + $cache_images_qpart = "cache_images = $cache_images,"; if (!$batch) { diff --git a/config.php-dist b/config.php-dist index 6aaf32476..76d0ecab8 100644 --- a/config.php-dist +++ b/config.php-dist @@ -55,12 +55,6 @@ // *** Feed settings *** // ********************* - define('SIMPLEPIE_CACHE_IMAGES', false); - // Allow caching feed images when using SimplePie, to bypass hotlink - // prevention and such at expense of local disk space and bandwidth. - // Note that you (or your users) also have to enable image caching - // in feed editor. - define('DEFAULT_UPDATE_METHOD', 0); // Which feed parsing library to use as default: // 0 - Magpie @@ -1,9 +1,15 @@ <?php - set_include_path(get_include_path() . PATH_SEPARATOR . + set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . "/include"); require_once "config.php"; - require_once "lib/simplepie/simplepie.inc"; - SimplePie_Misc::display_cached_file($_GET['i'], SIMPLEPIE_CACHE_DIR, 'spi'); + $filename = CACHE_DIR . '/images/' . sha1($_GET['url']) . '.png'; + + if (file_exists($filename)) { + header("Content-type: image/png"); + echo file_get_contents($filename); + } else { + header("Location: " . $_GET['url']); + } ?> diff --git a/include/rssfuncs.php b/include/rssfuncs.php index 0fc462c48..821d6b175 100644 --- a/include/rssfuncs.php +++ b/include/rssfuncs.php @@ -136,6 +136,8 @@ WHERE id IN (%s)", implode(',', $feed_ids))); } + expire_cached_files($debug); + // For each feed, we call the feed update function. while ($line = array_pop($feeds_to_update)) { @@ -364,15 +366,6 @@ $rss->set_output_encoding('UTF-8'); $rss->force_feed(true); - if (SIMPLEPIE_CACHE_IMAGES && $cache_images) { - - if ($debug_enabled) { - _debug("enabling image cache"); - } - - $rss->set_image_handler("image.php", 'i'); - } - if ($debug_enabled) { _debug("feed update interval (sec): " . get_feed_update_interval($link, $feed)*60); @@ -685,9 +678,13 @@ } } + if ($cache_images) + $entry_content = cache_images($entry_content, $site_url, $debug_enabled); + if ($_REQUEST["xdebug"] == 2) { print "update_rss_feed: content: "; print_r(htmlspecialchars($entry_content)); + print "\n"; } $entry_content_unescaped = $entry_content; @@ -735,7 +732,7 @@ $entry_content = db_escape_string($entry_content, false); - $content_hash = "SHA1:" . sha1(strip_tags($entry_content)); + $content_hash = "SHA1:x" . sha1(strip_tags($entry_content)); $entry_title = db_escape_string($entry_title); $entry_link = db_escape_string($entry_link); @@ -1311,7 +1308,71 @@ } + function cache_images($html, $site_url, $debug) { + $cache_dir = CACHE_DIR . "/images"; + + libxml_use_internal_errors(true); + + $charset_hack = '<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> + </head>'; + + $doc = new DOMDocument(); + $doc->loadHTML($charset_hack . $html); + $xpath = new DOMXPath($doc); + + $entries = $xpath->query('(//img[@src])'); + + foreach ($entries as $entry) { + if ($entry->hasAttribute('src')) { + $src = rewrite_relative_url($site_url, $entry->getAttribute('src')); + + $local_filename = CACHE_DIR . "/images/" . sha1($src) . ".png"; + + if ($debug) _debug("cache_images: downloading: $src to $local_filename"); + + if (!file_exists($local_filename)) { + $file_content = fetch_file_contents($src); + + if ($file_content) { + file_put_contents($local_filename, $file_content); + } + } + + if (file_exists($local_filename)) { + $entry->setAttribute('src', SELF_URL_PATH . '/image.php?url=' . + htmlspecialchars($src)); + } + } + } + + $node = $doc->getElementsByTagName('body')->item(0); + + return $doc->saveXML($node); + } + + function expire_cached_files($debug) { + foreach (array("magpie", "simplepie", "images") as $dir) { + $cache_dir = CACHE_DIR . "/$dir"; + if ($debug) _debug("Expiring $cache_dir"); + $num_deleted = 0; + + if (is_writable($cache_dir)) { + $files = glob("$cache_dir/*"); + + foreach ($files as $file) { + if (time() - filemtime($file) > 86400*7) { + unlink($file); + + ++$num_deleted; + } + } + } + + if ($debug) _debug("Removed $num_deleted files."); + } + } ?> diff --git a/mobile/image.php b/mobile/image.php index 1fb8368b2..eec72947f 100644 --- a/mobile/image.php +++ b/mobile/image.php @@ -1,6 +1,19 @@ <?php - require_once "../config.php"; - require_once "../lib/simplepie/simplepie.inc"; + set_include_path(get_include_path() . PATH_SEPARATOR . + dirname(__FILE__) . PATH_SEPARATOR . + dirname(dirname(__FILE__)) . PATH_SEPARATOR . + dirname(dirname(__FILE__)) . "/include" ); - SimplePie_Misc::display_cached_file($_GET['i'], '../'.SIMPLEPIE_CACHE_DIR, 'spi'); + require_once "config.php"; + + chdir('..'); + + $filename = CACHE_DIR . '/images/' . sha1($_GET['url']) . '.png'; + + if (file_exists($filename)) { + header("Content-type: image/png"); + echo file_get_contents($filename); + } else { + header("Location: " . $_GET['url']); + } ?> |