Browse Source

* move get_article_image to Article; implement better og:image detection (similar to android app)
* pass article image to API clients in headlines row object

Andrew Dolgov 1 year ago
parent
commit
68e2b05f65
3 changed files with 47 additions and 33 deletions
  1. 5 3
      classes/api.php
  2. 40 0
      classes/article.php
  3. 2 30
      classes/handler/public.php

+ 5 - 3
classes/api.php

@@ -759,9 +759,10 @@ class API extends Handler {
 						"tags" => $tags,
 					);
 
+					$enclosures = Article::get_article_enclosures($line['id']);
+
 					if ($include_attachments)
-						$headline_row['attachments'] = Article::get_article_enclosures(
-							$line['id']);
+						$headline_row['attachments'] = $enclosures;
 
 					if ($show_excerpt)
 						$headline_row["excerpt"] = $line["content_preview"];
@@ -801,7 +802,8 @@ class API extends Handler {
 						$headline_row = $p->hook_render_article_api(array("headline" => $headline_row));
 					}
 
-					$headline_row['content'] = DiskCache::rewriteUrls($headline_row['content']);
+					$headline_row["content"] = DiskCache::rewriteUrls($headline_row['content']);
+					$headline_row["flavor_image"] = Article::get_article_image($enclosures, $line["content"], $line["site_url"]);
 
 					array_push($headlines, $headline_row);
 				}

+ 40 - 0
classes/article.php

@@ -823,4 +823,44 @@ class Article extends Handler_Protected {
 		return true;
 	}
 
+	static function get_article_image($enclosures, $content, $site_url) {
+
+		$article_image = false;
+		$tmpdoc = new DOMDocument();
+
+		if (@$tmpdoc->loadHTML('<?xml encoding="UTF-8">' . mb_substr($content, 0, 131070))) {
+			$tmpxpath = new DOMXPath($tmpdoc);
+			$elems = $tmpxpath->query('(//img[@src]|//video[@poster]|//iframe[contains(@src , "youtube.com/embed/")])');
+
+			foreach ($elems as $e) {
+				if ($e->nodeName == "iframe") {
+					$matches = [];
+					if ($rrr = preg_match("/\/embed\/([\w-]+)/", $e->getAttribute("src"), $matches)) {
+						$article_image = "https://img.youtube.com/vi/" . $matches[1] . "/hqdefault.jpg";
+						break;
+					}
+				} else if ($e->nodeName == "video") {
+					$article_image = $e->getAttribute("poster");
+					break;
+				} else if ($e->nodeName == 'img') {
+					if (mb_strpos($e->getAttribute("src"), "data:") !== 0) {
+						$article_image = $e->getAttribute("src");
+					}
+					break;
+				}
+			}
+		}
+
+		if ($article_image)
+			return rewrite_relative_url($site_url, $article_image);
+
+		foreach ($enclosures as $enc) {
+			if (strpos($enc["content_type"], "image/") !== FALSE) {
+				return rewrite_relative_url($site_url, $enc["content_url"]);
+			}
+		}
+
+		return false;
+	}
+
 }

+ 2 - 30
classes/handler/public.php

@@ -157,7 +157,7 @@ class Handler_Public extends Handler {
 				}
 
 				$tpl->setVariable('ARTICLE_OG_IMAGE',
-                        $this->get_article_image($enclosures, $line['content'], $feed_site_url), true);
+                        Article::get_article_image($enclosures, $line['content'], $feed_site_url), true);
 
 				$tpl->addBlock('entry');
 			}
@@ -319,34 +319,6 @@ class Handler_Public extends Handler {
 		print "Article not found.";
 	}
 
-	private function get_article_image($enclosures, $content, $site_url) {
-	    $og_image = false;
-
-		foreach ($enclosures as $enc) {
-			if (strpos($enc["content_type"], "image/") !== FALSE) {
-				return rewrite_relative_url($site_url, $enc["content_url"]);
-			}
-		}
-
-		if (!$og_image) {
-			$tmpdoc = new DOMDocument();
-
-			if (@$tmpdoc->loadHTML('<?xml encoding="UTF-8">' . mb_substr($content, 0, 131070))) {
-				$tmpxpath = new DOMXPath($tmpdoc);
-				$imgs = $tmpxpath->query("//img");
-
-				foreach ($imgs as $img) {
-					$src = $img->getAttribute("src");
-
-					if (mb_strpos($src, "data:") !== 0)
-						return rewrite_relative_url($site_url, $src);
-				}
-			}
-		}
-
-		return false;
-    }
-
 	private function format_article($id, $owner_uid) {
 
 		$pdo = Db::pdo();
@@ -409,7 +381,7 @@ class Handler_Public extends Handler {
 
             $rv .= "</head>";
 
-            $og_image = $this->get_article_image($enclosures, $line['content'], $line["site_url"]);
+            $og_image = Article::get_article_image($enclosures, $line['content'], $line["site_url"]);
 
             if ($og_image) {
                 $rv .= "<meta property='og:image' content=\"" . htmlspecialchars($og_image) . "\"/>";