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); } }