Explorar el Código

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
Alexandre Alapetite hace 12 años
padre
commit
1a270309a5
Se han modificado 4 ficheros con 49 adiciones y 19 borrados
  1. 7 1
      app/controllers/feedController.php
  2. 23 16
      app/models/Feed.php
  3. 16 0
      lib/lib_rss.php
  4. 3 2
      public/f.php

+ 7 - 1
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',

+ 23 - 16
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;

+ 16 - 0
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;

+ 3 - 2
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);
 }