From b5ffa8cb479131f68139ec40313fa22a3c08240d Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Fri, 7 Oct 2016 19:50:59 +0200 Subject: Auto-refresh favicons Every 15 days. https://github.com/FreshRSS/FreshRSS/issues/1181 --- p/f.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'p/f.php') diff --git a/p/f.php b/p/f.php index 0f23921e3..6523cc759 100644 --- a/p/f.php +++ b/p/f.php @@ -15,6 +15,7 @@ $default_favicon = PUBLIC_PATH . '/themes/icons/default_favicon.ico'; function download_favicon($website, $dest) { global $favicons_dir, $default_favicon; + syslog(LOG_DEBUG, 'FreshRSS Favicon discovery GET ' . $website); $favicon_getter = new \Favicon\Favicon(); $favicon_getter->setCacheDir($favicons_dir); $favicon_url = $favicon_getter->get($website); @@ -23,6 +24,7 @@ function download_favicon($website, $dest) { return @copy($default_favicon, $dest); } + syslog(LOG_DEBUG, 'FreshRSS Favicon GET ' . $favicon_url); $c = curl_init($favicon_url); curl_setopt($c, CURLOPT_HEADER, false); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); @@ -69,18 +71,22 @@ $txt_mtime = @filemtime($txt); header('Content-Type: image/x-icon'); -if ($ico_mtime == false || $txt_mtime > $ico_mtime) { +if ($ico_mtime == false || $txt_mtime > $ico_mtime || ($ico_mtime < time() - 15 * 86400)) { if ($txt_mtime == false) { show_default_favicon(1800); - return; + exit(); } // no ico file or we should download a new one. $url = file_get_contents($txt); if (!download_favicon($url, $ico)) { - // Download failed, show the default favicon - show_default_favicon(86400); - return; + // Download failed + if ($ico_mtime == false) { + show_default_favicon(86400); + exit(); + } else { + touch($ico); + } } } -- cgit v1.2.3 From c64918f839febe483fdfe91901f7874699f0eca6 Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Wed, 12 Oct 2016 09:49:38 +0200 Subject: Randomize favicon refresh https://github.com/FreshRSS/FreshRSS/issues/1298 --- p/f.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'p/f.php') diff --git a/p/f.php b/p/f.php index 6523cc759..df3e4b5f3 100644 --- a/p/f.php +++ b/p/f.php @@ -71,7 +71,7 @@ $txt_mtime = @filemtime($txt); header('Content-Type: image/x-icon'); -if ($ico_mtime == false || $txt_mtime > $ico_mtime || ($ico_mtime < time() - 15 * 86400)) { +if ($ico_mtime == false || $txt_mtime > $ico_mtime || ($ico_mtime < time() - (rand(15, 20) * 86400))) { if ($txt_mtime == false) { show_default_favicon(1800); exit(); @@ -92,6 +92,6 @@ if ($ico_mtime == false || $txt_mtime > $ico_mtime || ($ico_mtime < time() - 15 header('Content-Disposition: inline; filename="' . $id . '.ico"'); -if (!httpConditional($ico_mtime, 2592000, 2)) { +if (!httpConditional($ico_mtime, rand(14, 21) * 86400, 2)) { readfile($ico); } -- cgit v1.2.3 From e8d1a6dcc9c6aeb5204a8afc47aaae3c6bdd9dc4 Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Wed, 12 Oct 2016 15:47:04 +0200 Subject: Cron refresh favicons Related to https://github.com/FreshRSS/FreshRSS/issues/1181 https://github.com/FreshRSS/FreshRSS/issues/1298 --- app/Models/Context.php | 2 ++ app/Models/Feed.php | 24 ++++++++++++++++++------ app/actualize_script.php | 1 + lib/favicons.php | 40 ++++++++++++++++++++++++++++++++++++++++ p/f.php | 46 ++-------------------------------------------- 5 files changed, 63 insertions(+), 50 deletions(-) create mode 100644 lib/favicons.php (limited to 'p/f.php') diff --git a/app/Models/Context.php b/app/Models/Context.php index a38b1e0f1..889ddab1e 100644 --- a/app/Models/Context.php +++ b/app/Models/Context.php @@ -37,6 +37,8 @@ class FreshRSS_Context { public static $id_max = ''; public static $sinceHours = 0; + public static $isCron = false; + /** * Initialize the context. * diff --git a/app/Models/Feed.php b/app/Models/Feed.php index 21c1ef93d..b78f5f064 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -131,13 +131,25 @@ class FreshRSS_Feed extends Minz_Model { return $this->nbNotRead; } public function faviconPrepare() { - $file = DATA_PATH . '/favicons/' . $this->hash() . '.txt'; - if (!file_exists($file)) { - $t = $this->website; - if ($t == '') { - $t = $this->url; + require_once(LIB_PATH . '/favicons.php'); + $url = $this->website; + if ($url == '') { + $url = $this->url; + } + $txt = $favicons_dir . $this->hash() . '.txt'; + if (!file_exists($txt)) { + file_put_contents($txt, $url); + } + if (FreshRSS_Context::$isCron) { + $ico = $favicons_dir . $this->hash() . '.ico'; + $ico_mtime = @filemtime($ico); + $txt_mtime = @filemtime($txt); + if ($txt_mtime != false && + ($ico_mtime == false || $ico_mtime < $txt_mtime || ($ico_mtime < 14 * 86400))) { + // no ico file or we should download a new one. + $url = file_get_contents($txt); + download_favicon($url, $ico) || touch($ico); } - file_put_contents($file, $t); } } public static function faviconDelete($hash) { diff --git a/app/actualize_script.php b/app/actualize_script.php index fc4f9bfbb..78712d721 100755 --- a/app/actualize_script.php +++ b/app/actualize_script.php @@ -28,6 +28,7 @@ $app = new FreshRSS(); $system_conf = Minz_Configuration::get('system'); $system_conf->auth_type = 'none'; // avoid necessity to be logged in (not saved!) +FreshRSS_Context::$isCron = true; // Create the list of users to actualize. // Users are processed in a random order but always start with admin diff --git a/lib/favicons.php b/lib/favicons.php new file mode 100644 index 000000000..6709f6745 --- /dev/null +++ b/lib/favicons.php @@ -0,0 +1,40 @@ +setCacheDir($favicons_dir); + $favicon_url = $favicon_getter->get($website); + + if ($favicon_url === false) { + return @copy($default_favicon, $dest); + } + + syslog(LOG_DEBUG, 'FreshRSS Favicon GET ' . $favicon_url); + $c = curl_init($favicon_url); + curl_setopt($c, CURLOPT_HEADER, false); + curl_setopt($c, CURLOPT_RETURNTRANSFER, true); + curl_setopt($c, CURLOPT_BINARYTRANSFER, true); + $img_raw = curl_exec($c); + $status_code = curl_getinfo($c, CURLINFO_HTTP_CODE); + curl_close($c); + + if ($status_code === 200) { + $file = fopen($dest, 'w'); + if ($file !== false) { + fwrite($file, $img_raw); + fclose($file); + return true; + } + } + + return false; +} diff --git a/p/f.php b/p/f.php index df3e4b5f3..e4c82bb16 100644 --- a/p/f.php +++ b/p/f.php @@ -1,51 +1,9 @@ setCacheDir($favicons_dir); - $favicon_url = $favicon_getter->get($website); - - if ($favicon_url === false) { - return @copy($default_favicon, $dest); - } - - syslog(LOG_DEBUG, 'FreshRSS Favicon GET ' . $favicon_url); - $c = curl_init($favicon_url); - curl_setopt($c, CURLOPT_HEADER, false); - curl_setopt($c, CURLOPT_RETURNTRANSFER, true); - curl_setopt($c, CURLOPT_BINARYTRANSFER, true); - $img_raw = curl_exec($c); - $status_code = curl_getinfo($c, CURLINFO_HTTP_CODE); - curl_close($c); - - if ($status_code === 200) { - $file = fopen($dest, 'w'); - if ($file !== false) { - fwrite($file, $img_raw); - fclose($file); - return true; - } - } - - return false; -} - - function show_default_favicon($cacheSeconds = 3600) { global $default_favicon; @@ -71,7 +29,7 @@ $txt_mtime = @filemtime($txt); header('Content-Type: image/x-icon'); -if ($ico_mtime == false || $txt_mtime > $ico_mtime || ($ico_mtime < time() - (rand(15, 20) * 86400))) { +if ($ico_mtime == false || $ico_mtime < $txt_mtime || ($ico_mtime < time() - (rand(15, 20) * 86400))) { if ($txt_mtime == false) { show_default_favicon(1800); exit(); -- cgit v1.2.3