public function feedAction() { $catDAO = new FreshRSS_CategoryDAO(); $this->view->categories = $catDAO->listCategories(false); $feedDAO = new FreshRSS_FeedDAO(); $this->view->feeds = $feedDAO->listFeeds(); $id = Minz_Request::param('id'); if ($id == false && !empty($this->view->feeds)) { $id = current($this->view->feeds)->id(); } $this->view->flux = false; if ($id != false) { $this->view->flux = $this->view->feeds[$id]; if (!$this->view->flux) { Minz_Error::error(404, array('error' => array(Minz_Translate::t('page_not_found')))); } else { if (Minz_Request::isPost() && $this->view->flux) { $user = Minz_Request::param('http_user', ''); $pass = Minz_Request::param('http_pass', ''); $httpAuth = ''; if ($user != '' || $pass != '') { $httpAuth = $user . ':' . $pass; } $cat = intval(Minz_Request::param('category', 0)); $values = array('name' => Minz_Request::param('name', ''), 'description' => sanitizeHTML(Minz_Request::param('description', '', true)), 'website' => Minz_Request::param('website', ''), 'url' => Minz_Request::param('url', ''), 'category' => $cat, 'pathEntries' => Minz_Request::param('path_entries', ''), 'priority' => intval(Minz_Request::param('priority', 0)), 'httpAuth' => $httpAuth, 'keep_history' => intval(Minz_Request::param('keep_history', -2))); if ($feedDAO->updateFeed($id, $values)) { $this->view->flux->_category($cat); $this->view->flux->faviconPrepare(); $notif = array('type' => 'good', 'content' => Minz_Translate::t('feed_updated')); } else { $notif = array('type' => 'bad', 'content' => Minz_Translate::t('error_occurred_update')); } invalidateHttpCache(); Minz_Session::_param('notification', $notif); Minz_Request::forward(array('c' => 'configure', 'a' => 'feed', 'params' => array('id' => $id)), true); } Minz_View::prependTitle(Minz_Translate::t('rss_feed_management') . ' — ' . $this->view->flux->name() . ' · '); } } else { Minz_View::prependTitle(Minz_Translate::t('rss_feed_management') . ' · '); } }
public function actualizeAction() { @set_time_limit(300); $feedDAO = new FreshRSS_FeedDAO(); $entryDAO = new FreshRSS_EntryDAO(); Minz_Session::_param('actualize_feeds', false); $id = Minz_Request::param('id'); $force = Minz_Request::param('force', false); // on créé la liste des flux à mettre à actualiser // si on veut mettre un flux à jour spécifiquement, on le met // dans la liste, mais seul (permet d'automatiser le traitement) $feeds = array(); if ($id) { $feed = $feedDAO->searchById($id); if ($feed) { $feeds = array($feed); } } else { $feeds = $feedDAO->listFeedsOrderUpdate(); } // on calcule la date des articles les plus anciens qu'on accepte $nb_month_old = max($this->view->conf->old_entries, 1); $date_min = time() - 3600 * 24 * 30 * $nb_month_old; $i = 0; $flux_update = 0; $is_read = $this->view->conf->mark_when['reception'] ? 1 : 0; foreach ($feeds as $feed) { if (!$feed->lock()) { Minz_Log::record('Feed already being actualized: ' . $feed->url(), Minz_Log::NOTICE); continue; } try { $url = $feed->url(); $feedHistory = $feed->keepHistory(); $feed->load(false); $entries = array_reverse($feed->entries()); //We want chronological order and SimplePie uses reverse order $hasTransaction = false; if (count($entries) > 0) { //For this feed, check last n entry GUIDs already in database $existingGuids = array_fill_keys($entryDAO->listLastGuidsByFeed($feed->id(), count($entries) + 10), 1); $useDeclaredDate = empty($existingGuids); if ($feedHistory == -2) { //default $feedHistory = $this->view->conf->keep_history_default; } $hasTransaction = true; $feedDAO->beginTransaction(); // On ne vérifie pas strictement que l'article n'est pas déjà en BDD // La BDD refusera l'ajout car (id_feed, guid) doit être unique foreach ($entries as $entry) { $eDate = $entry->date(true); if (!isset($existingGuids[$entry->guid()]) && ($feedHistory != 0 || $eDate >= $date_min)) { $values = $entry->toArray(); //Use declared date at first import, otherwise use discovery date $values['id'] = $useDeclaredDate || $eDate < $date_min ? min(time(), $eDate) . uSecString() : uTimeString(); $values['is_read'] = $is_read; $entryDAO->addEntry($values); } } } if ($feedHistory >= 0 && rand(0, 30) === 1) { if (!$hasTransaction) { $feedDAO->beginTransaction(); } $nb = $feedDAO->cleanOldEntries($feed->id(), $date_min, max($feedHistory, count($entries) + 10)); if ($nb > 0) { Minz_Log::record($nb . ' old entries cleaned in feed [' . $feed->url() . ']', Minz_Log::DEBUG); } } // on indique que le flux vient d'être mis à jour en BDD $feedDAO->updateLastUpdate($feed->id(), 0, $hasTransaction); if ($hasTransaction) { $feedDAO->commit(); } $flux_update++; if ($feed->url() !== $url) { //URL has changed (auto-discovery) $feedDAO->updateFeed($feed->id(), array('url' => $feed->url())); } } catch (FreshRSS_Feed_Exception $e) { Minz_Log::record($e->getMessage(), Minz_Log::NOTICE); $feedDAO->updateLastUpdate($feed->id(), 1); } $feed->faviconPrepare(); $feed->unlock(); unset($feed); // On arrête à 10 flux pour ne pas surcharger le serveur // sauf si le paramètre $force est à vrai $i++; if ($i >= 10 && !$force) { break; } } $url = array(); if ($flux_update === 1) { // on a mis un seul flux à jour $feed = reset($feeds); $notif = array('type' => 'good', 'content' => Minz_Translate::t('feed_actualized', $feed->name())); } elseif ($flux_update > 1) { // plusieurs flux on été mis à jour $notif = array('type' => 'good', 'content' => Minz_Translate::t('n_feeds_actualized', $flux_update)); } else { // aucun flux n'a été mis à jour, oups $notif = array('type' => 'good', 'content' => Minz_Translate::t('no_feed_to_refresh')); } if ($i === 1) { // Si on a voulu mettre à jour qu'un flux // on filtre l'affichage par ce flux $feed = reset($feeds); $url['params'] = array('get' => 'f_' . $feed->id()); } if (Minz_Request::param('ajax', 0) === 0) { Minz_Session::_param('notification', $notif); Minz_Request::forward($url, true); } else { // Une requête Ajax met un seul flux à jour. // Comme en principe plusieurs requêtes ont lieu, // on indique que "plusieurs flux ont été mis à jour". // Cela permet d'avoir une notification plus proche du // ressenti utilisateur $notif = array('type' => 'good', 'content' => Minz_Translate::t('feeds_actualized')); Minz_Session::_param('notification', $notif); // et on désactive le layout car ne sert à rien $this->view->_useLayout(false); } }