Esempio n. 1
0
 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);
     }
 }