From 4f1fc70f876f27a6a9dc09dcf8c0f016466ea8e9 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Mon, 29 Dec 2014 11:44:25 +0100 Subject: Change favicon getter behaviour - Use Favicon library - Fix coding style - Change default favicon Fix https://github.com/FreshRSS/FreshRSS/issues/290 --- p/f.php | 85 ++++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 53 insertions(+), 32 deletions(-) (limited to 'p/f.php') diff --git a/p/f.php b/p/f.php index 5db9ab213..f29de095d 100644 --- a/p/f.php +++ b/p/f.php @@ -1,36 +1,59 @@ setCacheDir($favicons_dir); + $favicon_url = $favicon_getter->get($website); + + if ($favicon_url === false) { + return false; } + + $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 (!$ok) { - header('Location: ' . $url); - return false; + + if ($status_code === 200) { + $file = fopen($dest, 'w'); + if ($file !== false) { + fwrite($file, $img_raw); + fclose($file); + return true; + } } - return true; + + return false; } -$id = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '0'; +function show_default_favicon() { + global $default_favicon; + + header('HTTP/1.1 404 Not Found'); + header('Content-Type: image/png'); + readfile($default_favicon); + die(); +} + + +$id = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '0'; if (!ctype_xdigit($id)) { $id = '0'; } @@ -38,19 +61,17 @@ if (!ctype_xdigit($id)) { $txt = $favicons_dir . $id . '.txt'; $ico = $favicons_dir . $id . '.ico'; -$icoMTime = @filemtime($ico); -$txtMTime = @filemtime($txt); +$ico_mtime = @filemtime($ico); +$txt_mtime = @filemtime($txt); -if (($icoMTime == false) || ($txtMTime > $icoMTime)) { - if ($txtMTime == false) { - header('HTTP/1.1 404 Not Found'); - header('Content-Type: image/gif'); - readfile(PUBLIC_PATH . '/themes/icons/grey.gif'); //TODO: Better 404 favicon - die(); +if (($ico_mtime == false) || ($txt_mtime > $ico_mtime)) { + if ($txt_mtime == false) { + show_default_favicon(); } + $url = file_get_contents($txt); if (!download_favicon($url, $ico)) { - die(); + show_default_favicon(); } } @@ -59,6 +80,6 @@ require(LIB_PATH . '/http-conditional.php'); header('Content-Type: image/x-icon'); header('Content-Disposition: inline; filename="' . $id . '.ico"'); -if (!httpConditional($icoMTime, 2592000, 2)) { +if (!httpConditional($ico_mtime, 2592000, 2)) { readfile($ico); } -- cgit v1.2.3 From ea7946658289ab768f0948c50d5aa553f6e826d1 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Mon, 29 Dec 2014 11:46:01 +0100 Subject: Fix typo coding style See https://github.com/FreshRSS/FreshRSS/issues/290 --- p/f.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'p/f.php') diff --git a/p/f.php b/p/f.php index f29de095d..d00b36eb0 100644 --- a/p/f.php +++ b/p/f.php @@ -28,7 +28,7 @@ function download_favicon($website, $dest) { curl_setopt($c, CURLOPT_BINARYTRANSFER, true); $img_raw = curl_exec($c); $status_code = curl_getinfo($c, CURLINFO_HTTP_CODE); - curl_close ($c); + curl_close($c); if ($status_code === 200) { $file = fopen($dest, 'w'); -- cgit v1.2.3 From 7584364a4c2b407e97909e94ba274da62620abea Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Mon, 29 Dec 2014 11:56:22 +0100 Subject: Fix behaviour when favicon url is not found If url is not find, we copy default favicon into favicon dir so at the next try, we don't search the url again. See https://github.com/FreshRSS/FreshRSS/issues/290 See https://github.com/FreshRSS/FreshRSS/issues/727 --- p/f.php | 8 ++++---- p/themes/icons/default_favicon.ico | Bin 0 -> 1150 bytes p/themes/icons/default_favicon.png | Bin 726 -> 0 bytes 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 p/themes/icons/default_favicon.ico delete mode 100644 p/themes/icons/default_favicon.png (limited to 'p/f.php') diff --git a/p/f.php b/p/f.php index d00b36eb0..fefbf9a10 100644 --- a/p/f.php +++ b/p/f.php @@ -7,19 +7,19 @@ include(LIB_PATH . '/Favicon/DataAccess.php'); $favicons_dir = DATA_PATH . '/favicons/'; -$default_favicon = PUBLIC_PATH . '/themes/icons/default_favicon.png'; +$default_favicon = PUBLIC_PATH . '/themes/icons/default_favicon.ico'; /* Télécharge le favicon d'un site et le place sur le serveur */ function download_favicon($website, $dest) { - global $favicons_dir; + global $favicons_dir, $default_favicon; $favicon_getter = new \Favicon\Favicon(); $favicon_getter->setCacheDir($favicons_dir); $favicon_url = $favicon_getter->get($website); if ($favicon_url === false) { - return false; + return @copy($default_favicon, $dest); } $c = curl_init($favicon_url); @@ -47,7 +47,7 @@ function show_default_favicon() { global $default_favicon; header('HTTP/1.1 404 Not Found'); - header('Content-Type: image/png'); + header('Content-Type: image/ico'); readfile($default_favicon); die(); } diff --git a/p/themes/icons/default_favicon.ico b/p/themes/icons/default_favicon.ico new file mode 100644 index 000000000..e4d5e8f67 Binary files /dev/null and b/p/themes/icons/default_favicon.ico differ diff --git a/p/themes/icons/default_favicon.png b/p/themes/icons/default_favicon.png deleted file mode 100644 index 1e660b740..000000000 Binary files a/p/themes/icons/default_favicon.png and /dev/null differ -- cgit v1.2.3 From da7d34d2ef45e4cfcf1410a279998f680a6338ea Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Mon, 26 Jan 2015 13:02:47 +0100 Subject: Default favicon served with HTTP code 200 Fix https://github.com/FreshRSS/FreshRSS/issues/760 --- p/f.php | 1 - 1 file changed, 1 deletion(-) (limited to 'p/f.php') diff --git a/p/f.php b/p/f.php index fefbf9a10..411f65081 100644 --- a/p/f.php +++ b/p/f.php @@ -46,7 +46,6 @@ function download_favicon($website, $dest) { function show_default_favicon() { global $default_favicon; - header('HTTP/1.1 404 Not Found'); header('Content-Type: image/ico'); readfile($default_favicon); die(); -- cgit v1.2.3 From f5043dbf719df913c7600be12528c0355b48fce7 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Mon, 26 Jan 2015 14:49:24 +0100 Subject: Serve HTTP cache for default favicon + better headers See https://github.com/FreshRSS/FreshRSS/commit/da7d34d2ef45e4cfcf1410a279998f680a6338ea#commitcomment-9439610 --- p/f.php | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'p/f.php') diff --git a/p/f.php b/p/f.php index 411f65081..c904e1fcb 100644 --- a/p/f.php +++ b/p/f.php @@ -4,6 +4,7 @@ require('../constants.php'); include(LIB_PATH . '/Favicon/Favicon.php'); include(LIB_PATH . '/Favicon/DataAccess.php'); +require(LIB_PATH . '/http-conditional.php'); $favicons_dir = DATA_PATH . '/favicons/'; @@ -46,9 +47,13 @@ function download_favicon($website, $dest) { function show_default_favicon() { global $default_favicon; - header('Content-Type: image/ico'); - readfile($default_favicon); - die(); + header('Content-Type: image/x-icon'); + header('Content-Disposition: inline; filename="default_favicon.ico"'); + + $default_mtime = @filemtime($default_favicon); + if (!httpConditional($default_mtime, 2592000, 2)) { + readfile($default_favicon); + } } @@ -63,19 +68,22 @@ $ico = $favicons_dir . $id . '.ico'; $ico_mtime = @filemtime($ico); $txt_mtime = @filemtime($txt); -if (($ico_mtime == false) || ($txt_mtime > $ico_mtime)) { + +if ($ico_mtime == false || $txt_mtime > $ico_mtime) { if ($txt_mtime == false) { show_default_favicon(); + return; } + // 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(); + return; } } -require(LIB_PATH . '/http-conditional.php'); - header('Content-Type: image/x-icon'); header('Content-Disposition: inline; filename="' . $id . '.ico"'); -- cgit v1.2.3 From 624824673592dbc21300f9a26c27781f54429de5 Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Sat, 23 Apr 2016 21:48:37 +0200 Subject: Adjust caching for favicon with errors --- p/f.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'p/f.php') diff --git a/p/f.php b/p/f.php index c904e1fcb..0f23921e3 100644 --- a/p/f.php +++ b/p/f.php @@ -44,14 +44,13 @@ function download_favicon($website, $dest) { } -function show_default_favicon() { +function show_default_favicon($cacheSeconds = 3600) { global $default_favicon; - header('Content-Type: image/x-icon'); header('Content-Disposition: inline; filename="default_favicon.ico"'); $default_mtime = @filemtime($default_favicon); - if (!httpConditional($default_mtime, 2592000, 2)) { + if (!httpConditional($default_mtime, $cacheSeconds, 2)) { readfile($default_favicon); } } @@ -68,10 +67,11 @@ $ico = $favicons_dir . $id . '.ico'; $ico_mtime = @filemtime($ico); $txt_mtime = @filemtime($txt); +header('Content-Type: image/x-icon'); if ($ico_mtime == false || $txt_mtime > $ico_mtime) { if ($txt_mtime == false) { - show_default_favicon(); + show_default_favicon(1800); return; } @@ -79,12 +79,11 @@ if ($ico_mtime == false || $txt_mtime > $ico_mtime) { $url = file_get_contents($txt); if (!download_favicon($url, $ico)) { // Download failed, show the default favicon - show_default_favicon(); + show_default_favicon(86400); return; } } -header('Content-Type: image/x-icon'); header('Content-Disposition: inline; filename="' . $id . '.ico"'); if (!httpConditional($ico_mtime, 2592000, 2)) { -- cgit v1.2.3 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 --- lib/Favicon/DataAccess.php | 2 +- p/f.php | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) (limited to 'p/f.php') diff --git a/lib/Favicon/DataAccess.php b/lib/Favicon/DataAccess.php index 17f26b333..ae7509881 100644 --- a/lib/Favicon/DataAccess.php +++ b/lib/Favicon/DataAccess.php @@ -16,7 +16,7 @@ class DataAccess { public function retrieveHeader($url) { $this->set_context(); $headers = @get_headers($url, 1); - return array_change_key_case($headers); + return $headers ? array_change_key_case($headers) : array(); } public function saveCache($file, $data) { 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