diff options
| author | 2013-12-02 18:23:57 +0100 | |
|---|---|---|
| committer | 2013-12-02 18:23:57 +0100 | |
| commit | 1a270309a53cca0124758b026512d781a595ec70 (patch) | |
| tree | d5a409b82a0fc43442f7a6c36af840eeb968015c | |
| parent | 97227a067ba055dd1652505ec8e4817105932d15 (diff) | |
Favicons : amélioration
* Évite de faire un accès disque systématique pour vérifier si le .ico
est présent, et ne le fait plus que lors d'un ajout ou rafraîchissement
de flux
* Corrige un bug pour les flux qui n'ont pas de site Web déclaré
* Efface le favicon lorsqu'un flux est supprimé (seulement
individuellement pour l'instant)
Voir aussi https://github.com/marienfressinaud/FreshRSS/issues/290
| -rwxr-xr-x | app/controllers/feedController.php | 8 | ||||
| -rw-r--r-- | app/models/Feed.php | 39 | ||||
| -rw-r--r-- | lib/lib_rss.php | 16 | ||||
| -rw-r--r-- | public/f.php | 5 |
4 files changed, 49 insertions, 19 deletions
diff --git a/app/controllers/feedController.php b/app/controllers/feedController.php index f84a952ed..e0c526655 100755 --- a/app/controllers/feedController.php +++ b/app/controllers/feedController.php @@ -86,6 +86,7 @@ class feedController extends ActionController { Session::_param ('notification', $notif); } else { $feed->_id ($id); + $feed->faviconPrepare(); $entryDAO = new EntryDAO (); $entries = $feed->entries (); @@ -192,6 +193,7 @@ class feedController extends ActionController { foreach ($feeds as $feed) { try { $feed->load (); + $feed->faviconPrepare(); $entries = $feed->entries (); usort($entries, 'self::entryDateComparer'); @@ -313,7 +315,9 @@ class feedController extends ActionController { // ajout du flux que s'il n'est pas déjà en BDD if (!$feedDAO->searchByUrl ($values['url'])) { - if (!$feedDAO->addFeed ($values)) { + if ($feedDAO->addFeed ($values)) { + $feed->faviconPrepare(); + } else { $error = true; } } @@ -354,6 +358,7 @@ class feedController extends ActionController { 'type' => 'good', 'content' => Translate::t ('category_emptied') ); + //TODO: Delete old favicons } else { $notif = array ( 'type' => 'bad', @@ -366,6 +371,7 @@ class feedController extends ActionController { 'type' => 'good', 'content' => Translate::t ('feed_deleted') ); + Feed::faviconDelete($id); } else { $notif = array ( 'type' => 'bad', diff --git a/app/models/Feed.php b/app/models/Feed.php index 41eb3df23..14366c5b3 100644 --- a/app/models/Feed.php +++ b/app/models/Feed.php @@ -95,32 +95,36 @@ class Feed extends Model { return $this->nbNotRead; } - public function favicon () { + public function faviconPrepare() { $file = DATA_PATH . '/favicons/' . $this->id () . '.txt'; if (!file_exists ($file)) { - file_put_contents($file, $this->website ()); + $t = $this->website; + if (empty($t)) { + $t = $this->url; + } + file_put_contents($file, $t); } + } + public static function faviconDelete($id) { + $path = DATA_PATH . '/favicons/' . $id; + @unlink($path . '.ico'); + @unlink($path . '.txt'); + } + public function favicon () { return Url::display ('/f.php?' . $this->id ()); } public function _id ($value) { $this->id = $value; } - public function _url ($value) { - if (empty ($value)) { - throw new BadUrlException ($value); - } - if (!preg_match ('#^https?://#i', $value)) { - $value = 'http://' . $value; + public function _url ($value, $validate=true) { + if ($validate) { + $value = checkUrl($value); } - - if (filter_var ($value, FILTER_VALIDATE_URL)) { - $this->url = $value; - } elseif (version_compare(PHP_VERSION, '5.3.3', '<') && (strpos($value, '-') > 0) && ($value === filter_var($value, FILTER_SANITIZE_URL))) { //PHP bug #51192 - $this->url = $value; - } else { + if (empty ($value)) { throw new BadUrlException ($value); } + $this->url = $value; } public function _category ($value) { $this->category = $value; @@ -131,8 +135,11 @@ class Feed extends Model { } $this->name = $value; } - public function _website ($value) { - if (is_null ($value)) { + public function _website ($value, $validate=true) { + if ($validate) { + $value = checkUrl($value); + } + if (empty ($value)) { $value = ''; } $this->website = $value; diff --git a/lib/lib_rss.php b/lib/lib_rss.php index 9726cc92b..ea5a1ffd0 100644 --- a/lib/lib_rss.php +++ b/lib/lib_rss.php @@ -15,6 +15,22 @@ if (!function_exists('json_encode')) { } } +function checkUrl($url) { + if (empty ($url)) { + return ''; + } + if (!preg_match ('#^https?://#i', $value)) { + $url = 'http://' . $url; + } + if (filter_var($url, FILTER_VALIDATE_URL) || + (version_compare(PHP_VERSION, '5.3.3', '<') && (strpos($value, '-') > 0) && //PHP bug #51192 + ($value === filter_var($value, FILTER_SANITIZE_URL)))) { + return url; + } else { + return false; + } +} + // vérifie qu'on est connecté function is_logged () { return Session::param ('mail') != false; diff --git a/public/f.php b/public/f.php index 48b59e1f9..85e73113a 100644 --- a/public/f.php +++ b/public/f.php @@ -2,7 +2,7 @@ require('../constants.php'); $favicons_dir = DATA_PATH . '/favicons/'; -/* Télécharge le favicon d'un site, le place sur le serveur et retourne l'URL */ +/* Télécharge le favicon d'un site et le place sur le serveur */ function download_favicon ($website, $dest) { $ok = false; $url = 'http://g.etfv.co/' . $website; @@ -60,10 +60,11 @@ if (($icoMTime == false) || ($txtMTime > $icoMTime)) { } } +require(LIB_PATH . '/http-conditional.php'); + header('Content-Type: image/x-icon'); header('Content-Disposition: inline; filename="' . $id . '.ico"'); -require(LIB_PATH . '/http-conditional.php'); if (!httpConditional($icoMTime, 31557600, 2)) { readfile($ico); } |
