aboutsummaryrefslogtreecommitdiff
path: root/app/Models/Feed.php
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-09-26 14:36:30 +0200
committerGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-09-26 14:36:30 +0200
commit147a3d21bbe78ae66c7134ac0c355472a92e1159 (patch)
tree7f8ca64ccc0939c8c9aef145a8fd86cc2e52640b /app/Models/Feed.php
parent7e949d50320317b5c3b5a2da2bdaf324e794b2f7 (diff)
parentc14162221365077bcaeecde7127806190490dd58 (diff)
Merge branch 'dev'
Diffstat (limited to 'app/Models/Feed.php')
-rw-r--r--app/Models/Feed.php217
1 files changed, 123 insertions, 94 deletions
diff --git a/app/Models/Feed.php b/app/Models/Feed.php
index 73f9c32fb..2a5ea45ac 100644
--- a/app/Models/Feed.php
+++ b/app/Models/Feed.php
@@ -16,17 +16,25 @@ class FreshRSS_Feed extends Minz_Model {
private $httpAuth = '';
private $error = false;
private $keep_history = -2;
+ private $ttl = -2;
private $hash = null;
+ private $lockPath = '';
- public function __construct ($url, $validate=true) {
+ public function __construct($url, $validate=true) {
if ($validate) {
- $this->_url ($url);
+ $this->_url($url);
} else {
$this->url = $url;
}
}
- public function id () {
+ public static function example() {
+ $f = new FreshRSS_Feed('http://example.net/', false);
+ $f->faviconPrepare();
+ return $f;
+ }
+
+ public function id() {
return $this->id;
}
@@ -37,74 +45,77 @@ class FreshRSS_Feed extends Minz_Model {
return $this->hash;
}
- public function url () {
+ public function url() {
return $this->url;
}
- public function category () {
+ public function category() {
return $this->category;
}
- public function entries () {
+ public function entries() {
return $this->entries === null ? array() : $this->entries;
}
- public function name () {
+ public function name() {
return $this->name;
}
- public function website () {
+ public function website() {
return $this->website;
}
- public function description () {
+ public function description() {
return $this->description;
}
- public function lastUpdate () {
+ public function lastUpdate() {
return $this->lastUpdate;
}
- public function priority () {
+ public function priority() {
return $this->priority;
}
- public function pathEntries () {
+ public function pathEntries() {
return $this->pathEntries;
}
- public function httpAuth ($raw = true) {
+ public function httpAuth($raw = true) {
if ($raw) {
return $this->httpAuth;
} else {
- $pos_colon = strpos ($this->httpAuth, ':');
- $user = substr ($this->httpAuth, 0, $pos_colon);
- $pass = substr ($this->httpAuth, $pos_colon + 1);
+ $pos_colon = strpos($this->httpAuth, ':');
+ $user = substr($this->httpAuth, 0, $pos_colon);
+ $pass = substr($this->httpAuth, $pos_colon + 1);
- return array (
+ return array(
'username' => $user,
'password' => $pass
);
}
}
- public function inError () {
+ public function inError() {
return $this->error;
}
- public function keepHistory () {
+ public function keepHistory() {
return $this->keep_history;
}
- public function nbEntries () {
+ public function ttl() {
+ return $this->ttl;
+ }
+ public function nbEntries() {
if ($this->nbEntries < 0) {
- $feedDAO = new FreshRSS_FeedDAO ();
- $this->nbEntries = $feedDAO->countEntries ($this->id ());
+ $feedDAO = FreshRSS_Factory::createFeedDao();
+ $this->nbEntries = $feedDAO->countEntries($this->id());
}
return $this->nbEntries;
}
- public function nbNotRead () {
+ public function nbNotRead() {
if ($this->nbNotRead < 0) {
- $feedDAO = new FreshRSS_FeedDAO ();
- $this->nbNotRead = $feedDAO->countNotRead ($this->id ());
+ $feedDAO = FreshRSS_Factory::createFeedDao();
+ $this->nbNotRead = $feedDAO->countNotRead($this->id());
}
return $this->nbNotRead;
}
public function faviconPrepare() {
$file = DATA_PATH . '/favicons/' . $this->hash() . '.txt';
- if (!file_exists ($file)) {
+ if (!file_exists($file)) {
$t = $this->website;
- if (empty($t)) {
+ if ($t == '') {
$t = $this->url;
}
file_put_contents($file, $t);
@@ -115,109 +126,123 @@ class FreshRSS_Feed extends Minz_Model {
@unlink($path . '.ico');
@unlink($path . '.txt');
}
- public function favicon () {
- return Minz_Url::display ('/f.php?' . $this->hash());
+ public function favicon() {
+ return Minz_Url::display('/f.php?' . $this->hash());
}
- public function _id ($value) {
+ public function _id($value) {
$this->id = $value;
}
- public function _url ($value, $validate=true) {
+ public function _url($value, $validate=true) {
+ $this->hash = null;
if ($validate) {
$value = checkUrl($value);
}
- if (empty ($value)) {
- throw new FreshRSS_BadUrl_Exception ($value);
+ if (empty($value)) {
+ throw new FreshRSS_BadUrl_Exception($value);
}
$this->url = $value;
}
- public function _category ($value) {
+ public function _category($value) {
$value = intval($value);
$this->category = $value >= 0 ? $value : 0;
}
- public function _name ($value) {
+ public function _name($value) {
$this->name = $value === null ? '' : $value;
}
- public function _website ($value, $validate=true) {
+ public function _website($value, $validate=true) {
if ($validate) {
$value = checkUrl($value);
}
- if (empty ($value)) {
+ if (empty($value)) {
$value = '';
}
$this->website = $value;
}
- public function _description ($value) {
+ public function _description($value) {
$this->description = $value === null ? '' : $value;
}
- public function _lastUpdate ($value) {
+ public function _lastUpdate($value) {
$this->lastUpdate = $value;
}
- public function _priority ($value) {
+ public function _priority($value) {
$value = intval($value);
$this->priority = $value >= 0 ? $value : 10;
}
- public function _pathEntries ($value) {
+ public function _pathEntries($value) {
$this->pathEntries = $value;
}
- public function _httpAuth ($value) {
+ public function _httpAuth($value) {
$this->httpAuth = $value;
}
- public function _error ($value) {
+ public function _error($value) {
$this->error = (bool)$value;
}
- public function _keepHistory ($value) {
+ public function _keepHistory($value) {
$value = intval($value);
$value = min($value, 1000000);
$value = max($value, -2);
$this->keep_history = $value;
}
- public function _nbNotRead ($value) {
+ public function _ttl($value) {
+ $value = intval($value);
+ $value = min($value, 100000000);
+ $value = max($value, -2);
+ $this->ttl = $value;
+ }
+ public function _nbNotRead($value) {
$this->nbNotRead = intval($value);
}
- public function _nbEntries ($value) {
+ public function _nbEntries($value) {
$this->nbEntries = intval($value);
}
- public function load ($loadDetails = false) {
+ public function load($loadDetails = false) {
if ($this->url !== null) {
if (CACHE_PATH === false) {
- throw new Minz_FileNotExistException (
+ throw new Minz_FileNotExistException(
'CACHE_PATH',
Minz_Exception::ERROR
);
} else {
- $url = htmlspecialchars_decode ($this->url, ENT_QUOTES);
+ $url = htmlspecialchars_decode($this->url, ENT_QUOTES);
if ($this->httpAuth != '') {
- $url = preg_replace ('#((.+)://)(.+)#', '${1}' . $this->httpAuth . '@${3}', $url);
+ $url = preg_replace('#((.+)://)(.+)#', '${1}' . $this->httpAuth . '@${3}', $url);
}
$feed = customSimplePie();
- $feed->set_feed_url ($url);
+ $feed->set_feed_url($url);
+ if (!$loadDetails) { //Only activates auto-discovery when adding a new feed
+ $feed->set_autodiscovery_level(SIMPLEPIE_LOCATOR_NONE);
+ }
$mtime = $feed->init();
if ((!$mtime) || $feed->error()) {
- throw new FreshRSS_Feed_Exception ($feed->error() . ' [' . $url . ']');
- }
-
- // si on a utilisé l'auto-discover, notre url va avoir changé
- $subscribe_url = $feed->subscribe_url ();
- if ($subscribe_url !== null && $subscribe_url !== $this->url) {
- if ($this->httpAuth != '') {
- // on enlève les id si authentification HTTP
- $subscribe_url = preg_replace ('#((.+)://)((.+)@)(.+)#', '${1}${5}', $subscribe_url);
- }
- $this->_url ($subscribe_url);
+ throw new FreshRSS_Feed_Exception($feed->error() . ' [' . $url . ']');
}
if ($loadDetails) {
- $title = htmlspecialchars(html_only_entity_decode($feed->get_title()), ENT_COMPAT, 'UTF-8');
- $this->_name ($title === null ? $this->url : $title);
+ // si on a utilisé l'auto-discover, notre url va avoir changé
+ $subscribe_url = $feed->subscribe_url(false);
+
+ $title = strtr(html_only_entity_decode($feed->get_title()), array('<' => '&lt;', '>' => '&gt;', '"' => '&quot;')); //HTML to HTML-PRE //ENT_COMPAT except &
+ $this->_name($title == '' ? $this->url : $title);
$this->_website(html_only_entity_decode($feed->get_link()));
$this->_description(html_only_entity_decode($feed->get_description()));
+ } else {
+ //The case of HTTP 301 Moved Permanently
+ $subscribe_url = $feed->subscribe_url(true);
}
- if (($mtime === true) || ($mtime > $this->lastUpdate)) {
+ if ($subscribe_url !== null && $subscribe_url !== $this->url) {
+ if ($this->httpAuth != '') {
+ // on enlève les id si authentification HTTP
+ $subscribe_url = preg_replace('#((.+)://)((.+)@)(.+)#', '${1}${5}', $subscribe_url);
+ }
+ $this->_url($subscribe_url);
+ }
+
+ if (($mtime === true) ||($mtime > $this->lastUpdate)) {
syslog(LOG_DEBUG, 'FreshRSS no cache ' . $mtime . ' > ' . $this->lastUpdate . ' for ' . $subscribe_url);
$this->loadEntries($feed); // et on charge les articles du flux
} else {
@@ -231,47 +256,52 @@ class FreshRSS_Feed extends Minz_Model {
}
}
- private function loadEntries ($feed) {
- $entries = array ();
+ private function loadEntries($feed) {
+ $entries = array();
- foreach ($feed->get_items () as $item) {
- $title = html_only_entity_decode (strip_tags ($item->get_title ()));
- $author = $item->get_author ();
- $link = $item->get_permalink ();
- $date = @strtotime ($item->get_date ());
+ foreach ($feed->get_items() as $item) {
+ $title = html_only_entity_decode(strip_tags($item->get_title()));
+ $author = $item->get_author();
+ $link = $item->get_permalink();
+ $date = @strtotime($item->get_date());
// gestion des tags (catégorie == tag)
- $tags_tmp = $item->get_categories ();
- $tags = array ();
+ $tags_tmp = $item->get_categories();
+ $tags = array();
if ($tags_tmp !== null) {
foreach ($tags_tmp as $tag) {
- $tags[] = html_only_entity_decode ($tag->get_label ());
+ $tags[] = html_only_entity_decode($tag->get_label());
}
}
- $content = html_only_entity_decode ($item->get_content ());
+ $content = html_only_entity_decode($item->get_content());
$elinks = array();
foreach ($item->get_enclosures() as $enclosure) {
$elink = $enclosure->get_link();
- if (array_key_exists($elink, $elinks)) continue;
- $elinks[$elink] = '1';
- $mime = strtolower($enclosure->get_type());
- if (strpos($mime, 'image/') === 0) {
- $content .= '<br /><img src="' . $elink . '" alt="" />';
+ if (empty($elinks[$elink])) {
+ $elinks[$elink] = '1';
+ $mime = strtolower($enclosure->get_type());
+ if (strpos($mime, 'image/') === 0) {
+ $content .= '<br /><img lazyload="" postpone="" src="' . $elink . '" alt="" />';
+ } elseif (strpos($mime, 'audio/') === 0) {
+ $content .= '<br /><audio lazyload="" postpone="" preload="none" src="' . $elink . '" controls="controls" />';
+ } elseif (strpos($mime, 'video/') === 0) {
+ $content .= '<br /><video lazyload="" postpone="" preload="none" src="' . $elink . '" controls="controls" />';
+ }
}
}
- $entry = new FreshRSS_Entry (
- $this->id (),
- $item->get_id (),
+ $entry = new FreshRSS_Entry(
+ $this->id(),
+ $item->get_id(),
$title === null ? '' : $title,
- $author === null ? '' : html_only_entity_decode ($author->name),
+ $author === null ? '' : html_only_entity_decode($author->name),
$content === null ? '' : $content,
$link === null ? '' : $link,
- $date ? $date : time ()
+ $date ? $date : time()
);
- $entry->_tags ($tags);
+ $entry->_tags($tags);
// permet de récupérer le contenu des flux tronqués
$entry->loadCompleteContent($this->pathEntries());
@@ -283,20 +313,19 @@ class FreshRSS_Feed extends Minz_Model {
}
function lock() {
- $lock = TMP_PATH . '/' . md5(Minz_Configuration::salt() . $this->url) . '.freshrss.lock';
- if (file_exists($lock) && ((time() - @filemtime($lock)) > 3600)) {
- @unlink($lock);
+ $this->lockPath = TMP_PATH . '/' . $this->hash() . '.freshrss.lock';
+ if (file_exists($this->lockPath) && ((time() - @filemtime($this->lockPath)) > 3600)) {
+ @unlink($this->lockPath);
}
- if (($handle = @fopen($lock, 'x')) === false) {
+ if (($handle = @fopen($this->lockPath, 'x')) === false) {
return false;
}
- //register_shutdown_function('unlink', $lock);
+ //register_shutdown_function('unlink', $this->lockPath);
@fclose($handle);
return true;
}
function unlock() {
- $lock = TMP_PATH . '/' . md5(Minz_Configuration::salt() . $this->url) . '.freshrss.lock';
- @unlink($lock);
+ @unlink($this->lockPath);
}
}