ソースを参照

image cache: do not try to cache data: schema urls; add caching of html5 video content (similar to cache_starred_images plugin)

Andrew Dolgov 7 年 前
コミット
5edd605ae1
3 ファイル変更23 行追加20 行削除
  1. 17 16
      include/functions2.php
  2. 4 3
      include/rssfuncs.php
  3. 2 1
      plugins/cache_starred_images/init.php

+ 17 - 16
include/functions2.php

@@ -888,7 +888,7 @@
 		$doc->loadHTML($charset_hack . $res);
 		$xpath = new DOMXPath($doc);
 
-		$entries = $xpath->query('(//a[@href]|//img[@src])');
+		$entries = $xpath->query('(//a[@href]|//img[@src]|//video/source[@src])');
 
 		$ttrss_uses_https = parse_url(get_self_url_prefix(), PHP_URL_SCHEME) === 'https';
 
@@ -903,28 +903,29 @@
 					$entry->setAttribute('rel', 'noopener noreferrer');
 				}
 
-				if ($entry->nodeName == 'img') {
-
-					if ($entry->hasAttribute('src')) {
-						$src = rewrite_relative_url($site_url, $entry->getAttribute('src'));
-
-						$cached_filename = CACHE_DIR . '/images/' . sha1($src) . '.png';
+				if ($entry->hasAttribute('src')) {
+					$src = rewrite_relative_url($site_url, $entry->getAttribute('src'));
 
-						if (file_exists($cached_filename)) {
-							$src = SELF_URL_PATH . '/public.php?op=cached_image&hash=' . sha1($src) . '.png';
+					$extension = $entry->tagName == 'source' ? '.mp4' : '.png';
+					$cached_filename = CACHE_DIR . '/images/' . sha1($src) . $extension;
 
-							if ($entry->hasAttribute('srcset')) {
-								$entry->removeAttribute('srcset');
-							}
+					if (file_exists($cached_filename)) {
+						$src = SELF_URL_PATH . '/public.php?op=cached_image&hash=' . sha1($src) . $extension;
 
-							if ($entry->hasAttribute('sizes')) {
-								$entry->removeAttribute('sizes');
-							}
+						if ($entry->hasAttribute('srcset')) {
+							$entry->removeAttribute('srcset');
 						}
 
-						$entry->setAttribute('src', $src);
+						if ($entry->hasAttribute('sizes')) {
+							$entry->removeAttribute('sizes');
+						}
 					}
 
+					$entry->setAttribute('src', $src);
+				}
+				
+				if ($entry->nodeName == 'img') {
+
 					if ($entry->hasAttribute('src')) {
 						$is_https_url = parse_url($entry->getAttribute('src'), PHP_URL_SCHEME) === 'https';
 

+ 4 - 3
include/rssfuncs.php

@@ -1239,13 +1239,14 @@
 		$doc->loadHTML($charset_hack . $html);
 		$xpath = new DOMXPath($doc);
 
-		$entries = $xpath->query('(//img[@src])');
+		$entries = $xpath->query('(//img[@src])|(//video/source[@src])');
 
 		foreach ($entries as $entry) {
-			if ($entry->hasAttribute('src')) {
+			if ($entry->hasAttribute('src') && strpos($entry->getAttribute('src'), "data:") !== 0) {
 				$src = rewrite_relative_url($site_url, $entry->getAttribute('src'));
 
-				$local_filename = CACHE_DIR . "/images/" . sha1($src) . ".png";
+				$extension = $entry->tagName == 'source' ? '.mp4' : '.png';
+				$local_filename = CACHE_DIR . "/images/" . sha1($src) . $extension;
 
 				if ($debug) _debug("cache_images: downloading: $src to $local_filename");
 

+ 2 - 1
plugins/cache_starred_images/init.php

@@ -180,7 +180,8 @@ class Cache_Starred_Images extends Plugin implements IHandler {
 
 		foreach ($entries as $entry) {
 
-			if ($entry->hasAttribute('src')) {
+			if ($entry->hasAttribute('src') && strpos($entry->getAttribute('src'), "data:") !== 0) {
+
 				$has_images = true;
 				$src = rewrite_relative_url($site_url, $entry->getAttribute('src'));