Преглед изворни кода

Favicons en parallèle

Nouvelle méthode pour afficher les favicons à la demande et en
parallèle.
Déplacement du dossier des favicons sous /data/favicons/
Devrait permettre de fermer le problème d'import OPML
https://github.com/marienfressinaud/FreshRSS/issues/228
Voir aussi https://github.com/marienfressinaud/FreshRSS/issues/290
Alexandre Alapetite пре 12 година
родитељ
комит
b0cbc6fe5d
5 измењених фајлова са 73 додато и 43 уклоњено
  1. 4 7
      app/models/Feed.php
  2. 2 0
      data/favicons/.gitignore
  3. 0 35
      lib/lib_rss.php
  4. 67 0
      public/f.php
  5. 0 1
      public/favicons/.gitignore

+ 4 - 7
app/models/Feed.php

@@ -96,14 +96,11 @@ class Feed extends Model {
 		return $this->nbNotRead;
 	}
 	public function favicon () {
-		$file = '/favicons/' . $this->id () . '.ico';
-
-		$favicon_url = Url::display ($file);
-		if (!file_exists (PUBLIC_PATH . $file)) {
-			download_favicon ($this->website (), $this->id ());
+		$file = DATA_PATH . '/favicons/' . $this->id () . '.txt';
+		if (!file_exists ($file)) {
+			file_put_contents($file, $this->website ());
 		}
-
-		return $favicon_url;
+		return Url::display ('/f.php?' . $this->id ());
 	}
 
 	public function _id ($value) {

+ 2 - 0
data/favicons/.gitignore

@@ -0,0 +1,2 @@
+*.ico
+*.txt

+ 0 - 35
lib/lib_rss.php

@@ -198,41 +198,6 @@ function get_content_by_parsing ($url, $path) {
 	}
 }
 
-/* Télécharge le favicon d'un site, le place sur le serveur et retourne l'URL */
-function download_favicon ($website, $id) {
-	$url = 'http://g.etfv.co/' . $website;
-	$favicons_dir = PUBLIC_PATH . '/favicons';
-	$dest = $favicons_dir . '/' . $id . '.ico';
-
-	if (!is_dir ($favicons_dir)) {
-		if (!mkdir ($favicons_dir, 0755, true)) {
-			return $url;
-		}
-	}
-
-	if (!file_exists ($dest)) {
-		$c = curl_init ($url);
-		curl_setopt ($c, CURLOPT_HEADER, false);
-		curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
-		curl_setopt ($c, CURLOPT_BINARYTRANSFER, true);
-		$imgRaw = curl_exec ($c);
-
-		if (curl_getinfo ($c, CURLINFO_HTTP_CODE) == 200) {
-			$file = fopen ($dest, 'w');
-			if ($file === false) {
-				return $url;
-			}
-
-			fwrite ($file, $imgRaw);
-			fclose ($file);
-		} else {
-			return $url;
-		}
-
-		curl_close ($c);
-	}
-}
-
 /**
  * Add support of image lazy loading
  * Move content from src attribute to data-original

+ 67 - 0
public/f.php

@@ -0,0 +1,67 @@
+<?php
+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 */
+function download_favicon ($website, $dest) {
+	$ok = false;
+	$url = 'http://g.etfv.co/' . $website;
+
+	/*if (!is_dir ($favicons_dir)) {
+		if (!mkdir ($favicons_dir, 0755, true)) {
+			header('Location: ' . $url);
+			return false;
+		}
+	}*/
+
+	$c = curl_init ($url);
+	curl_setopt ($c, CURLOPT_HEADER, false);
+	curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
+	curl_setopt ($c, CURLOPT_BINARYTRANSFER, true);
+	$imgRaw = curl_exec ($c);
+
+	if (curl_getinfo ($c, CURLINFO_HTTP_CODE) == 200) {
+		$file = fopen ($dest, 'w');
+		if ($file !== false) {
+			fwrite ($file, $imgRaw);
+			fclose ($file);
+			$ok = true;
+		}
+	}
+	curl_close ($c);
+	if (!$ok) {
+		header('Location: ' . $url);
+		return false;
+	}
+	return true;
+}
+
+$id = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '0';
+if (!ctype_digit($id)) {
+	$id = '0';
+}
+
+$txt = $favicons_dir . $id . '.txt';
+$ico = $favicons_dir . $id . '.ico';
+
+$icoMTime = @filemtime($ico);
+$txtMTime = @filemtime($txt);
+
+if (($icoMTime == false) || ($txtMTime > $icoMTime)) {
+	if ($txtMTime == false) {
+		header('HTTP/1.1 404 Not Found');
+		die();
+	}
+	$url = file_get_contents($txt);
+	if (!download_favicon($url, $ico)) {
+		die();
+	}
+}
+
+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);
+}

+ 0 - 1
public/favicons/.gitignore

@@ -1 +0,0 @@
-*.ico