Merge pull request #1306 from Alkarex/cron-favicon

Cron refresh favicons
This commit is contained in:
Alexandre Alapetite
2016-10-12 21:37:01 +02:00
committed by GitHub
6 changed files with 65 additions and 50 deletions

View File

@@ -16,6 +16,7 @@
* Support custom ports `localhost:3306` for database servers [#1241](https://github.com/FreshRSS/FreshRSS/issues/1241)
* Add date to exported files [#1240](https://github.com/FreshRSS/FreshRSS/issues/1240)
* Auto-refresh favicons once or twice a month [#1181](https://github.com/FreshRSS/FreshRSS/issues/1181), [#1298](https://github.com/FreshRSS/FreshRSS/issues/1298)
* Cron updates will also refresh favicons every 2 weeks [#1306](https://github.com/FreshRSS/FreshRSS/pull/1306)
* Bug fixing
* Correction of bugs related CSRF tokens introduced in version 1.5.0 [#1253](https://github.com/FreshRSS/FreshRSS/issues/1253), [44f22ab](https://github.com/FreshRSS/FreshRSS/pull/1261/commits/d9bf9b2c6f0b2cc9dec3b638841b7e3040dcf46f)
* Fix bug in Global view introduced in version 1.5.0 [#1269](https://github.com/FreshRSS/FreshRSS/pull/1269)

View File

@@ -37,6 +37,8 @@ class FreshRSS_Context {
public static $id_max = '';
public static $sinceHours = 0;
public static $isCron = false;
/**
* Initialize the context.
*

View File

@@ -131,13 +131,26 @@ 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;
global $favicons_dir;
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 < time() - (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) {

View File

@@ -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

40
lib/favicons.php Normal file
View File

@@ -0,0 +1,40 @@
<?php
include(LIB_PATH . '/Favicon/Favicon.php');
include(LIB_PATH . '/Favicon/DataAccess.php');
$favicons_dir = DATA_PATH . '/favicons/';
$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);
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;
}

46
p/f.php
View File

@@ -1,51 +1,9 @@
<?php
require('../constants.php');
include(LIB_PATH . '/Favicon/Favicon.php');
include(LIB_PATH . '/Favicon/DataAccess.php');
require(LIB_PATH . '/favicons.php');
require(LIB_PATH . '/http-conditional.php');
$favicons_dir = DATA_PATH . '/favicons/';
$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, $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);
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();