Exemplo n.º 1
0
 public static function processPodcast(Podcast $record)
 {
     $em = self::getEntityManager();
     $db_stats = array('record' => $record->name, 'updated' => 0, 'inserted' => 0, 'deleted' => 0);
     foreach ($record->sources as $source) {
         if ($source->is_active) {
             $new_episodes = $source->process();
             if (empty($new_episodes)) {
                 continue;
             }
             // Reconcile differences.
             $existing_episodes = array();
             foreach ($source->episodes as $episode) {
                 // Remove duplicate episode.
                 if (isset($existing_episodes[$episode->guid])) {
                     $db_stats['deleted']++;
                     $em->remove($episode);
                 } else {
                     $existing_episodes[$episode->guid] = $episode;
                 }
             }
             foreach ($new_episodes as $ep_guid => $ep_info) {
                 if (isset($existing_episodes[$ep_guid])) {
                     $db_stats['updated']++;
                     $episode = $existing_episodes[$ep_guid];
                 } else {
                     $db_stats['inserted']++;
                     $episode = new PodcastEpisode();
                     $episode->source = $source;
                     $episode->podcast = $record;
                     // Preload banner URL if specified, and if episode is new enough.
                     if ($ep_info['banner_url'] && $ep_info['timestamp'] > time() - 86400 * 14) {
                         PodcastEpisode::getEpisodeRotatorUrl($ep_info, $record, $source);
                     }
                 }
                 $episode->fromArray($ep_info);
                 $em->persist($episode);
                 unset($existing_episodes[$ep_guid]);
             }
             foreach ($existing_episodes as $ep_guid => $ep_to_remove) {
                 $db_stats['deleted']++;
                 $em->remove($ep_to_remove);
             }
         } else {
             foreach ($source->episodes as $episode) {
                 $em->remove($episode);
             }
         }
         $em->flush();
     }
     Debug::print_r($db_stats);
     return true;
 }
Exemplo n.º 2
0
 /**
  * Pull the latest podcasts.
  *
  * @param int $num_to_fetch Number of podcasts to list. Specify 0 or another false value to remove limit.
  * @return array
  */
 public static function fetchLatest($num_to_fetch = 12)
 {
     $em = self::getEntityManager();
     $podcasts = \DF\Cache::get('homepage_podcasts');
     if (!$podcasts) {
         // Pull all recent episodes.
         $latest_podcast_episodes = $em->createQuery('SELECT pe, ps, p FROM Entity\\PodcastEpisode pe
             JOIN pe.source ps
             JOIN pe.podcast p
             WHERE pe.timestamp > :threshold
             AND pe.is_active = 1
             AND ps.is_active = 1
             AND p.is_approved = 1
             ORDER BY pe.timestamp DESC')->setParameter('threshold', strtotime('-2 months'))->getArrayResult();
         $podcasts = array();
         foreach ($latest_podcast_episodes as $ep) {
             $podcast = $ep['podcast'];
             unset($ep['podcast']);
             // Limit to one episode (newest only) per podcast.
             $podcast_id = $podcast['id'];
             if (!isset($podcasts[$podcast_id])) {
                 // Generate banner URL.
                 $podcast['rotator_mode'] = true;
                 $podcast['rotator_url'] = PodcastEpisode::getEpisodeRotatorUrl($ep, $podcast, $ep['source']);
                 $podcasts[$podcast_id] = $podcast;
                 $podcasts[$podcast_id]['episodes'] = array($ep);
             }
         }
         \DF\Cache::save($podcasts, 'homepage_podcasts', array(), 300);
     }
     // Only slice podcasts if $num_to_fetch is non-zero/true.
     if ($num_to_fetch) {
         $podcasts = array_slice($podcasts, 0, $num_to_fetch);
     }
     return $podcasts;
 }
Exemplo n.º 3
0
 public static function _runPodcastEpisodes(\Phalcon\DiInterface $di)
 {
     $news_items = array();
     $em = $di->get('em');
     // Pull podcast episodes.
     $podcasts_raw = $em->createQuery('SELECT p, pe, ps FROM Entity\\Podcast p LEFT JOIN p.episodes pe JOIN pe.source ps
         WHERE (p.banner_url IS NOT NULL AND p.banner_url != \'\')
         AND p.is_approved = 1
         AND pe.timestamp >= :threshold
         AND pe.is_active = 1
         ORDER BY p.id ASC, pe.timestamp DESC')->setParameter('threshold', strtotime('-1 month'))->getArrayResult();
     foreach ((array) $podcasts_raw as $podcast) {
         foreach ($podcast['episodes'] as $ep) {
             if (empty($ep['body'])) {
                 continue;
             }
             $title = trim($ep['title']);
             if ($podcast['is_adult']) {
                 $title = '[18+] ' . $title;
             }
             $news_items[] = array('id' => 'podcast_' . $ep['guid'], 'title' => $title, 'source' => 'podcast', 'body' => $ep['summary'], 'image_url' => \Entity\PodcastEpisode::getEpisodeRotatorUrl($ep, $podcast, $ep['source']), 'web_url' => \Entity\PodcastEpisode::getEpisodeLocalUrl($ep, 'pvlnews'), 'layout' => 'vertical', 'tags' => array($podcast['name'], 'Podcast Episodes'), 'sort_timestamp' => $ep['timestamp'], 'display_timestamp' => $ep['timestamp']);
             break;
         }
     }
     return $news_items;
 }