/** * Fetch form data for EpisodeAssets multiselect. * * @param \Podlove\Model\Episode $episode * @return array */ public static function episode_assets_form($episode) { $episode_assets = Model\EpisodeAsset::all(); // field to generate option list $asset_options = array(); // values for option list $asset_values = array(); foreach ($episode_assets as $asset) { if (!($file_type = $asset->file_type())) { continue; } // get formats configured for this show $asset_options[$asset->id] = $asset->title; // find out which formats are active $asset_values[$asset->id] = NULL !== Model\MediaFile::find_by_episode_id_and_episode_asset_id($episode->id, $asset->id); } // FIXME: empty checkbox -> no file id // solution: when one checks the box, an AJAX request has to create and validate the file $episode_assets_form = array('label' => __('Media Files', 'podlove'), 'description' => '', 'options' => $asset_options, 'default' => true, 'multi_values' => $asset_values, 'multiselect_callback' => function ($asset_id) use($episode) { $asset = \Podlove\Model\EpisodeAsset::find_by_id($asset_id); $format = $asset->file_type(); $file = \Podlove\Model\MediaFile::find_by_episode_id_and_episode_asset_id($episode->id, $asset->id); $attributes = array('data-template' => $asset->url_template, 'data-extension' => $format->extension, 'data-size' => is_object($file) ? $file->size : 0, 'data-episode-asset-id' => $asset->id, 'data-episode-id' => $episode->id); if ($file) { $attributes['data-id'] = $file->id; } $out = ''; foreach ($attributes as $key => $value) { $out .= sprintf('%s="%s" ', $key, $value); } return $out; }); if (empty($asset_options)) { $episode_assets_form['description'] = sprintf('<span style="color: red">%s</span>', __('You need to configure feeds for this show. No feeds, no fun.', 'podlove')) . ' ' . sprintf('<a href="%s">%s</a>', admin_url('admin.php?page=podlove_shows_settings_handle&action=edit&show=' . $show->id), __('Edit this show', 'podlove')); } return $episode_assets_form; }
/** * Get playable files for player, based on episode and player assignments. * * @param array $formats array of formats like mp3, mp3, ogg, opus, webm * @param string $media_type audio or video * @return array of \Podlove\Model\MediaFile */ private function get_playable_files($formats, $media_type) { $playable_files = array(); foreach ($formats as $format) { if (!isset($this->player_format_assignments[$media_type][$format])) { continue; } $episode_asset = EpisodeAsset::find_by_id($this->player_format_assignments[$media_type][$format]); if (!$episode_asset) { continue; } $media_file = MediaFile::find_by_episode_id_and_episode_asset_id($this->episode->id, $episode_asset->id); if ($media_file && $media_file->is_valid()) { $playable_files[] = $media_file; } } return $playable_files; }
public function update_asset_position() { $asset_id = (int) $_REQUEST['asset_id']; $position = (double) $_REQUEST['position']; Model\EpisodeAsset::find_by_id($asset_id)->update_attributes(array('position' => $position)); die; }
/** * Fetch form data for EpisodeAssets multiselect. * * @param \Podlove\Model\Episode $episode * @return array */ public static function episode_assets_form($episode) { $episode_assets = Model\EpisodeAsset::all(); // field to generate option list $asset_options = array(); // values for option list $asset_values = array(); foreach ($episode_assets as $asset) { if (!($file_type = $asset->file_type())) { continue; } // get formats configured for this show $asset_options[$asset->id] = $asset->title; // find out which formats are active $asset_values[$asset->id] = NULL !== Model\MediaFile::find_by_episode_id_and_episode_asset_id($episode->id, $asset->id); } // FIXME: empty checkbox -> no file id // solution: when one checks the box, an AJAX request has to create and validate the file $episode_assets_form = array('label' => __('Media Files', 'podlove'), 'description' => '', 'options' => $asset_options, 'default' => true, 'multi_values' => $asset_values, 'before' => function () { ?> <table class='media_file_table' border="0" cellspacing="0"> <tr> <th><?php echo __('Enable', 'podlove'); ?> </th> <th><?php echo __('Asset', 'podlove'); ?> </th> <th><?php echo __('Asset File Name', 'podlove'); ?> </th> <th><?php echo __('Filesize', 'podlove'); ?> </th> <th><?php echo __('Status', 'podlove'); ?> </th> <th></th> </tr> <?php }, 'after' => function () { ?> </table> <p> <span class="description"> <?php echo __('Media File Base URL', 'podlove') . ': ' . \Podlove\Model\Podcast::get()->media_file_base_uri; ?> </span> </p> <?php }, 'around_each' => function ($callback) { ?> <tr class="media_file_row"> <td class="enable"> </td> <td class="asset"> <?php call_user_func($callback); ?> </td> <td class="url"></td> <td class="size"></td> <td class="status"></td> <td class="update"></td> </tr> <?php }, 'multiselect_callback' => function ($asset_id) use($episode) { $asset = \Podlove\Model\EpisodeAsset::find_by_id($asset_id); $format = $asset->file_type(); $file = \Podlove\Model\MediaFile::find_by_episode_id_and_episode_asset_id($episode->id, $asset->id); $size = is_object($file) ? (int) $file->size : 0; if ($size === 1) { $size = "unknown"; } $attributes = array('data-template' => \Podlove\Model\Podcast::get()->get_url_template(), 'data-size' => $size, 'data-episode-asset-id' => $asset->id, 'data-episode-id' => $episode->id, 'data-file-url' => is_object($file) ? $file->get_file_url() : ''); if ($file) { $attributes['data-id'] = $file->id; } $out = ''; foreach ($attributes as $key => $value) { $out .= sprintf('%s="%s" ', $key, $value); } return $out; }); if (empty($asset_options)) { $episode_assets_form['description'] = sprintf('<span style="color: red">%s</span>', __('You need to configure assets for this show. No assets, no fun.', 'podlove')) . ' ' . sprintf('<a href="%s">%s</a>', admin_url('admin.php?page=podlove_episode_assets_settings_handle'), __('Configure Assets', 'podlove')); } return $episode_assets_form; }
/** * 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 . ']'); }
private function edit_template() { $episode_asset = \Podlove\Model\EpisodeAsset::find_by_id($_REQUEST['episode_asset']); echo '<h3>' . sprintf(__('Edit Episode Asset: %s', 'podlove'), $episode_asset->title) . '</h3>'; $this->form_template($episode_asset, 'save'); }
/** * Return real file URL * * For public facing URLs, use ::get_public_file_url(). * * @return string */ public function get_file_url() { return $this->with_blog_scope(function () { $podcast = Podcast::get(); $episode = $this->episode(); $episode_asset = EpisodeAsset::find_by_id($this->episode_asset_id); $file_type = FileType::find_by_id($episode_asset->file_type_id); if (!$episode_asset || !$file_type || !$episode) { return ''; } $template = $podcast->get_url_template(); $template = apply_filters('podlove_file_url_template', $template); $template = str_replace('%media_file_base_url%', trailingslashit($podcast->media_file_base_uri), $template); $template = str_replace('%episode_slug%', \Podlove\slugify($episode->slug), $template); $template = str_replace('%suffix%', $episode_asset->suffix, $template); $template = str_replace('%format_extension%', $file_type->extension, $template); return trim($template); }); }
/** * Get playable files for player, based on episode and player assignments. * * @param array $formats array of formats like mp3, mp3, ogg, opus, webm * @param string $media_type audio or video * @return array of \Podlove\Model\MediaFile */ private function get_playable_files($formats, $media_type) { $playable_files = []; $player_format_assignments = get_option('podlove_webplayer_formats'); if (empty($player_format_assignments)) { error_log(print_r("Podlove Web Player: No assets are assigned.", true)); return []; } foreach ($formats as $format) { if (!isset($player_format_assignments[$media_type][$format])) { continue; } $episode_asset = EpisodeAsset::find_by_id($player_format_assignments[$media_type][$format]); if (!$episode_asset) { continue; } $media_file = MediaFile::find_by_episode_id_and_episode_asset_id($this->episode->id, $episode_asset->id); if ($media_file && $media_file->is_valid()) { $playable_files[] = $media_file; } } return $playable_files; }