private function get_chapters_object() { if (!$this->chapters_raw) { $this->chapters_raw = $this->get_raw_chapters_string(); } if (!$this->chapters_raw) { return NULL; } $asset_assignment = Model\AssetAssignment::get_instance(); if ($asset_assignment->chapters == 'manual') { return Parser\Mp4chaps::parse($this->chapters_raw); } if (!($chapters_asset = Model\EpisodeAsset::find_one_by_id($asset_assignment->chapters))) { return NULL; } $mime_type = $chapters_asset->file_type()->mime_type; $chapters = false; switch ($mime_type) { case 'application/xml': $chapters = Parser\PSC::parse($this->chapters_raw); break; case 'application/json': $chapters = Parser\JSON::parse($this->chapters_raw); break; case 'text/plain': switch ($this->chapters_raw[0]) { case '[': case '{': $chapters = Parser\JSON::parse($this->chapters_raw); break; case '<': $chapters = Parser\PSC::parse($this->chapters_raw); break; default: $chapters = Parser\Mp4chaps::parse($this->chapters_raw); break; } break; } return $chapters; }
public function cover_art() { return $this->with_blog_scope(function () { $podcast = Podcast::get(); $asset_assignment = AssetAssignment::get_instance(); if (!$asset_assignment->image) { return false; } if ($asset_assignment->image == 'manual') { $cover_art = trim($this->cover_art); if (empty($cover_art)) { return false; } else { return new Image($cover_art, $this->title()); } } $cover_art_file_id = $asset_assignment->image; if (!($asset = EpisodeAsset::find_one_by_id($cover_art_file_id))) { return false; } if (!($file = MediaFile::find_by_episode_id_and_episode_asset_id($this->id, $asset->id))) { return false; } return $file->size > 0 ? new Image($file->get_file_url(), $this->title()) : false; }); }
<?php use Podlove\Model; // extend episode form add_filter('podlove_episode_form_data', function ($form_data, $episode) { if (Model\AssetAssignment::get_instance()->image !== 'manual') { return $form_data; } $form_data[] = array('type' => 'upload', 'key' => 'cover_art', 'options' => array('label' => __('Episode Cover Art URL', 'podlove'), 'description' => __('Enter URL or select image from media library. JPEG or PNG. At least 1400 x 1400 pixels.', 'podlove'), 'html' => array('class' => 'regular-text podlove-check-input', 'data-podlove-input-type' => 'url')), 'position' => 790); return $form_data; }, 10, 2); add_filter('podlove_episode_data_filter', function ($filter) { return array_merge($filter, ['cover_art' => FILTER_SANITIZE_URL]); });
private function view_template() { $table = new \Podlove\Episode_Asset_List_Table(); $table->prepare_items(); $table->display(); ?> <h3><?php echo __('Assign Assets', 'podlove'); ?> </h3> <form method="post" action="options.php"> <?php settings_fields(EpisodeAsset::$pagehook); $asset_assignment = Model\AssetAssignment::get_instance(); $form_attributes = array('context' => 'podlove_asset_assignment', 'form' => false); \Podlove\Form\build_for($asset_assignment, $form_attributes, function ($form) { $wrapper = new \Podlove\Form\Input\TableWrapper($form); $asset_assignment = $form->object; $artwork_options = array('0' => __('None', 'podlove'), 'manual' => __('Manual Entry', 'podlove')); $episode_assets = Model\EpisodeAsset::all(); foreach ($episode_assets as $episode_asset) { $file_type = $episode_asset->file_type(); if ($file_type && $file_type->type === 'image') { $artwork_options[$episode_asset->id] = sprintf(__('Asset: %s', 'podlove'), $episode_asset->title); } } $wrapper->select('image', array('label' => __('Episode Image', 'podlove'), 'options' => $artwork_options)); $chapter_file_options = array('0' => __('None', 'podlove'), 'manual' => __('Manual Entry', 'podlove')); $episode_assets = Model\EpisodeAsset::all(); foreach ($episode_assets as $episode_asset) { $file_type = $episode_asset->file_type(); if ($file_type && $file_type->type === 'chapters') { $chapter_file_options[$episode_asset->id] = sprintf(__('Asset: %s', 'podlove'), $episode_asset->title); } } $wrapper->select('chapters', array('label' => __('Episode Chapters', 'podlove'), 'options' => $chapter_file_options)); do_action('podlove_asset_assignment_form', $wrapper, $asset_assignment); }); ?> </form> <?php }
function override_feed_entry($hook, $podcast, $feed, $format) { add_action($hook, function () use($podcast, $feed, $format) { global $post; $cache = \Podlove\Cache\TemplateCache::get_instance(); echo $cache->cache_for('feed_item_' . $feed->slug . '_' . $post->ID, function () use($podcast, $feed, $format, $post) { $xml = ""; $episode = Model\Episode::find_one_by_post_id($post->ID); $asset = $feed->episode_asset(); $file = Model\MediaFile::find_by_episode_id_and_episode_asset_id($episode->id, $asset->id); $asset_assignment = Model\AssetAssignment::get_instance(); if (!$file) { return; } $enclosure_file_size = $file->size; $cover_art_url = ""; if ($cover_art = $episode->cover_art()) { $cover_art_url = $cover_art->url(); } if (isset($_REQUEST['tracking']) && $_REQUEST['tracking'] == 'no') { $enclosure_url = $episode->enclosure_url($feed->episode_asset(), null, null); } else { $enclosure_url = $episode->enclosure_url($feed->episode_asset(), "feed", $feed->slug); } $deep_link = Model\Feed::get_link_tag(array('prefix' => 'atom', 'rel' => 'http://podlove.org/deep-link', 'type' => '', 'title' => '', 'href' => get_permalink() . "#")); $xml .= apply_filters('podlove_deep_link', $deep_link, $feed); $xml .= apply_filters('podlove_feed_enclosure', '', $enclosure_url, $enclosure_file_size, $format->mime_type, $file); $duration = sprintf('<itunes:duration>%s</itunes:duration>', $episode->get_duration('HH:MM:SS')); $xml .= apply_filters('podlove_feed_itunes_duration', $duration); $author = apply_filters('podlove_feed_content', $podcast->author_name); $author = sprintf('<itunes:author>%s</itunes:author>', $author); $xml .= apply_filters('podlove_feed_itunes_author', $author); $subtitle = apply_filters('podlove_feed_content', \Podlove\PHP\escape_shortcodes(strip_tags($episode->subtitle))); $subtitle = sprintf('<itunes:subtitle>%s</itunes:subtitle>', $subtitle); $xml .= apply_filters('podlove_feed_itunes_subtitle', $subtitle); $summary = apply_filters('podlove_feed_content', \Podlove\PHP\escape_shortcodes(strip_tags($episode->summary))); $summary = sprintf('<itunes:summary>%s</itunes:summary>', $summary); $xml .= apply_filters('podlove_feed_itunes_summary', $summary); if (\Podlove\get_setting('metadata', 'enable_episode_explicit')) { $itunes_explicit = apply_filters('podlove_feed_content', $episode->explicit_text()); $itunes_explicit = sprintf('<itunes:explicit>%s</itunes:explicit>', $itunes_explicit); $xml .= apply_filters('podlove_feed_itunes_explicit', $itunes_explicit); } if ($cover_art_url) { $cover_art = sprintf('<itunes:image href="%s" />', $cover_art_url); } else { $cover_art = ''; } $xml .= apply_filters('podlove_feed_itunes_image', $cover_art); if ($feed->embed_content_encoded) { add_filter('the_content_feed', function ($content, $feed_type) { return preg_replace('#<style(.*?)>(.*?)</style>#is', '', $content); }, 10, 2); $content_encoded = '<content:encoded><![CDATA[' . get_the_content_feed('rss2') . ']]></content:encoded>'; $xml .= apply_filters('podlove_feed_content_encoded', $content_encoded); } ob_start(); do_action('podlove_append_to_feed_entry', $podcast, $episode, $feed, $format); $xml .= ob_get_contents(); ob_end_clean(); return $xml; }, 15 * MINUTE_IN_SECONDS); }, 11); }
return $new; } $episodes = \Podlove\Model\Episode::find_all_by_time(); // 10 seconds per episode or 30 seconds since 1 request per asset // is required if it is not cached set_time_limit(max(30, count($episodes) * 10)); foreach ($episodes as $episode) { if ($chapters = $episode->get_chapters('mp4chaps')) { $episode->update_attribute('chapters', esc_sql($chapters)); } } // delete chapters caches $wpdb->query('DELETE FROM `' . $wpdb->options . '` WHERE option_name LIKE "%podlove_chapters_string_%"'); return $new; }, 10, 2); // extend episode form add_filter('podlove_episode_form_data', function ($form_data, $episode) { if (Model\AssetAssignment::get_instance()->chapters !== 'manual') { return $form_data; } $form_data[] = array('type' => 'text', 'key' => 'chapters', 'options' => array('label' => __('Chapter Marks', 'podlove'), 'description' => __('One timepoint (hh:mm:ss[.mmm]) and the chapter title per line.', 'podlove'), 'html' => array('class' => 'large-text code autogrow', 'placeholder' => '00:00:00.000 Intro', 'rows' => max(2, count(explode("\n", $episode->chapters))))), 'position' => 800); return $form_data; }, 10, 2); add_filter('podlove_episode_data_filter', function ($filter) { return array_merge($filter, ['chapters' => FILTER_UNSAFE_RAW]); }); // add PSC to rss feed add_action('podlove_append_to_feed_entry', function ($podcast, $episode, $feed, $format) { $chapters = new \Podlove\Feeds\Chapters($episode); $chapters->render('inline'); }, 10, 4);