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; }
/** * 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; }
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; }