1
0
mirror of https://git.tt-rss.org/git/tt-rss.git synced 2026-01-02 08:19:16 +00:00

wip: flavor icon caching

This commit is contained in:
Andrew Dolgov
2021-03-15 22:29:03 +03:00
parent 1870fe172b
commit 77924a6286
12 changed files with 108 additions and 32 deletions

View File

@@ -1,5 +1,7 @@
<?php
class Article extends Handler_Protected {
const ARTICLE_KIND_UNKNOWN = -1;
const ARTICLE_KIND_IMAGE = 0; // default
const ARTICLE_KIND_ALBUM = 1;
const ARTICLE_KIND_VIDEO = 2;
const ARTICLE_KIND_YOUTUBE = 3;
@@ -543,22 +545,42 @@ class Article extends Handler_Protected {
return $rv;
}
static function _get_image(array $enclosures, string $content, string $site_url, array $headline) {
// TODO: when invoked without article_id (i.e. by rssutils) we can implement additional checks
// i.e. check for returned content-type and/or http status for checked images
static function _get_image(int $article_id, array $enclosures, string $content, string $site_url, array $headline) {
$article_image = "";
$article_stream = "";
$article_kind = 0;
$article_kind = Article::ARTICLE_KIND_UNKNOWN;
PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_ARTICLE_IMAGE,
function ($result, $plugin) use (&$article_image, &$article_stream, &$content) {
list ($article_image, $article_stream, $content) = $result;
if ($article_id) {
PluginHost::getInstance()->chain_hooks_callback(PluginHost::HOOK_ARTICLE_IMAGE,
function ($result, $plugin) use (&$article_image, &$article_stream, &$content) {
list ($article_image, $article_stream, $content) = $result;
// run until first hard match
return !empty($article_image);
},
$enclosures, $content, $site_url, $headline);
// run until first hard match
return !empty($article_image);
},
$enclosures, $content, $site_url, $headline);
}
if (!$article_image && !$article_stream) {
if ($article_id) {
$user_entry = ORM::for_table('ttrss_user_entries')
->where('ref_id', $article_id)
->find_one();
if (!$user_entry)
return [Article::ARTICLE_KIND_UNKNOWN, "", ""];
if ($user_entry->flavor_kind !== null) {
return [$user_entry->flavor_image, $user_entry->flavor_stream, $user_entry->flavor_kind];
}
} else {
$user_entry = null;
}
$tmpdoc = new DOMDocument();
if (@$tmpdoc->loadHTML('<?xml encoding="UTF-8">' . mb_substr($content, 0, 131070))) {
@@ -594,23 +616,35 @@ class Article extends Handler_Protected {
}
}
if (!$article_image)
if (!$article_image) {
foreach ($enclosures as $enc) {
if (strpos($enc["content_type"], "image/") !== false) {
$article_image = $enc["content_url"];
break;
}
}
}
if ($article_image) {
$article_image = rewrite_relative_url($site_url, $article_image);
if (!$article_kind && (count($enclosures) > 1 || (isset($elems) && $elems->length > 1)))
if ($article_kind == Article::ARTICLE_KIND_UNKNOWN && (count($enclosures) > 1 || (isset($elems) && $elems->length > 1)))
$article_kind = Article::ARTICLE_KIND_ALBUM;
}
if ($article_stream)
$article_stream = rewrite_relative_url($site_url, $article_stream);
if ($article_image && $article_kind == Article::ARTICLE_KIND_UNKNOWN)
$article_kind = Article::ARTICLE_KIND_IMAGE;
// use original URLs here, only save if invoked for article_id
if ($user_entry) {
$user_entry->flavor_image = $article_image ?? "";
$user_entry->flavor_stream = $article_stream ?? "";
$user_entry->flavor_kind = $article_kind;
$user_entry->save();
}
}
$cache = new DiskCache("images");