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;
 }
Ejemplo n.º 2
0
 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 
    }
Ejemplo n.º 5
0
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);