function podlove_episode_license_add_js()
{
    $episode = Model\Episode::find_or_create_by_post_id(get_the_ID());
    ?>
	<script type="text/javascript">
	PODLOVE.License({
		plugin_url: "<?php 
    echo \Podlove\PLUGIN_URL;
    ?>
",

		locales:  JSON.parse('<?php 
    echo json_encode(\Podlove\License\locales_cc());
    ?>
'),
		versions: JSON.parse('<?php 
    echo json_encode(\Podlove\License\version_per_country_cc());
    ?>
'),
		license:  JSON.parse('<?php 
    echo json_encode(\Podlove\Model\License::get_license_from_url($episode->license_url));
    ?>
'),

		license_name_field_id: '#_podlove_meta_license_name',
		license_url_field_id:  '#_podlove_meta_license_url'
	});
	</script>
	<?php 
}
 private function validate_post(\WP_Post $post)
 {
     $episode = Model\Episode::find_or_create_by_post_id($post->ID);
     if ($episode && $episode->is_valid()) {
         Log::get()->addInfo('Validate episode', array('episode_id' => $episode->id));
         $episode->refetch_files();
         update_post_meta($post->ID, '_podlove_last_validated_at', time());
     }
 }
 public static function shortcode()
 {
     if (is_feed()) {
         return '';
     }
     $episode = Episode::find_or_create_by_post_id(get_the_ID());
     $printer = new Html5Printer($episode);
     $printer->setAttributes(['data-podlove-web-player-source' => add_query_arg(['podloveEmbed' => true], get_permalink())]);
     return $printer->render(null);
 }
 public function default_excerpt_to_episode_summary($excerpt)
 {
     global $post;
     if (get_post_type() !== 'podcast') {
         return $excerpt;
     }
     $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post->ID);
     $excerpt = strlen($episode->summary) > 0 ? $episode->summary : $excerpt;
     return apply_filters("wp_trim_excerpt", $excerpt);
 }
 public static function clone_contributors($new_post_id, $old_post_object)
 {
     $old_episode = Episode::find_one_by_post_id($old_post_object->ID);
     $new_episode = Episode::find_or_create_by_post_id($new_post_id);
     $old_contributions = EpisodeContribution::find_all_by_episode_id($old_episode->id);
     foreach ($old_contributions as $old_contribution) {
         $c = new EpisodeContribution();
         $c->contributor_id = $old_contribution->contributor_id;
         $c->episode_id = $new_episode->id;
         $c->role_id = $old_contribution->role_id;
         $c->group_id = $old_contribution->group_id;
         $c->position = $old_contribution->position;
         $c->comment = $old_contribution->comment;
         $c->save();
     }
 }
 public static function recalculate_episode_download_average()
 {
     set_time_limit(1800);
     // set max_execution_time to half an hour
     $query = new \WP_Query(array('post_type' => 'podcast', 'post_status' => array('publish', 'private'), 'posts_per_page' => -1, 'meta_query' => array(array('key' => '_podlove_eda_complete', 'compare' => 'NOT EXISTS'))));
     while ($query->have_posts()) {
         $query->the_post();
         $post_id = get_the_ID();
         $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post_id);
         $downloads = self::get_downloads_per_hour_for_episode($episode->id);
         update_post_meta($post_id, '_podlove_eda_downloads', implode(',', $downloads));
         if (count($downloads) >= self::HOURS_TO_CALCULATE) {
             update_post_meta($post_id, '_podlove_eda_complete', 1);
         }
     }
     wp_reset_postdata();
 }
    public function standalone_player_page()
    {
        if (!isset($_GET['standalonePlayer'])) {
            return;
        }
        if (!is_single()) {
            return;
        }
        if (!($episode = Episode::find_or_create_by_post_id(get_the_ID()))) {
            return;
        }
        ?>
<!DOCTYPE html>
    <head>
        <script type="text/javascript" src="<?php 
        echo $this->get_module_url();
        ?>
/js/html5shiv.js"></script>
        <script type="text/javascript" src="<?php 
        echo $this->get_module_url();
        ?>
/js/jquery-1.9.1.min.js"></script>
        <script type="text/javascript" src="<?php 
        echo $this->get_module_url();
        ?>
/player/podlove-web-player/static/podlove-web-player.js"></script>
        <link rel="stylesheet" href="<?php 
        echo $this->get_module_url();
        ?>
/player/podlove-web-player/static/podlove-web-player.css" />
    </head>
    <body>
	    <?php 
        $printer = new Printer($episode);
        echo $printer->render();
        ?>
    </body>
</html>
		<?php 
        exit;
    }
 public static function adn_tags($text, $post_id, $selected_role, $selected_group)
 {
     $contributor_adn_accounts = '';
     $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post_id);
     $contributions = \Podlove\Modules\Contributors\Model\EpisodeContribution::find_all_by_episode_id($episode->id);
     $adn_service = \Podlove\Modules\Social\Model\Service::find_one_by_property('type', 'app.net');
     if (!$adn_service) {
         return;
     }
     foreach ($contributions as $contribution) {
         $contributor_adn_accounts .= '';
         $social_accounts = \Podlove\Modules\Social\Model\ContributorService::find_all_by_contributor_id($contribution->contributor_id);
         array_map(function ($account) use($adn_service, &$contributor_adn_accounts, $contribution, $selected_role, $selected_group) {
             if ($account->service_id == $adn_service->id) {
                 if ($selected_role == '') {
                     if ($selected_group == '') {
                         $contributor_adn_accounts .= "@" . $account->value . " ";
                     } else {
                         if ($contribution->group_id == $selected_group) {
                             $contributor_adn_accounts .= "@" . $account->value . " ";
                         }
                     }
                 } else {
                     if ($selected_group == '' && $contribution->role_id == $selected_role) {
                         $contributor_adn_accounts .= "@" . $account->value . " ";
                     } else {
                         if ($contribution->group_id == $selected_group && $contribution->role_id == $selected_role) {
                             $contributor_adn_accounts .= "@" . $account->value . " ";
                         }
                     }
                 }
             }
         }, $social_accounts);
     }
     $total_text_length = strlen($text) + strlen($contributor_adn_accounts);
     if ($total_text_length <= 256) {
         return str_replace('{episodeContributors}', $contributor_adn_accounts, $text);
     }
     return str_replace('{episodeContributors}', '', $text);
 }
 /** 
  * Updates Episode production data after Auphonic production has finished.
  * Basically, this is like pushing the "Get Production Results" button.
  */
 public function update_production_data($post_id)
 {
     $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post_id);
     $production = json_decode($this->fetch_production($_POST['uuid']));
     $metadata = array('title' => get_the_title($post_id), 'subtitle' => $episode->subtitle, 'summary' => $episode->summary, 'duration' => $episode->duration, 'chapters' => $episode->chapters, 'slug' => $episode->slug, 'license' => $episode->license, 'license_url' => $episode->license_url, 'tags' => implode(',', array_map(function ($tag) {
         return $tag->name;
     }, wp_get_post_tags($post_id))));
     $auphonic_metadata = array('title' => $production['metadata']['title'], 'subtitle' => $production['metadata']['subtitle'], 'summary' => $production['metadata']['summary'], 'duration' => $production['length_timestring'], 'chapters' => $this->convert_chapters_to_string($production['chapters']), 'slug' => $production['output_basename'], 'license' => $production['metadata']['license'], 'license_url' => $production['metadata']['license_url'], 'tags' => implode(',', $production['metadata']['tags']));
     // Merge both arrays
     foreach ($metadata as $metadata_key => $metadata_entry) {
         if (is_null($metadata_entry) || empty($metadata_entry)) {
             $metadata[$metadata_key] = $auphonic_metadata[$metadata_key];
         }
     }
     $episode->subtitle = $metadata['subtitle'];
     $episode->summary = $metadata['summary'];
     $episode->duration = $metadata['duration'];
     $episode->chapters = $metadata['chapters'];
     $episode->slug = $metadata['slug'];
     $episode->license = $metadata['license'];
     $episode->license_url = $metadata['license_url'];
     $episode->save();
     wp_update_post(array('ID' => $post_id, 'post_title' => $metadata['title']));
     wp_set_post_tags($post_id, $metadata['tags']);
 }
    public function inject_widget($content)
    {
        global $post;
        if ('podcast' !== get_post_type()) {
            return $content;
        }
        if (is_feed()) {
            return $content;
        }
        $cache = \Podlove\Cache\TemplateCache::get_instance();
        $bitlove_html = $cache->cache_for('bitlove_' . get_permalink($post->ID), function () use($post) {
            $episode = Model\Episode::find_or_create_by_post_id($post->ID);
            $media_files = $episode->media_files();
            $downloads = array();
            $content = '';
            foreach ($media_files as $media_file) {
                $episode_asset = $media_file->episode_asset();
                if (!$episode_asset->downloadable) {
                    continue;
                }
                $file_type = $episode_asset->file_type();
                $download_link_name = str_replace(" ", "&nbsp;", $episode_asset->title);
                $downloads[] = array('enclosure_guid' => RssExtension::get_enclosure_guid($media_file), 'name' => $download_link_name, 'size' => \Podlove\format_bytes($media_file->size, 0), 'file' => $media_file);
            }
            $content .= '<script type="text/javascript">';
            $content .= '    /* <!-- */';
            foreach ($downloads as $download) {
                $content .= <<<EOF
jQuery(function(\$) {
\ttorrentByEnclosure("{$download['enclosure_guid']}", function(info) {
\t  if (info) {
\t    var url   = info.sources[0].torrent,
\t        title = "Torrent:&nbsp;{$download['name']}";
\t    // select-style download-widget
\t    jQuery("#post-{$post->ID} [name='download_media_file']").append("<option value='" + url + "' data-raw-url='" + url + "'>" + title + "</option>")
\t    // button-stile download-widget
\t    jQuery("#post-{$post->ID} .episode_download_list").append("<li><a href='" + url + "'>" + title + "<span class='size'></span></a></li>")
\t  }
\t});
});
EOF;
            }
            $content .= '    /* --> */';
            $content .= '</script>';
            return $content;
        });
        return $content . $bitlove_html;
    }
 /**
  * Save post data on WordPress callback.
  * 
  * @param  int $post_id
  */
 public function save_postdata($post_id)
 {
     global $wpdb;
     if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
         return;
     }
     if (empty($_POST['podlove_noncename']) || !wp_verify_nonce($_POST['podlove_noncename'], \Podlove\PLUGIN_FILE)) {
         return;
     }
     // Check permissions
     if ('podcast' !== $_POST['post_type'] || !current_user_can('edit_post', $post_id)) {
         return;
     }
     if (!isset($_POST['_podlove_meta']) || !is_array($_POST['_podlove_meta'])) {
         return;
     }
     do_action('podlove_save_episode', $post_id, $_POST['_podlove_meta']);
     // sanitize data
     $episode_data = filter_input_array(INPUT_POST, ['_podlove_meta' => ['flags' => FILTER_REQUIRE_ARRAY]]);
     $episode_data = $episode_data['_podlove_meta'];
     $episode_data_filter = ['title' => ['flags' => FILTER_FLAG_NO_ENCODE_QUOTES, 'filter' => FILTER_SANITIZE_STRING], 'subtitle' => ['flags' => FILTER_FLAG_NO_ENCODE_QUOTES, 'filter' => FILTER_SANITIZE_STRING], 'summary' => ['flags' => FILTER_FLAG_NO_ENCODE_QUOTES, 'filter' => FILTER_SANITIZE_STRING], 'slug' => FILTER_SANITIZE_STRING, 'duration' => FILTER_SANITIZE_STRING, 'episode_assets' => ['flags' => FILTER_REQUIRE_ARRAY, 'filter' => FILTER_SANITIZE_STRING], 'guid' => FILTER_SANITIZE_STRING];
     $episode_data_filter = apply_filters('podlove_episode_data_filter', $episode_data_filter);
     $episode_data = filter_var_array($episode_data, $episode_data_filter);
     // save changes
     $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post_id);
     $episode_slug_has_changed = isset($episode_data['slug']) && $episode_data['slug'] != $episode->slug;
     $episode->update_attributes($episode_data);
     if ($episode_slug_has_changed) {
         $episode->refetch_files();
     }
     if (isset($episode_data['episode_assets'])) {
         $this->save_episode_assets($episode, $episode_data['episode_assets']);
     } else {
         $this->save_episode_assets($episode, array());
     }
 }
Esempio n. 12
0
function create_episode()
{
    $slug = isset($_REQUEST['slug']) ? $_REQUEST['slug'] : NULL;
    $title = isset($_REQUEST['title']) ? $_REQUEST['title'] : NULL;
    if (!$slug || !$title) {
        die;
    }
    $args = array('post_type' => 'podcast', 'post_title' => $title, 'post_content' => \Podlove\Podcast_Post_Type::$default_post_content);
    // create post
    $post_id = wp_insert_post($args);
    // link episode and release
    $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post_id);
    $episode->slug = $slug;
    $episode->enable = true;
    $episode->active = true;
    $episode->save();
    // activate all media files
    $episode_assets = Model\EpisodeAsset::all();
    foreach ($episode_assets as $episode_asset) {
        $media_file = new \Podlove\Model\MediaFile();
        $media_file->episode_id = $episode->id;
        $media_file->episode_asset_id = $episode_asset->id;
        $media_file->save();
    }
    // generate response
    $result = array();
    $result['post_id'] = $post_id;
    $result['post_edit_url'] = get_edit_post_link($post_id);
    header('Cache-Control: no-cache, must-revalidate');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Content-type: application/json');
    echo json_encode($result);
    die;
}
Esempio n. 13
0
 /**
  * Save post data on WordPress callback.
  * 
  * @param  int $post_id
  */
 public function save_postdata($post_id)
 {
     global $wpdb;
     if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
         return;
     }
     if (empty($_POST['podlove_noncename']) || !wp_verify_nonce($_POST['podlove_noncename'], \Podlove\PLUGIN_FILE)) {
         return;
     }
     // Check permissions
     if ('podcast' == $_POST['post_type']) {
         if (!current_user_can('edit_post', $post_id)) {
             return;
         }
     } else {
         return;
     }
     if (!isset($_POST['_podlove_meta']) || !is_array($_POST['_podlove_meta'])) {
         return;
     }
     // save changes
     $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post_id);
     $episode_slug_has_changed = isset($_POST['_podlove_meta']['slug']) && $_POST['_podlove_meta']['slug'] != $episode->slug;
     $episode->update_attributes($_POST['_podlove_meta']);
     if ($episode_slug_has_changed) {
         $episode->refetch_files();
     }
     // copy chapter info into custom meta for webplayer compatibility
     update_post_meta($post_id, '_podlove_chapters', $episode->chapters);
     if (isset($_REQUEST['_podlove_meta']['episode_assets'])) {
         $this->save_episode_assets($episode, $_REQUEST['_podlove_meta']['episode_assets']);
     } else {
         $this->save_episode_assets($episode, array());
     }
     \Podlove\clear_all_caches();
     // mainly for feeds
 }
 private function get_episode_cover($post_id)
 {
     $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post_id);
     if ($this->get_module_option('adn_poster_image_fallback') == 'on') {
         $cover = $episode->cover_art_with_fallback()->url();
     } else {
         $cover = $episode->cover_art()->url();
     }
     if (empty($cover)) {
         return;
     }
     $cover_info = getimagesize($cover);
     return array("type" => "net.app.core.oembed", "value" => array("type" => "photo", "version" => "1.0", "width" => $cover_info[0], "height" => $cover_info[1], "url" => $cover, "thumbnail_width" => $cover_info[0], "thumbnail_height" => $cover_info[1], "thumbnail_url" => $cover));
 }
function migrate_post($post_id)
{
    $post = get_post($post_id);
    $migration_settings = get_option('podlove_migration', array());
    $post_content = $post->post_content;
    if ($migration_settings['cleanup']['player']) {
        $post_content = preg_replace('/\\[(powerpress|podloveaudio|podlovevideo|display_podcast)[^\\]]*\\]/', '', $post_content);
    }
    $new_post = array('menu_order' => $post->menu_order, 'comment_status' => $post->comment_status, 'ping_status' => $post->ping_status, 'post_author' => $post->post_author, 'post_content' => $post_content, 'post_excerpt' => $post->post_excerpt, 'post_mime_type' => $post->post_mime_type, 'post_parent' => $post_id, 'post_password' => $post->post_password, 'post_status' => 'pending', 'post_title' => $post->post_title, 'post_type' => 'podcast', 'post_date' => $post->post_date, 'post_date_gmt' => get_gmt_from_date($post->post_date));
    $new_slug = NULL;
    switch ($migration_settings['post_slug']) {
        case 'wordpress':
            $new_slug = $post->post_name;
            break;
        case 'file':
            $new_slug = Assistant::get_file_slug($post);
            break;
        case 'number':
            $new_slug = Assistant::get_number_slug($post);
            break;
    }
    $override_slug = function ($data, $postarr) use($new_slug) {
        if ($new_slug) {
            $data['post_name'] = $new_slug;
        }
        return $data;
    };
    add_filter('wp_insert_post_data', $override_slug, 10, 2);
    $new_post_id = wp_insert_post($new_post);
    remove_filter('wp_insert_post_data', $override_slug, 10, 2);
    $new_post = get_post($new_post_id);
    // update guid
    update_post_meta($new_post_id, '_podlove_guid', $post->guid);
    // add redirect from previous url
    add_post_meta($new_post_id, 'podlove_alternate_url', get_permalink($post_id));
    // prevent adn module from triggering a post
    update_post_meta($new_post_id, '_podlove_episode_was_published', true);
    // migrate taxonomies
    $taxonomies = get_object_taxonomies(get_post_type($post_id));
    foreach ($taxonomies as $tax) {
        $terms = wp_get_object_terms($post_id, $tax);
        $term = array();
        foreach ($terms as $t) {
            $term[] = $t->slug;
        }
        wp_set_object_terms($new_post_id, $term, $tax);
    }
    $post_data = new Legacy_Post_Parser($post_id);
    $episode = Model\Episode::find_or_create_by_post_id($new_post_id);
    $episode->slug = Assistant::get_episode_slug($post, $migration_settings['slug']);
    $episode->duration = $post_data->get_duration();
    $episode->subtitle = $post_data->get_subtitle();
    $episode->summary = $post_data->get_summary();
    $episode->save();
    foreach (Model\EpisodeAsset::all() as $asset) {
        Model\MediaFile::find_or_create_by_episode_id_and_episode_asset_id($episode->id, $asset->id);
    }
    // copy all meta
    $meta = get_post_meta($post_id);
    foreach ($meta as $key => $values) {
        if (!in_array($key, array('enclosure', '_podPressPostSpecific', '_podPressMedia')) || !$migration_settings['cleanup']['enclosures']) {
            foreach ($values as $value) {
                add_post_meta($new_post_id, $key, $value);
            }
        }
    }
    // copy all comments
    $comments_map = array();
    // map old comment IDs to new comment IDs
    foreach (get_comments(array('post_id' => $post_id, 'order' => 'ASC')) as $comment) {
        $old_comment_id = $comment->comment_ID;
        $comment->comment_post_ID = $new_post_id;
        if ($comment->comment_parent && isset($comments_map[$comment->comment_parent])) {
            $comment->comment_parent = $comments_map[$comment->comment_parent];
        }
        $new_comment_id = wp_insert_comment((array) $comment);
        $comments_map[$old_comment_id] = $new_comment_id;
    }
    return $new_post_id;
}
Esempio n. 16
0
/**
 * Provides shortcode to display web player.
 *
 * Right now there is only audio support.
 *
 * Usage:
 * 	[podlove-web-player]
 * 	
 * @param  array $options
 * @return string
 */
function webplayer_shortcode($options)
{
    global $post;
    $episode = Model\Episode::find_or_create_by_post_id($post->ID);
    $podcast = Model\Podcast::get_instance();
    $formats_data = get_option('podlove_webplayer_formats');
    if (!count($formats_data)) {
        return;
    }
    $available_formats = array();
    $audio_formats = array('mp3', 'mp4', 'ogg');
    foreach ($audio_formats as $audio_format) {
        $episode_asset = Model\EpisodeAsset::find_by_id($formats_data['audio'][$audio_format]);
        if (!$episode_asset) {
            continue;
        }
        $media_file = Model\MediaFile::find_by_episode_id_and_episode_asset_id($episode->id, $episode_asset->id);
        if ($media_file) {
            $available_formats[] = sprintf('%s="%s"', $audio_format, $media_file->get_file_url());
        }
    }
    $chapters = '';
    if ($episode->chapters) {
        $chapters = 'chapters="_podlove_chapters"';
    }
    return do_shortcode('[podloveaudio ' . implode(' ', $available_formats) . ' ' . $chapters . ']');
}
Esempio n. 17
0
 public function default_excerpt_to_episode_summary($excerpt)
 {
     global $post;
     $episode = \Podlove\Model\Episode::find_or_create_by_post_id($post->ID);
     return $episode && strlen($episode->summary) > 0 ? $episode->summary : $excerpt;
 }