aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-12-02 18:23:57 +0100
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-12-02 18:23:57 +0100
commit1a270309a53cca0124758b026512d781a595ec70 (patch)
treed5a409b82a0fc43442f7a6c36af840eeb968015c
parent97227a067ba055dd1652505ec8e4817105932d15 (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-xapp/controllers/feedController.php8
-rw-r--r--app/models/Feed.php39
-rw-r--r--lib/lib_rss.php16
-rw-r--r--public/f.php5
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);
}