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(" ", " ", $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: {$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()); } }
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; }
/** * 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; }
/** * 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 . ']'); }
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; }