diff options
Diffstat (limited to 'plugins/jetpack/modules/videopress-v2')
19 files changed, 0 insertions, 4471 deletions
diff --git a/plugins/jetpack/modules/videopress-v2/class.jetpack-videopress.php b/plugins/jetpack/modules/videopress-v2/class.jetpack-videopress.php deleted file mode 100644 index 39479842..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.jetpack-videopress.php +++ /dev/null @@ -1,264 +0,0 @@ -<?php - -/** - * VideoPress in Jetpack - * - */ -class Jetpack_VideoPress { - /** @var string */ - public $module = 'videopress'; - - /** @var int */ - public $version = 5; - - /** - * Singleton - */ - public static function init() { - static $instance = false; - - if ( ! $instance ) { - $instance = new Jetpack_VideoPress; - } - - return $instance; - } - - /** - * Jetpack_VideoPress constructor. - * - * Sets up the initializer and makes sure that videopress activates and deactivates properly. - */ - private function __construct() { - //$this->version = time(); // <s>ghost</s> cache busters! - add_action( 'init', array( $this, 'on_init' ) ); - add_action( 'jetpack_deactivate_module_videopress', array( $this, 'jetpack_module_deactivated' ) ); - } - - /** - * Fires on init - */ - public function on_init() { - add_action( 'wp_enqueue_media', array( $this, 'enqueue_admin_scripts' ) ); - add_filter( 'plupload_default_settings', array( $this, 'videopress_pluploder_config' ) ); - add_filter( 'wp_get_attachment_url', array( $this, 'update_attachment_url_for_videopress' ), 10, 2 ); - - add_action( 'admin_print_footer_scripts', array( $this, 'print_in_footer_open_media_add_new' ) ); - - add_action( 'admin_menu', array( $this,'change_add_new_menu_location' ), 999 ); - - VideoPress_Scheduler::init(); - VideoPress_XMLRPC::init(); - } - - /** - * Runs when the VideoPress module is deactivated. - */ - public function jetpack_module_deactivated() { - VideoPress_Options::delete_options(); - } - - /** - * A can of coke - * - * Similar to current_user_can, but internal to VideoPress. Returns - * true if the given VideoPress capability is allowed by the given user. - */ - public function can( $cap, $user_id = false ) { - if ( ! $user_id ) { - $user_id = get_current_user_id(); - } - - // Connection owners are allowed to do all the things. - if ( $this->is_connection_owner( $user_id ) ) { - return true; - } - - // Additional and internal caps checks - - if ( ! user_can( $user_id, 'upload_files' ) ) { - return false; - } - - if ( 'edit_videos' == $cap && ! user_can( $user_id, 'edit_others_posts' ) ) { - return false; - } - - if ( 'delete_videos' == $cap && ! user_can( $user_id, 'delete_others_posts' ) ) { - return false; - } - - return true; - } - - /** - * Returns true if the provided user is the Jetpack connection owner. - */ - public function is_connection_owner( $user_id = false ) { - if ( ! $user_id ) { - $user_id = get_current_user_id(); - } - - $user_token = Jetpack_Data::get_access_token( JETPACK_MASTER_USER ); - - return $user_token && is_object( $user_token ) && isset( $user_token->external_user_id ) && $user_id === $user_token->external_user_id; - } - - /** - * Register VideoPress admin scripts. - */ - public function enqueue_admin_scripts() { - if ( did_action( 'videopress_enqueue_admin_scripts' ) ) { - return; - } - - if ( $this->should_override_media_uploader() ) { - // We're going to replace the standard wp-plupload with our own ... messy, I know, but as of now the - // hooks in it are not good enough for us to be able to override / add in just the code we need. - // P.S. Please don't take this as an example of good behavior, this is a temporary fix until I - // can get a more permanent action / filter system added into the core wp-plupload.js to make this - // type of override unnecessary. - wp_dequeue_script( 'wp-plupload' ); - - wp_enqueue_script( - 'videopress-plupload', - plugins_url( 'js/videopress-plupload.js', __FILE__ ), - array( - 'jquery' - ), - $this->version - ); - - wp_enqueue_script( - 'videopress-uploader', - plugins_url( 'js/videopress-uploader.js', __FILE__ ), - array( - 'videopress-plupload' - ), - $this->version - ); - } - - wp_enqueue_style( 'videopress-admin', plugins_url( 'videopress-admin.css', __FILE__ ), array(), $this->version ); - - /** - * Fires after VideoPress scripts are enqueued in the dashboard. - * - * @since 2.5.0 - */ - do_action( 'videopress_enqueue_admin_scripts' ); - } - - /** - * An override for the attachment url, which returns back the WPCOM videopress original url, - * if it is set to the the objects metadata. this allows us to show the original uploaded - * file on the WPCOM architecture, instead of the locally uplodaded file, - * which doeasn't exist. - * - * @param string $url - * @param int $post_id - * - * @return mixed - */ - public function update_attachment_url_for_videopress( $url, $post_id ) { - - if ( get_post_mime_type( $post_id ) === 'video/videopress' ) { - $meta = wp_get_attachment_metadata( $post_id ); - - if ( isset( $meta['original']['url'] ) ) { - $url = $meta['original']['url']; - } - } - - return $url; - } - - /** - * Modify the default plupload config to turn on videopress specific filters. - */ - public function videopress_pluploder_config( $config ) { - - if ( ! isset( $config['filters']['max_file_size'] ) ) { - $config['filters']['max_file_size'] = wp_max_upload_size() . 'b'; - } - - $config['filters']['videopress_check_uploads'] = $config['filters']['max_file_size']; - - // We're doing our own check in the videopress_check_uploads filter. - unset( $config['filters']['max_file_size'] ); - - return $config; - } - - - /** - * Helper function to determine if the media uploader should be overridden. - * - * The rules are simple, only try to load the script when on the edit post or new post pages. - * - * @return bool - */ - protected function should_override_media_uploader() { - global $pagenow; - - // Only load in the admin - if ( ! is_admin() ) { - return false; - } - - // Only load on the post, new post, or upload pages. - if ( $pagenow !== 'post-new.php' && $pagenow !== 'post.php' && $pagenow !== 'upload.php' ) { - return false; - } - - $options = VideoPress_Options::get_options(); - - return $options['shadow_blog_id'] > 0; - } - - /** - * A work-around / hack to make it possible to go to the media library with the add new box open. - * - * @return bool - */ - public function print_in_footer_open_media_add_new() { - global $pagenow; - - // Only load in the admin - if ( ! is_admin() ) { - return false; - } - - if ( $pagenow !== 'upload.php' ) { - return false; - } - - if ( ! isset ( $_GET['action'] ) || $_GET['action'] !== 'add-new' ) { - return false; - } - - ?> - <script type="text/javascript"> - ( function( $ ) { - window.setTimeout( function() { - $('#wp-media-grid .page-title-action').click(); - }, 500 ); - - }( jQuery ) ); - </script> - <?php - } - - /** - * Changes the add new menu location, so that VideoPress will be enabled - * when a user clicks that button. - */ - public function change_add_new_menu_location() { - $page = remove_submenu_page( 'upload.php', 'media-new.php' ); - - add_submenu_page( 'upload.php', $page[0], $page[0], 'upload_files', 'upload.php?action=add-new'); - } -} - -// Initialize the module. -Jetpack_VideoPress::init(); diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-ajax.php b/plugins/jetpack/modules/videopress-v2/class.videopress-ajax.php deleted file mode 100644 index d983dd64..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-ajax.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php - -class VideoPress_AJAX { - - /** - * @var VideoPress_AJAX - **/ - private static $instance = null; - - /** - * Private VideoPress_AJAX constructor. - * - * Use the VideoPress_AJAX::init() method to get an instance. - */ - private function __construct() { - add_action( 'wp_ajax_videopress-get-upload-token', array( $this, 'wp_ajax_videopress_get_upload_token' ) ); - - add_action( 'wp_ajax_videopress-update-transcoding-status', array( - $this, - 'wp_ajax_update_transcoding_status' - ), -1 ); - } - - /** - * Initialize the VideoPress_AJAX and get back a singleton instance. - * - * @return VideoPress_AJAX - */ - public static function init() { - if ( is_null( self::$instance ) ) { - self::$instance = new VideoPress_AJAX; - } - - return self::$instance; - } - - /** - * Ajax method that is used by the VideoPress uploader to get a token to upload a file to the wpcom api. - * - * @return void - */ - public function wp_ajax_videopress_get_upload_token() { - - $options = VideoPress_Options::get_options(); - - $args = array( - 'method' => 'POST', - ); - - $endpoint = "sites/{$options['shadow_blog_id']}/media/token"; - $result = Jetpack_Client::wpcom_json_api_request_as_blog( $endpoint, Jetpack_Client::WPCOM_JSON_API_VERSION, $args ); - - if ( is_wp_error( $result ) ) { - wp_send_json_error( array( 'message' => __( 'Could not obtain a VideoPress upload token. Please try again later.', 'jetpack' ) ) ); - return; - } - - $response = json_decode( $result['body'], true ); - - if ( empty( $response['upload_token'] ) ) { - wp_send_json_error( array( 'message' => __( 'Could not obtain a VideoPress upload token. Please try again later.', 'jetpack' ) ) ); - return; - } - - $title = sanitize_title( basename( $_POST['filename'] ) ); - - $response['upload_action_url'] = videopress_make_media_upload_path( $options['shadow_blog_id'] ); - $response['upload_media_id'] = videopress_create_new_media_item( $title ); - - wp_send_json_success( $response ); - } - - /** - * Ajax action to update the video transcoding status from the WPCOM API. - * - * @return void - */ - public function wp_ajax_update_transcoding_status() { - if ( ! isset( $_POST['post_id'] ) ) { - wp_send_json_error( array( 'message' => __( 'A valid post_id is required.', 'jetpack' ) ) ); - return; - } - - $post_id = (int) $_POST['post_id']; - - if ( ! videopress_update_meta_data( $post_id ) ) { - wp_send_json_error( array( 'message' => __( 'That post does not have a VideoPress video associated to it..', 'jetpack' ) ) ); - return; - } - - wp_send_json_success( array( - 'message' => __( 'Status updated', 'jetpack' ), - 'status' => videopress_get_transcoding_status( $post_id ) - ) ); - } -} - -// Let's start this thing up. -VideoPress_AJAX::init();
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-cli.php b/plugins/jetpack/modules/videopress-v2/class.videopress-cli.php deleted file mode 100644 index e038dff4..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-cli.php +++ /dev/null @@ -1,172 +0,0 @@ -<?php - -if ( defined( 'WP_CLI' ) && WP_CLI ) { - - /** - * VideoPress command line utilities. - */ - class VideoPress_CLI extends WP_CLI_Command { - /** - * Import a VideoPress Video - * - * ## OPTIONS - * - * <guid>: Import the video with the specified guid - * - * ## EXAMPLES - * - * wp videopress import kUJmAcSf - * - */ - public function import( $args ) { - $guid = $args[0]; - $attachment_id = create_local_media_library_for_videopress_guid( $guid ); - if ( $attachment_id && ! is_wp_error( $attachment_id ) ) { - WP_CLI::success( sprintf( __( 'The video has been imported as Attachment ID %d', 'jetpack' ), $attachment_id ) ); - } else { - WP_CLI::error( __( 'An error has been encountered.', 'jetpack' ) ); - } - } - - /** - * Manually runs the job to cleanup videos from the media library that failed during the upload process. - * - * ## EXAMPLES - * - * wp videopress cleanup_videos - */ - public function cleanup_videos() { - $num_cleaned = videopress_cleanup_media_library(); - - WP_CLI::success( sprintf( __( 'Cleaned up a total of %d videos.', 'jetpack' ), $num_cleaned ) ); - } - - /** - * List out all of the crons that can be run. - * - * ## EXAMPLES - * - * wp videopress list_crons - */ - public function list_crons() { - - $scheduler = VideoPress_Scheduler::init(); - $crons = $scheduler->get_crons(); - - $schedules = wp_get_schedules(); - - - if ( count( $crons ) === 0 ) { - WP_CLI::success( __( 'Found no available cron jobs.', 'jetpack' ) ); - - } elseif ( count( $crons ) === 1 ) { - WP_CLI::success( __( 'Found 1 available cron job.', 'jetpack' ) ); - - } else { - WP_CLI::success( sprintf( __( 'Found %d available cron jobs.', 'jetpack' ), count( $crons ) ) ); - } - - foreach ( $crons as $cron_name => $cron ) { - $interval = isset( $schedules[ $cron['interval'] ]['display'] ) ? $schedules[ $cron['interval'] ]['display'] : $cron['interval']; - $runs_next = $scheduler->check_cron( $cron_name ); - $status = $runs_next ? sprintf( 'Scheduled - Runs Next at %s GMT', gmdate( 'Y-m-d H:i:s', $runs_next ) ) : 'Not Scheduled'; - - WP_CLI::log( 'Name: ' . $cron_name ); - WP_CLI::log( 'Method: ' . $cron['method'] ); - WP_CLI::log( 'Interval: ' . $interval ); - WP_CLI::log( 'Status: ' . $status ); - } - } - - /** - * Checks for the current status of a cron job. - * - * ## OPTIONS - * - * <cron_name>: The name of the cron job to check - * - * ## EXAMPLES - * - * wp videopress cron_status cleanup - */ - public function cron_status( $args ) { - - if ( ! isset( $args[0] ) ) { - return WP_CLI::error( __( 'You need to provide the name of the cronjob to schedule.', 'jetpack' ) ); - } - - $scheduler = VideoPress_Scheduler::init(); - - if ( ! $scheduler->is_cron_valid( $args[0] ) ) { - return WP_CLI::error( sprintf( __( 'There is no cron named %s.', 'jetpack' ), $args[0] ) ); - } - - $time = $scheduler->check_cron( $args[0] ); - - if ( ! $time ) { - WP_CLI::success( __( 'The cron is not scheduled to run.', 'jetpack' ) ); - - } else { - WP_CLI::success( sprintf( __( 'Cron will run at: %s GMT', 'jetpack' ), gmdate( 'Y-m-d H:i:s', $time ) ) ); - } - } - - /** - * Actives the given cron job - * - * ## OPTIONS - * - * <cron_name>: The name of the cron job to check - * - * ## EXAMPLES - * - * wp videopress activate_cron cleanup - */ - public function activate_cron( $args ) { - - if ( ! isset( $args[0] ) ) { - WP_CLI::error( __( 'You need to provide the name of the cronjob to schedule.', 'jetpack' ) ); - } - - $scheduler = VideoPress_Scheduler::init(); - - if ( ! $scheduler->is_cron_valid( $args[0] ) ) { - return WP_CLI::error( sprintf( __( 'There is no cron named %s.', 'jetpack' ), $args[0] ) ); - } - - $scheduler->activate_cron( $args[0] ); - - WP_CLI::success( sprintf( __( 'The cron named `%s` was scheduled.', 'jetpack' ), $args[0] ) ); - } - - /** - * Actives the given cron job - * - * ## OPTIONS - * - * <cron_name>: The name of the cron job to check - * - * ## EXAMPLES - * - * wp videopress deactivate_cron cleanup - */ - public function deactivate_cron( $args ) { - - if ( ! isset( $args[0] ) ) { - WP_CLI::error( __( 'You need to provide the name of the cronjob to schedule.', 'jetpack' ) ); - } - - $scheduler = VideoPress_Scheduler::init(); - - if ( ! $scheduler->is_cron_valid( $args[0] ) ) { - return WP_CLI::error( sprintf( __( 'There is no cron named %s.', 'jetpack' ), $args[0] ) ); - } - - $scheduler->deactivate_cron( $args[0] ); - - WP_CLI::success( sprintf( __( 'The cron named `%s` was removed from the schedule.', 'jetpack' ), $args[0] ) ); - } - } - - WP_CLI::add_command( 'videopress', 'VideoPress_CLI' ); -}
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-edit-attachment.php b/plugins/jetpack/modules/videopress-v2/class.videopress-edit-attachment.php deleted file mode 100644 index de03e0a7..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-edit-attachment.php +++ /dev/null @@ -1,380 +0,0 @@ -<?php -/** - * VideoPress edit attachment screen - * - * @since 4.1 - */ -class VideoPress_Edit_Attachment { - - /** - * Singleton method to initialize the object only once. - * - * @return VideoPress_Edit_Attachment - */ - public static function init() { - static $instance = null; - - if ( ! $instance ) { - $instance = new VideoPress_Edit_Attachment(); - } - - return $instance; - } - - /** - * VideoPress_Edit_Attachment constructor. - * - * Adds in appropriate actions for attachment fields editor, meta boxes and saving. - */ - public function __construct() { - add_filter( 'attachment_fields_to_edit', array( $this, 'fields_to_edit' ), 10, 2 ); - add_filter( 'attachment_fields_to_save', array( $this, 'save_fields' ), 10, 2 ); - add_filter( 'wp_ajax_save-attachment', array( $this, 'save_fields' ), -1 ); - add_filter( 'wp_ajax_save-attachment-compat', array( $this, 'save_fields' ), -1 ); - - add_action( 'add_meta_boxes', array( $this, 'configure_meta_boxes' ), 10, 2 ); - } - - /** - * @param string $post_type - * @param object $post - */ - public function configure_meta_boxes( $post_type = 'unknown', $post = NULL ) { - if ( NULL == $post ) { - $post = (object) array ( 'ID' => 0 ); - } - - if ( 'attachment' != $post_type ) { - return; - } - - $meta = wp_get_attachment_metadata( $post->ID ); - - // If this has not been processed by videopress, we can skip the rest. - if ( ! isset( $meta['videopress'] ) ) { - return; - } - - add_meta_box( 'videopress-media-info', __( 'VideoPress Information', 'jetpack' ), array( $this, 'videopress_information_box' ), 'attachment', 'side', 'core' ); - } - - /** - * @param array $post - * @param array|null $attachment - * - * @return array - */ - public function save_fields( $post, $attachment = null ) { - if ( $attachment === null && isset( $_POST['attachment'] ) ) { - $attachment = $_POST['attachment']; - } - - if ( ! isset( $attachment['is_videopress_attachment'] ) || $attachment['is_videopress_attachment'] !== 'yes' ) { - return $post; - } - - $post_id = absint( $post['ID'] ); - - $meta = wp_get_attachment_metadata( $post_id ); - - // If this has not been processed by videopress, we can skip the rest. - if ( ! isset( $meta['videopress'] ) ) { - return $post; - } - - $values = array(); - - // Add the video title & description in, so that we save it properly. - if ( isset( $_POST['post_title'] ) ) { - $values['title'] = trim( strip_tags( $_POST['post_title'] ) ); - } - - if ( isset( $_POST['post_excerpt'] ) ) { - $values['description'] = trim( strip_tags( $_POST['post_excerpt'] ) ); - } - - if ( isset( $attachment['rating'] ) ) { - $rating = $attachment['rating']; - - if ( ! empty( $rating ) && in_array( $rating, array( 'G', 'PG-13', 'R-17', 'X-18' ) ) ) { - $values['rating'] = $rating; - } - } - - // We set a default here, as if it isn't selected, then we'll turn it off. - $values['display_embed'] = 0; - if ( isset( $attachment['display_embed'] ) ) { - $display_embed = $attachment['display_embed']; - - $values['display_embed'] = 'on' === $display_embed ? 1 : 0; - } - - $args = array( - 'method' => 'POST', - ); - - $endpoint = "videos/{$meta['videopress']['guid']}"; - $result = Jetpack_Client::wpcom_json_api_request_as_blog( $endpoint, Jetpack_Client::WPCOM_JSON_API_VERSION, $args, $values ); - - if ( is_wp_error( $result ) ) { - $post['errors']['videopress']['errors'][] = __( 'There was an issue saving your updates to the VideoPress service. Please try again later.', 'jetpack' ); - return $post; - } - - if ( isset( $values['display_embed'] ) ) { - $meta['videopress']['display_embed'] = $values['display_embed']; - } - - if ( isset( $values['rating'] ) ) { - $meta['videopress']['rating'] = $values['rating']; - } - - wp_update_attachment_metadata( $post_id, $meta ); - - $response = json_decode( $result['body'], true ); - - if ( 'true' !== $response ) { - return $post; - } - - return $post; - } - - - /** - * Get the upload api path. - * - * @param string $guid - * @return string - */ - public function make_video_api_path( $guid ) { - return sprintf( - '%s://%s/rest/v%s/videos/%s', - 'https', - 'public-api.wordpress.com', //JETPACK__WPCOM_JSON_API_HOST, - Jetpack_Client::WPCOM_JSON_API_VERSION, - $guid - ); - } - - - /** - * Creates an array of video fields to edit based on transcoded videos. - * - * @param array $fields video fields of interest - * @param stdClass $post post object - * @return array modified version of video fields for administrative interface display - */ - public function fields_to_edit( $fields, $post ) { - $post_id = absint( $post->ID ); - - $meta = wp_get_attachment_metadata( $post_id ); - - // If this has not been processed by videopress, we can skip the rest. - if ( ! isset( $meta['videopress'] ) ) { - return $fields; - } - - $info = (object) $meta['videopress']; - - unset( $fields['url'] ); - unset( $fields['post_content'] ); - - if ( isset( $info->files_status['std']['ogg'] ) && 'done' === $info->files_status['std']['ogg'] ) { - $v_name = preg_replace( '/\.\w+/', '', basename( $info->path ) ); - $video_name = $v_name . '_fmt1.ogv'; - $ogg_url = videopress_cdn_file_url( $info->guid, $video_name ); - - $fields['video-ogg'] = array( - 'label' => __( 'Ogg File URL', 'jetpack' ), - 'input' => 'html', - 'html' => "<input type='text' class='urlfield' readonly='readonly' name='attachments[$post_id][oggurl]' value='" . esc_url( $ogg_url, array( 'http', 'https' ) ) . "' />", - 'helps' => __( 'Location of the Ogg video file.', 'jetpack' ), - ); - } - - $fields['post_title']['helps'] = __( 'Title will appear on the first frame of your video', 'jetpack' ); - - $fields['post_excerpt']['label'] = _x( 'Description', 'A header for the short description display', 'jetpack' ); - $fields['post_excerpt']['input'] = 'textarea'; - $fields['post_excerpt']['value'] = $info->description; - - $fields['is_videopress_attachment'] = array( - 'input' => 'hidden', - 'value' => 'yes', - ); - - $fields['videopress_shortcode'] = array( - 'label' => _x( 'Shortcode', 'A header for the shortcode display', 'jetpack' ), - 'input' => 'html', - 'html' => "<input type=\"text\" name=\"videopress_shortcode\" value=\"[videopress {$info->guid}]\" readonly=\"readonly\"/>", - 'show_in_modal' => true, - 'show_in_edit' => false, - ); - - $fields['display_embed'] = array( - 'label' => _x( 'Share', 'A header for the video sharing options area', 'jetpack' ), - 'input' => 'html', - 'html' => $this->display_embed_choice( $info ) - ); - - $fields['video-rating'] = array( - 'label' => _x( 'Rating', 'A header for the video rating area', 'jetpack' ), - 'input' => 'html', - 'html' => $this->display_rating( $info ) - ); - - return $fields; - } - - /** - * @param stdClass $post - */ - public function videopress_information_box( $post ) { - $post_id = absint( $post->ID ); - - $meta = wp_get_attachment_metadata( $post_id ); - - // If this has not been processed by videopress, we can skip the rest. - if ( ! isset( $meta['videopress'] ) ) { - return; - } - - $info = (object) $meta['videopress']; - - $status = videopress_get_transcoding_status( $post_id ); - - $formats = array( - 'std_mp4' => 'Standard MP4', - 'std_ogg' => 'OGG Vorbis', - 'dvd_mp4' => 'DVD', - 'hd_mp4' => 'High Definition', - ); - - $embed = "[videopress {$info->guid}]"; - - $shortcode = '<input type="text" id="plugin-embed" readonly="readonly" style="width:180px;" value="' . esc_attr( $embed ) . '" onclick="this.focus();this.select();" />'; - - $trans_status = ''; - $all_trans_done = true; - foreach ( $formats as $status_key => $name ) { - if ( 'DONE' !== $status[ $status_key ] ) { - $all_trans_done = false; - } - - $trans_status .= '- <strong>' . $name . ":</strong> <span id=\"status_$status_key\">" . ( 'DONE' === $status[ $status_key ] ? 'Done' : 'Processing' ) . '</span><br>'; - } - - $nonce = wp_create_nonce( 'videopress-update-transcoding-status' ); - - $url = 'empty'; - if ( ! empty( $info->guid ) ) { - $url = videopress_build_url( $info->guid ); - $url = "<a href=\"{$url}\">{$url}</a>"; - } - - $poster = '<em>Still Processing</em>'; - if ( ! empty( $info->poster ) ) { - $poster = "<br><img src=\"{$info->poster}\" width=\"175px\">"; - } - - $status_update = ''; - if ( ! $all_trans_done ) { - $status_update = ' (<a href="javascript:;" id="videopress-update-transcoding-status">update</a>)'; - } - - $html = <<< HTML - -<div class="misc-pub-section misc-pub-shortcode"> - <strong>Shortcode</strong><br> - {$shortcode} -</div> -<div class="misc-pub-section misc-pub-url"> - <strong>Url</strong> - {$url} -</div> -<div class="misc-pub-section misc-pub-poster"> - <strong>Poster</strong> - {$poster} -</div> -<div class="misc-pub-section misc-pub-status"> - <strong>Transcoding Status$status_update:</strong> - <div id="videopress-transcoding-status">{$trans_status}</div> -</div> - - - -<script> - jQuery( function($) { - $( '#videopress-update-transcoding-status' ).on( "click", function() { - jQuery.ajax( { - type: 'post', - url: 'admin-ajax.php', - data: { - action: 'videopress-update-transcoding-status', - post_id: '{$post_id}', - _ajax_nonce: '{$nonce}' - }, - complete: function( response ) { - if ( 200 === response.status ) { - var statuses = response.responseJSON.data.status; - - for (var key in statuses) { - $('#status_' + key).text( 'DONE' === statuses[key] ? 'Done' : 'Processing' ); - } - } - } - }); - } ); - } ); -</script> -HTML; - - echo $html; - } - - /** - * Build HTML to display a form checkbox for embedcode display preference - * - * @param object $info database row from the videos table - * @return string input element of type checkbox set to checked state based on stored embed preference - */ - protected function display_embed_choice( $info ) { - $id = "attachments-{$info->post_id}-displayembed"; - $out = "<input type='checkbox' name='attachments[{$info->post_id}][display_embed]' id='$id'"; - if ( $info->display_embed ) - $out .= ' checked="checked"'; - $out .= " /><label for='$id'>" . __( 'Display share menu and allow viewers to embed or download this video', 'jetpack' ) . '</label>'; - return $out; - } - - /** - * Build HTML to display a form input radio button for video ratings - * - * @param object $info database row from the videos table - * @return string input elements of type radio with existing stored value selected - */ - protected function display_rating( $info ) { - $out = ''; - - $ratings = array( - 'G' => 'G', - 'PG-13' => 'PG-13', - 'R-17' => 'R', - 'X-18' => 'X', - ); - - foreach( $ratings as $r => $label ) { - $id = "attachments-{$info->post_id}-rating-$r"; - $out .= "<input type='radio' name='attachments[{$info->post_id}][rating]' id='$id' value='$r'"; - if ( $info->rating == $r ) - $out .= ' checked="checked"'; - $out .= " /><label for='$id'>$label</label>"; - unset( $id ); - } - return $out; - } -} - -// Let's start this thing up. -VideoPress_Edit_Attachment::init();
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-media-library.php b/plugins/jetpack/modules/videopress-v2/class.videopress-media-library.php deleted file mode 100644 index 9d78c3ac..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-media-library.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php - -class VideoPress_Media_Library { - - /** - * @var VideoPress_Media_Library - **/ - private static $instance = null; - - /** - * Private VideoPress_Media_Library constructor. - * - * Use the VideoPress_Media_Library::init() method to get an instance. - */ - private function __construct() { - add_filter( 'ajax_query_attachments_args', array( $this, 'ajax_query_attachments_args' ), 10, 1 ); - add_action( 'pre_get_posts', array( $this, 'media_list_table_query' ) ); - } - - /** - * Initialize the VideoPress_Media_Library and get back a singleton instance. - * - * @return VideoPress_Media_Library - */ - public static function init() { - if ( is_null( self::$instance ) ) { - self::$instance = new VideoPress_Media_Library; - } - - return self::$instance; - } - - /** - * Media Grid: - * Filter out any videopress video posters that we've downloaded, - * so that they don't seem to display twice. - * - * @param array $args - * - * @return array - */ - public function ajax_query_attachments_args( $args ) { - - $args['meta_query'] = $this->add_status_check_to_meta_query( isset( $args['meta_query'] ) ? $args['meta_query'] : array() ); - - return $args; - } - - /** - * Media List: - * Do the same as ^^ but for the list view. - * - * @param WP_Query $query - * - * @return array - */ - public function media_list_table_query( $query ) { - if ( is_admin() && $query->is_main_query() && ( 'upload' === get_current_screen()->id ) ) { - $meta_query = $this->add_status_check_to_meta_query( $query->get( 'meta_query' ) ); - - $query->set( 'meta_query', $meta_query ); - } - } - - /** - * Add the a videopress_status check to the meta query and if it has a `videopress_status` only include those with - * a status of 'completed' or 'processing'. - * - * @param array $meta_query - * - * @return array - */ - protected function add_status_check_to_meta_query( $meta_query ) { - - if ( ! is_array( $meta_query ) ) { - $meta_query = array(); - } - - $meta_query[] = array( - array( - 'relation' => 'OR', - array( - 'key' => 'videopress_status', - 'value' => array( 'completed', 'processing' ), - 'compare' => 'IN', - ), - array( - 'key' => 'videopress_status', - 'compare' => 'NOT EXISTS', - ), - ), - ); - - return $meta_query; - } -} - -// Let's start this thing up. -VideoPress_Media_Library::init();
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-options.php b/plugins/jetpack/modules/videopress-v2/class.videopress-options.php deleted file mode 100644 index 1b431e92..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-options.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php - -class VideoPress_Options { - - /** @var string */ - public static $option_name = 'videopress'; - - /** @var array */ - public static $jetpack_plans_with_videopress = array( 'jetpack_premium', 'jetpack_business' ); - - /** @var array */ - protected static $options = array(); - - /** - * Get VideoPress options - */ - public static function get_options() { - // Make sure we only get options from the database and services once per connection. - if ( count( self::$options ) > 0 ) { - return self::$options; - } - - $defaults = array( - 'meta' => array( - 'max_upload_size' => 0, - ), - ); - - self::$options = Jetpack_Options::get_option( self::$option_name, array() ); - self::$options = array_merge( $defaults, self::$options ); - - // Make sure that the shadow blog id never comes from the options, but instead uses the - // associated shadow blog id, if videopress is enabled. - self::$options['shadow_blog_id'] = 0; - - // Use the Jetpack ID for the shadow blog ID if we have a plan that supports VideoPress - if ( Jetpack::active_plan_supports( 'videopress' ) ) { - self::$options['shadow_blog_id'] = Jetpack_Options::get_option( 'id' ); - } - - return self::$options; - } - - /** - * Update VideoPress options - */ - public static function update_options( $options ) { - Jetpack_Options::update_option( self::$option_name, $options ); - - self::$options = $options; - } - - /** - * Runs when the VideoPress module is deactivated. - */ - public static function delete_options() { - Jetpack_Options::delete_option( self::$option_name ); - - self::$options = array(); - } - -}
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-player.php b/plugins/jetpack/modules/videopress-v2/class.videopress-player.php deleted file mode 100644 index 1a7f042c..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-player.php +++ /dev/null @@ -1,823 +0,0 @@ -<?php -/** - * VideoPress playback module markup generator. - * - * @since 1.3 - */ -class VideoPress_Player { - /** - * Video data for the requested guid and maximum width - * - * @since 1.3 - * @var VideoPress_Video - */ - protected $video; - - /** - * DOM identifier of the video container - * - * @var string - * @since 1.3 - */ - protected $video_container_id; - - /** - * DOM identifier of the video element (video, object, embed) - * - * @var string - * @since 1.3 - */ - protected $video_id; - - /** - * Array of playback options: force_flash or freedom - * - * @var array - * @since 1.3 - */ - protected $options; - - /** - * Array of video GUIDs shown and their counts, - * moved from the old VideoPress class. - */ - public static $shown = array(); - - /** - * Initiate a player object based on shortcode values and possible blog-level option overrides - * - * @since 1.3 - * @var string $guid VideoPress unique identifier - * @var int $maxwidth maximum desired width of the video player if specified - * @var array $options player customizations - */ - public function __construct( $guid, $maxwidth = 0, $options = array() ) { - if ( empty( self::$shown[ $guid ] ) ) - self::$shown[ $guid ] = 0; - - self::$shown[ $guid ]++; - - $this->video_container_id = 'v-' . $guid . '-' . self::$shown[ $guid ]; - $this->video_id = $this->video_container_id . '-video'; - - if ( is_array( $options ) ) - $this->options = $options; - else - $this->options = array(); - - // set up the video - $cache_key = null; - - // disable cache in debug mode - if ( defined('WP_DEBUG') && WP_DEBUG === true ) { - $cached_video = null; - } else { - $cache_key_pieces = array( 'video' ); - - if ( is_multisite() && is_subdomain_install() ) - $cache_key_pieces[] = get_current_blog_id(); - - $cache_key_pieces[] = $guid; - if ( $maxwidth > 0 ) - $cache_key_pieces[] = $maxwidth; - if ( is_ssl() ) - $cache_key_pieces[] = 'ssl'; - $cache_key = implode( '-', $cache_key_pieces ); - unset( $cache_key_pieces ); - $cached_video = wp_cache_get( $cache_key, 'video' ); - } - if ( empty( $cached_video ) ) { - $video = new VideoPress_Video( $guid, $maxwidth ); - if ( empty( $video ) ) { - return; - } elseif ( isset( $video->error ) ) { - $this->video = $video->error; - return; - } elseif ( is_wp_error( $video ) ) { - $this->video = $video; - return; - } - - $this->video = $video; - unset( $video ); - - if ( ! defined( 'WP_DEBUG' ) || WP_DEBUG !== true ) { - $expire = 3600; - if ( isset( $video->expires ) && is_int( $video->expires ) ) { - $expires_diff = time() - $video->expires; - if ( $expires_diff > 0 && $expires_diff < 86400 ) // allowed range: 1 second to 1 day - $expire = $expires_diff; - unset( $expires_diff ); - } - - wp_cache_set( $cache_key, serialize( $this->video ), 'video', $expire ); - unset( $expire ); - } - } else { - $this->video = unserialize( $cached_video ); - } - unset( $cache_key ); - unset( $cached_video ); - } - - /** - * Wrap output in a VideoPress player container - * - * @since 1.3 - * @var string $content HTML string - * @return string HTML string or blank string if nothing to wrap - */ - private function html_wrapper( $content ) { - if ( empty( $content ) ) - return ''; - else - return '<div id="' . esc_attr( $this->video_container_id ) . '" class="video-player">' . $content . '</div>'; - } - - /** - * Output content suitable for a feed reader displaying RSS or Atom feeds - * We do not display error messages in the feed view due to caching concerns. - * Flash content presented using <embed> markup for feed reader compatibility. - * - * @since 1.3 - * @return string HTML string or empty string if error - */ - public function asXML() { - if ( empty( $this->video ) || is_wp_error( $this->video ) ) { - return ''; - } - - if ( isset( $this->options['force_flash'] ) && true === $this->options['force_flash'] ) { - $content = $this->flash_embed(); - - } else { - $content = $this->html5_static(); - } - - return $this->html_wrapper( $content ); - } - - /** - * Video player markup for best matching the current request and publisher options - * @since 1.3 - * @return string HTML markup string or empty string if no video property found - */ - public function asHTML() { - if ( empty( $this->video ) ) { - $content = ''; - - } elseif ( is_wp_error( $this->video ) ) { - $content = $this->error_message( $this->video ); - - } elseif ( isset( $this->options['force_flash'] ) && true === $this->options['force_flash'] ) { - $content = $this->flash_object(); - - } elseif ( isset( $this->video->restricted_embed ) && true === $this->video->restricted_embed ) { - - if ( $this->options['forcestatic'] ) { - $content = $this->flash_object(); - - } else { - $content = $this->html5_dynamic(); - } - - } elseif ( isset( $this->options['freedom'] ) && true === $this->options['freedom'] ) { - $content = $this->html5_static(); - - } else { - $content = $this->html5_dynamic(); - } - - return $this->html_wrapper( $content ); - } - - /** - * Display an error message to users capable of doing something about the error - * - * @since 1.3 - * @uses current_user_can() to test if current user has edit_posts capability - * @var WP_Error $error WordPress error - * @return string HTML string - */ - private function error_message( $error ) { - if ( ! current_user_can( 'edit_posts' ) || empty( $error ) ) - return ''; - - $html = '<div class="videopress-error" style="background-color:rgb(255,0,0);color:rgb(255,255,255);font-family:font-family:\'Helvetica Neue\',Arial,Helvetica,\'Nimbus Sans L\',sans-serif;font-size:140%;min-height:10em;padding-top:1.5em;padding-bottom:1.5em">'; - $html .= '<h1 style="font-size:180%;font-style:bold;line-height:130%;text-decoration:underline">' . esc_html( sprintf( __( '%s Error', 'jetpack' ), 'VideoPress' ) ) . '</h1>'; - foreach( $error->get_error_messages() as $message ) { - $html .= $message; - } - $html .= '</div>'; - return $html; - } - - /** - * Rating agencies and industry associations require a potential viewer verify his or her age before a video or its poster frame are displayed. - * Content rated for audiences 17 years of age or older requires such verification across multiple rating agencies and industry associations - * - * @since 1.3 - * @return bool true if video requires the viewer verify he or she is 17 years of age or older - */ - private function age_gate_required() { - if ( isset( $this->video->age_rating ) && $this->video->age_rating >= 17 ) - return true; - else - return false; - } - - /** - * Select a date of birth using HTML form elements. - * - * @since 1.5 - * @return string HTML markup - */ - private function html_age_gate() { - global $wp_locale; - $text_align = 'left'; - if ( $this->video->text_direction === 'rtl' ) - $text_align = 'right'; - - $html = '<div class="videopress-age-gate" style="margin:0 60px">'; - $html .= '<p class="instructions" style="color:rgb(255, 255, 255);font-size:21px;padding-top:60px;padding-bottom:20px;text-align:' . $text_align . '">' . esc_html( __( 'This video is intended for mature audiences.', 'jetpack' ) ) . '<br />' . esc_html( __( 'Please verify your birthday.', 'jetpack' ) ) . '</p>'; - $html .= '<fieldset id="birthday" style="border:0 none;text-align:' . $text_align . ';padding:0;">'; - $inputs_style = 'border:1px solid #444;margin-'; - if ( $this->video->text_direction === 'rtl' ) - $inputs_style .= 'left'; - else - $inputs_style .= 'right'; - $inputs_style .= ':10px;background-color:rgb(0, 0, 0);font-size:14px;color:rgb(255,255,255);padding:4px 6px;line-height: 2em;vertical-align: middle'; - - /** - * Display a list of months in the Gregorian calendar. - * Set values to 0-based to match JavaScript Date. - * @link https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date Mozilla JavaScript Reference: Date - */ - $html .= '<select name="month" style="' . $inputs_style . '">'; - - for( $i=0; $i<12; $i++ ) { - $html .= '<option value="' . esc_attr( $i ) . '">' . esc_html( $wp_locale->get_month( $i + 1 ) ) . '</option>'; - } - $html .= '</select>'; - - /** - * todo: numdays variance by month - */ - $html .= '<select name="day" style="' . $inputs_style . '">'; - for ( $i=1; $i<32; $i++ ) { - $html .= '<option>' . $i . '</option>'; - } - $html .= '</select>'; - - /** - * Current record for human life is 122. Go back 130 years and no one is left out. - * Don't ask infants younger than 2 for their birthday - * Default to 13 - */ - $html .= '<select name="year" style="' . $inputs_style . '">'; - $start_year = date('Y') - 2; - $default_year = $start_year - 11; - $end_year = $start_year - 128; - for ( $year=$start_year; $year>$end_year; $year-- ) { - $html .= '<option'; - if ( $year === $default_year ) - $html .= ' selected="selected"'; - $html .= '>' . $year . '</option>'; - } - unset( $start_year ); - unset( $default_year ); - unset( $end_year ); - $html .= '</select>'; - - $html .= '<input type="submit" value="' . __( 'Submit', 'jetpack' ) . '" style="cursor:pointer;border-radius: 1em;border:1px solid #333;background-color:#333;background:-webkit-gradient( linear, left top, left bottom, color-stop(0.0, #444), color-stop(1, #111) );background:-moz-linear-gradient(center top, #444 0%, #111 100%);font-size:13px;padding:4px 10px 5px;line-height:1em;vertical-align:top;color:white;text-decoration:none;margin:0" />'; - - $html .= '</fieldset>'; - $html .= '<p style="padding-top:20px;padding-bottom:60px;text-align:' . $text_align . ';"><a rel="nofollow" href="http://videopress.com/" target="_blank" style="color:rgb(128,128,128);text-decoration:underline;font-size:15px">' . __( 'More information', 'jetpack' ) . '</a></p>'; - - $html .= '</div>'; - return $html; - } - - /** - * Return HTML5 video static markup for the given video parameters. - * Use default browser player controls. - * No Flash fallback. - * - * @since 1.2 - * @link http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html HTML5 video - * @return string HTML5 video element and children - */ - private function html5_static() { - wp_enqueue_script( 'videopress' ); - $thumbnail = esc_url( $this->video->poster_frame_uri ); - $html = "<video id=\"{$this->video_id}\" width=\"{$this->video->calculated_width}\" height=\"{$this->video->calculated_height}\" poster=\"$thumbnail\" controls=\"true\""; - if ( isset( $this->options['autoplay'] ) && $this->options['autoplay'] === true ) - $html .= ' autoplay="true"'; - else - $html .= ' preload="metadata"'; - if ( isset( $this->video->text_direction ) ) - $html .= ' dir="' . esc_attr( $this->video->text_direction ) . '"'; - if ( isset( $this->video->language ) ) - $html .= ' lang="' . esc_attr( $this->video->language ) . '"'; - $html .= '>'; - if ( ! isset( $this->options['freedom'] ) || $this->options['freedom'] === false ) { - $mp4 = $this->video->videos->mp4->url; - if ( ! empty( $mp4 ) ) - $html .= '<source src="' . esc_url( $mp4 ) . '" type="video/mp4; codecs="' . esc_attr( $this->video->videos->mp4->codecs ) . '"" />'; - unset( $mp4 ); - } - $ogg = $this->video->videos->ogv->url; - if ( ! empty( $ogg ) ) - $html .= '<source src="' . esc_url( $ogg ) . '" type="video/ogg; codecs="' . esc_attr( $this->video->videos->ogv->codecs ) . '"" />'; - unset( $ogg ); - - $html .= '<div><img alt="'; - if ( isset( $this->video->title ) ) - $html .= esc_attr( $this->video->title ); - $html .= '" src="' . $thumbnail . '" width="' . $this->video->calculated_width . '" height="' . $this->video->calculated_height . '" /></div>'; - if ( isset( $this->options['freedom'] ) && $this->options['freedom'] === true ) - $html .= '<p class="robots-nocontent">' . sprintf( __( 'You do not have sufficient <a rel="nofollow" href="%s" target="_blank">freedom levels</a> to view this video. Support free software and upgrade.', 'jetpack' ), 'http://www.gnu.org/philosophy/free-sw.html' ) . '</p>'; - elseif ( isset( $this->video->title ) ) - $html .= '<p>' . esc_html( $this->video->title ) . '</p>'; - $html .= '</video>'; - return $html; - } - - /** - * Click to play dynamic HTML5-capable player. - * The player displays a video preview section including poster frame, - * video title, play button and watermark on the original page load - * and calculates the playback capabilities of the browser. The video player - * is loaded when the visitor clicks on the video preview area. - * If Flash Player 10 or above is available the browser will display - * the Flash version of the video. If HTML5 video appears to be supported - * and the browser may be capable of MP4 (H.264, AAC) or OGV (Theora, Vorbis) - * playback the browser will display its native HTML5 player. - * - * @since 1.5 - * @return string HTML markup - */ - private function html5_dynamic() { - - /** - * Filter the VideoPress legacy player feature - * - * This filter allows you to control whether the legacy VideoPress player should be used - * instead of the improved one. - * - * @module videopress - * - * @since 3.7.0 - * - * @param boolean $videopress_use_legacy_player - */ - if ( ! apply_filters( 'jetpack_videopress_use_legacy_player', false ) ) { - return $this->html5_dynamic_next(); - } - - wp_enqueue_script( 'videopress' ); - $video_placeholder_id = $this->video_container_id . '-placeholder'; - $age_gate_required = $this->age_gate_required(); - $width = absint( $this->video->calculated_width ); - $height = absint( $this->video->calculated_height ); - - $html = '<div id="' . $video_placeholder_id . '" class="videopress-placeholder" style="'; - if ( $age_gate_required ) - $html .= "min-width:{$width}px;min-height:{$height}px"; - else - $html .= "width:{$width}px;height:{$height}px"; - $html .= ';display:none;cursor:pointer !important;position:relative;'; - if ( isset( $this->video->skin ) && isset( $this->video->skin->background_color ) ) - $html .= 'background-color:' . esc_attr( $this->video->skin->background_color ) . ';'; - $html .= 'font-family: \'Helvetica Neue\',Arial,Helvetica,\'Nimbus Sans L\',sans-serif;font-weight:bold;font-size:18px">' . PHP_EOL; - - /** - * Do not display a poster frame, title, or any other content hints for mature content. - */ - if ( ! $age_gate_required ) { - if ( ! empty( $this->video->title ) ) { - $html .= '<div class="videopress-title" style="display:inline;position:absolute;margin:20px 20px 0 20px;padding:4px 8px;vertical-align:top;text-align:'; - if ( $this->video->text_direction === 'rtl' ) - $html .= 'right" dir="rtl"'; - else - $html .= 'left" dir="ltr"'; - if ( isset( $this->video->language ) ) - $html .= ' lang="' . esc_attr( $this->video->language ) . '"'; - $html .= '><span style="padding:3px 0;line-height:1.5em;'; - if ( isset( $this->video->skin ) && isset( $this->video->skin->background_color ) ) { - $html .= 'background-color:'; - if ( $this->video->skin->background_color === 'rgb(0,0,0)' ) - $html .= 'rgba(0,0,0,0.8)'; - else - $html .= esc_attr( $this->video->skin->background_color ); - $html .= ';'; - } - $html .= 'color:rgb(255,255,255)">' . esc_html( $this->video->title ) . '</span></div>'; - } - $html .= '<img class="videopress-poster" alt="'; - if ( ! empty( $this->video->title ) ) - $html .= esc_attr( $this->video->title ) . '" title="' . esc_attr( sprintf( _x( 'Watch: %s', 'watch a video title', 'jetpack' ), $this->video->title ) ); - $html .= '" src="' . esc_url( $this->video->poster_frame_uri, array( 'http', 'https' ) ) . '" width="' . $width . '" height="' . $height . '" />' . PHP_EOL; - - //style a play button hovered over the poster frame - $html .= '<div class="play-button"><span style="z-index:2;display:block;position:absolute;top:50%;left:50%;text-align:center;vertical-align:middle;color:rgb(255,255,255);opacity:0.9;margin:0 0 0 -0.45em;padding:0;line-height:0;font-size:500%;text-shadow:0 0 40px rgba(0,0,0,0.5)">▶</span></div>' . PHP_EOL; - - // watermark - if ( isset( $this->video->skin ) && isset( $this->video->skin->watermark ) ) { - $html .= '<div style="position:relative;margin-top:-40px;height:25px;margin-bottom:35px;'; - if ( $this->video->text_direction === 'rtl' ) - $html .= 'margin-left:20px;text-align:left;'; - else - $html .= 'margin-right:20px;text-align:right;'; - $html .= 'vertical-align:bottom;z-index:3">'; - $html .= '<img alt="" src="' . esc_url( $this->video->skin->watermark, array( 'http', 'https' ) ) . '" width="90" height="13" style="background-color:transparent;background-image:none;background-repeat:no-repeat;border:none;margin:0;padding:0"/>'; - $html .= '</div>' . PHP_EOL; - } - } - - $data = array( - 'blog' => absint( $this->video->blog_id ), - 'post' => absint( $this->video->post_id ), - 'duration'=> absint( $this->video->duration ), - 'poster' => esc_url_raw( $this->video->poster_frame_uri, array( 'http', 'https' ) ), - 'hd' => (bool) $this->options['hd'] - ); - if ( isset( $this->video->videos ) ) { - if ( isset( $this->video->videos->mp4 ) && isset( $this->video->videos->mp4->url ) ) - $data['mp4'] = array( 'size' => $this->video->videos->mp4->format, 'uri' => esc_url_raw( $this->video->videos->mp4->url, array( 'http', 'https' ) ) ); - if ( isset( $this->video->videos->ogv ) && isset( $this->video->videos->ogv->url ) ) - $data['ogv'] = array( 'size' => 'std', 'uri' => esc_url_raw( $this->video->videos->ogv->url, array( 'http', 'https' ) ) ); - } - $locale = array( 'dir' => $this->video->text_direction ); - if ( isset( $this->video->language ) ) - $locale['lang'] = $this->video->language; - $data['locale'] = $locale; - unset( $locale ); - - $guid = $this->video->guid; - $guid_js = json_encode( $guid ); - $html .= '<script type="text/javascript">' . PHP_EOL; - $html .= 'jQuery(document).ready(function() {'; - - $html .= 'if ( !jQuery.VideoPress.data[' . json_encode($guid) . '] ) { jQuery.VideoPress.data[' . json_encode($guid) . '] = new Array(); }' . PHP_EOL; - $html .= 'jQuery.VideoPress.data[' . json_encode( $guid ) . '][' . self::$shown[ $guid ] . ']=' . json_encode($data) . ';' . PHP_EOL; - unset( $data ); - - $jq_container = json_encode( '#' . $this->video_container_id ); - $jq_placeholder = json_encode( '#' . $video_placeholder_id ); - $player_config = "{width:{$width},height:{$height},"; - if ( isset( $this->options['freedom'] ) && $this->options['freedom'] === true ) - $player_config .= 'freedom:"true",'; - $player_config .= 'container:jQuery(' . $jq_container . ')}'; - - $html .= "jQuery({$jq_placeholder}).show(0,function(){jQuery.VideoPress.analytics.impression({$guid_js})});" . PHP_EOL; - - if ( $age_gate_required ) { - $html .= 'if ( jQuery.VideoPress.support.flash() ) {' . PHP_EOL; - /** - * @link http://code.google.com/p/swfobject/wiki/api#swfobject.embedSWF(swfUrlStr,_replaceElemIdStr,_widthStr,_height - */ - $html .= 'swfobject.embedSWF(' . implode( ',', array( - 'jQuery.VideoPress.video.flash.player_uri', - json_encode( $this->video_container_id ), - json_encode( $width ), - json_encode( $height ), - 'jQuery.VideoPress.video.flash.min_version', - 'jQuery.VideoPress.video.flash.expressinstall', // attempt to upgrade the Flash player if less than min_version. requires a 310x137 container or larger but we will always try to include - '{guid:' . $guid_js . '}', // FlashVars - 'jQuery.VideoPress.video.flash.params', - 'null', // no attributes - 'jQuery.VideoPress.video.flash.embedCallback' // error fallback - ) ) . ');'; - $html .= '} else {' . PHP_EOL; - $html .= "if ( jQuery.VideoPress.video.prepare({$guid_js},{$player_config}," . self::$shown[ $guid ] . ') ) {' . PHP_EOL; - $html .= 'if ( jQuery(' . $jq_container . ').data( "player" ) === "flash" ){jQuery.VideoPress.video.play(jQuery(' . json_encode('#' . $this->video_container_id) . '));}else{'; - $html .= 'jQuery(' . $jq_placeholder . ').html(' . json_encode( $this->html_age_date() ) . ');' . PHP_EOL; - $html .= 'jQuery(' . json_encode( '#' . $video_placeholder_id . ' input[type=submit]' ) . ').one("click", function(event){jQuery.VideoPress.requirements.isSufficientAge(jQuery(' . $jq_container . '),' . absint( $this->video->age_rating ) . ')});' . PHP_EOL; - $html .= '}}}' . PHP_EOL; - } else { - $html .= "if ( jQuery.VideoPress.video.prepare({$guid_js}, {$player_config}," . self::$shown[ $guid ] . ') ) {' . PHP_EOL; - if ( isset( $this->options['autoplay'] ) && $this->options['autoplay'] === true ) - $html .= "jQuery.VideoPress.video.play(jQuery({$jq_container}));"; - else - $html .= 'jQuery(' . $jq_placeholder . ').one("click",function(){jQuery.VideoPress.video.play(jQuery(' . $jq_container . '))});'; - $html .= '}'; - - // close the jQuery(document).ready() function - $html .= '});'; - } - $html .= '</script>' . PHP_EOL; - $html .= '</div>' . PHP_EOL; - - /* - * JavaScript required - */ - $noun = __( 'this video', 'jetpack' ); - if ( ! $age_gate_required ) { - $vid_type = ''; - if ( ( isset( $this->options['freedom'] ) && $this->options['freedom'] === true ) && ( isset( $this->video->videos->ogv ) && isset( $this->video->videos->ogv->url ) ) ) - $vid_type = 'ogv'; - elseif ( isset( $this->video->videos->mp4 ) && isset( $this->video->videos->mp4->url ) ) - $vid_type = 'mp4'; - elseif ( isset( $this->video->videos->ogv ) && isset( $this->video->videos->ogv->url ) ) - $vid_type = 'ogv'; - - if ( $vid_type !== '' ) { - $noun = '<a '; - if ( isset( $this->video->language ) ) - $noun .= 'hreflang="' . esc_attr( $this->video->language ) . '" '; - if ( $vid_type === 'mp4' ) - $noun .= 'type="video/mp4" href="' . esc_url( $this->video->videos->mp4->url, array( 'http', 'https' ) ); - elseif ( $vid_type === 'ogv' ) - $noun .= 'type="video/ogv" href="' . esc_url( $this->video->videos->ogv->url, array( 'http', 'https' ) ); - $noun .= '">'; - if ( isset( $this->video->title ) ) - $noun .= esc_html( $this->video->title ); - else - $noun .= __( 'this video', 'jetpack' ); - $noun .= '</a>'; - } elseif ( ! empty( $this->title ) ) { - $noun = esc_html( $this->title ); - } - unset( $vid_type ); - } - $html .= '<noscript><p>' . sprintf( _x( 'JavaScript required to play %s.', 'Play as in playback or view a movie', 'jetpack' ), $noun ) . '</p></noscript>'; - - return $html; - } - - function html5_dynamic_next() { - $video_container_id = 'v-' . $this->video->guid; - - // Must not use iframes for IE11 due to a fullscreen bug - if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && stristr( $_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0' ) ) { - $iframe_embed = false; - } else { - - /** - * Filter the VideoPress iframe embed - * - * This filter allows you to control whether the videos will be embedded using an iframe. - * Set this to false in order to use an in-page embed rather than an iframe. - * - * @module videopress - * - * @since 3.7.0 - * - * @param boolean $videopress_player_use_iframe - */ - $iframe_embed = apply_filters( 'jetpack_videopress_player_use_iframe', true ); - } - - if ( ! array_key_exists( 'hd', $this->options ) ) { - $this->options['hd'] = (bool) get_option( 'video_player_high_quality', false ); - } - - $videopress_options = array( - 'width' => absint( $this->video->calculated_width ), - 'height' => absint( $this->video->calculated_height ), - ); - foreach ( $this->options as $option => $value ) { - switch ( $option ) { - case 'at': - if ( intval( $value ) ) { - $videopress_options[ $option ] = intval( $value ); - } - break; - case 'autoplay': - $option = 'autoPlay'; - case 'hd': - case 'loop': - case 'permalink': - if ( in_array( $value, array( 1, 'true' ) ) ) { - $videopress_options[ $option ] = true; - } elseif ( in_array( $value, array( 0, 'false' ) ) ) { - $videopress_options[ $option ] = false; - } - break; - case 'defaultlangcode': - $option = 'defaultLangCode'; - if ( $value ) { - $videopress_options[ $option ] = $value; - } - break; - } - } - - if ( $iframe_embed ) { - $iframe_url = "https://videopress.com/embed/{$this->video->guid}"; - - foreach ( $videopress_options as $option => $value ) { - if ( ! in_array( $option, array( 'width', 'height' ) ) ) { - - // add_query_arg ignores false as a value, so replacing it with 0 - $iframe_url = add_query_arg( $option, ( false === $value ) ? 0 : $value, $iframe_url ); - } - } - - $js_url = 'https://s0.wp.com/wp-content/plugins/video/assets/js/next/videopress-iframe.js'; - $js_url = add_query_arg( 'jetpack_version', JETPACK__VERSION, $js_url ); - - return "<iframe width='" . esc_attr( $videopress_options['width'] ) - . "' height='" . esc_attr( $videopress_options['height'] ) - . "' src='" . esc_attr( $iframe_url ) - . "' frameborder='0' allowfullscreen></iframe>" - . "<script src='" . esc_attr( $js_url ) . "'></script>"; - - } else { - $videopress_options = json_encode( $videopress_options ); - $js_url = 'https://s0.wp.com/wp-content/plugins/video/assets/js/next/videopress.js'; - $js_url = add_query_arg( 'jetpack_version', JETPACK__VERSION, $js_url ); - - return "<div id='{$video_container_id}'></div> - <script src='{$js_url}'></script> - <script> - videopress('{$this->video->guid}', document.querySelector('#{$video_container_id}'), {$videopress_options}); - </script>"; - } - } - - /** - * Only allow legitimate Flash parameters and their values - * - * @since 1.2 - * @link http://kb2.adobe.com/cps/127/tn_12701.html Flash object and embed attributes - * @link http://kb2.adobe.com/cps/133/tn_13331.html devicefont - * @link http://kb2.adobe.com/cps/164/tn_16494.html allowscriptaccess - * @link http://www.adobe.com/devnet/flashplayer/articles/full_screen_mode.html full screen mode - * @link http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001079.html allownetworking - * @param array $flash_params Flash parameters expressed in key-value form - * @return array validated Flash parameters - */ - public static function esc_flash_params( $flash_params ) { - $allowed_params = array( - 'swliveconnect' => array('true', 'false'), - 'play' => array('true', 'false'), - 'loop' => array('true', 'false'), - 'menu' => array('true', 'false'), - 'quality' => array('low', 'autolow', 'autohigh', 'medium', 'high', 'best'), - 'scale' => array('default', 'noborder', 'exactfit', 'noscale'), - 'align' => array('l', 'r', 't'), - 'salign' => array('l', 'r', 't', 'tl', 'tr', 'bl', 'br'), - 'wmode' => array('window', 'opaque', 'transparent','direct','gpu'), - 'devicefont' => array('_sans', '_serif', '_typewriter'), - 'allowscriptaccess' => array('always', 'samedomain', 'never'), - 'allownetworking' => array('all','internal', 'none'), - 'seamlesstabbing' => array('true', 'false'), - 'allowfullscreen' => array('true', 'false'), - 'fullScreenAspectRatio' => array('portrait', 'landscape'), - 'base', - 'bgcolor', - 'flashvars' - ); - - $allowed_params_keys = array_keys( $allowed_params ); - - $filtered_params = array(); - foreach( $flash_params as $param=>$value ) { - if ( empty($param) || empty($value) ) - continue; - $param = strtolower($param); - if ( in_array($param, $allowed_params_keys) ) { - if ( isset( $allowed_params[$param] ) && is_array( $allowed_params[$param] ) ) { - $value = strtolower($value); - if ( in_array( $value, $allowed_params[$param] ) ) - $filtered_params[$param] = $value; - } else { - $filtered_params[$param] = $value; - } - } - } - unset( $allowed_params_keys ); - - /** - * Flash specifies sameDomain, not samedomain. change from lowercase value for preciseness - */ - if ( isset( $filtered_params['allowscriptaccess'] ) && $filtered_params['allowscriptaccess'] === 'samedomain' ) - $filtered_params['allowscriptaccess'] = 'sameDomain'; - - return $filtered_params; - } - - /** - * Filter Flash variables from the response, taking into consideration player options. - * - * @since 1.3 - * @return array Flash variable key value pairs - */ - private function get_flash_variables() { - if ( ! isset( $this->video->players->swf->vars ) ) - return array(); - - $flashvars = (array) $this->video->players->swf->vars; - if ( isset( $this->options['autoplay'] ) && $this->options['autoplay'] === true ) - $flashvars['autoPlay'] = 'true'; - return $flashvars; - } - - /** - * Validate and filter Flash parameters - * - * @since 1.3 - * @return array Flash parameters passed through key and value validation - */ - private function get_flash_parameters() { - if ( ! isset( $this->video->players->swf->params ) ) - return array(); - else - return self::esc_flash_params( - /** - * Filters the Flash parameters of the VideoPress player. - * - * @module videopress - * - * @since 1.2.0 - * - * @param array $this->video->players->swf->params Array of swf parameters for the VideoPress flash player. - */ - apply_filters( 'video_flash_params', (array) $this->video->players->swf->params, 10, 1 ) - ); - } - - /** - * Flash player markup in a HTML embed element. - * - * @since 1.1 - * @link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#the-embed-element embed element - * @link http://www.google.com/support/reader/bin/answer.py?answer=70664 Google Reader markup support - * @return string HTML markup. Embed element with no children - */ - private function flash_embed() { - wp_enqueue_script( 'videopress' ); - if ( ! isset( $this->video->players->swf ) || ! isset( $this->video->players->swf->url ) ) - return ''; - - $embed = array( - 'id' => $this->video_id, - 'src' => esc_url_raw( $this->video->players->swf->url . '&' . http_build_query( $this->get_flash_variables(), null, '&' ) , array( 'http', 'https' ) ), - 'type' => 'application/x-shockwave-flash', - 'width' => $this->video->calculated_width, - 'height' => $this->video->calculated_height - ); - if ( isset( $this->video->title ) ) - $embed['title'] = $this->video->title; - $embed = array_merge( $embed, $this->get_flash_parameters() ); - - $html = '<embed'; - foreach ( $embed as $attribute => $value ) { - $html .= ' ' . esc_html( $attribute ) . '="' . esc_attr( $value ) . '"'; - } - unset( $embed ); - $html .= '></embed>'; - return $html; - } - - /** - * Double-baked Flash object markup for Internet Explorer and more standards-friendly consuming agents. - * - * @since 1.1 - * @return HTML markup. Object and children. - */ - private function flash_object() { - wp_enqueue_script( 'videopress' ); - if ( ! isset( $this->video->players->swf ) || ! isset( $this->video->players->swf->url ) ) - return ''; - - $thumbnail_html = '<img alt="'; - if ( isset( $this->video->title ) ) - $thumbnail_html .= esc_attr( $this->video->title ); - $thumbnail_html .= '" src="' . esc_url( $this->video->poster_frame_uri, array( 'http', 'https' ) ) . '" width="' . $this->video->calculated_width . '" height="' . $this->video->calculated_height . '" />'; - $flash_vars = esc_attr( http_build_query( $this->get_flash_variables(), null, '&' ) ); - $flash_params = ''; - foreach ( $this->get_flash_parameters() as $attribute => $value ) { - $flash_params .= '<param name="' . esc_attr( $attribute ) . '" value="' . esc_attr( $value ) . '" />'; - } - $flash_help = sprintf( __( 'This video requires <a rel="nofollow" href="%s" target="_blank">Adobe Flash</a> for playback.', 'jetpack' ), 'http://www.adobe.com/go/getflashplayer'); - $flash_player_url = esc_url( $this->video->players->swf->url, array( 'http', 'https' ) ); - $description = ''; - if ( isset( $this->video->title ) ) { - $standby = $this->video->title; - $description = '<p><strong>' . esc_html( $this->video->title ) . '</strong></p>'; - } else { - $standby = __( 'Loading video...', 'jetpack' ); - } - $standby = ' standby="' . esc_attr( $standby ) . '"'; - return <<<OBJECT -<script type="text/javascript">if(typeof swfobject!=="undefined"){swfobject.registerObject("{$this->video_id}", "{$this->video->players->swf->version}");}</script> -<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{$this->video->calculated_width}" height="{$this->video->calculated_height}" id="{$this->video_id}"{$standby}> - <param name="movie" value="{$flash_player_url}" /> - {$flash_params} - <param name="flashvars" value="{$flash_vars}" /> - <!--[if !IE]>--> - <object type="application/x-shockwave-flash" data="{$flash_player_url}" width="{$this->video->calculated_width}" height="{$this->video->calculated_height}"{$standby}> - {$flash_params} - <param name="flashvars" value="{$flash_vars}" /> - <!--<![endif]--> - {$thumbnail_html}{$description}<p class="robots-nocontent">{$flash_help}</p> - <!--[if !IE]>--> - </object> - <!--<![endif]--> -</object> -OBJECT; - } -} diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-scheduler.php b/plugins/jetpack/modules/videopress-v2/class.videopress-scheduler.php deleted file mode 100644 index b74fdd14..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-scheduler.php +++ /dev/null @@ -1,197 +0,0 @@ -<?php -/** - * VideoPress playback module markup generator. - * - * @since 1.3 - */ -class VideoPress_Scheduler { - - /** - * The name of the function used to run the cleanup cron. - */ - const CLEANUP_CRON_METHOD = 'videopress_cleanup_media_library'; - - /** - * @var VideoPress_Scheduler - **/ - private static $instance = null; - - /** - * A list of all of the crons that are to be activated, along with their interval timings. - * - * @var array - */ - protected $crons = array( - 'cleanup' => array( - 'method' => self::CLEANUP_CRON_METHOD, - 'interval' => 'minutes_30', - ), - ); - - - /** - * Private VideoPress_Scheduler constructor. - * - * Use the VideoPress_Scheduler::init() method to get an instance. - */ - private function __construct() { - add_filter( 'cron_schedules', array( $this, 'add_30_minute_cron_interval' ) ); - - // Activate the cleanup cron if videopress is enabled, jetpack is activated, or jetpack is updated. - add_action( 'jetpack_activate_module_videopress', array( $this, 'activate_all_crons' ) ); - add_action( 'updating_jetpack_version', array( $this, 'activate_all_crons' ) ); - add_action( 'activated_plugin', array( $this, 'activate_crons_on_jetpack_activation' ) ); - - // Deactivate the cron if either videopress is disabled or Jetpack is disabled. - add_action( 'jetpack_deactivate_module_videopress', array( $this, 'deactivate_all_crons' ) ); - register_deactivation_hook( plugin_basename( JETPACK__PLUGIN_FILE ), array( $this, 'deactivate_all_crons' ) ); - } - - /** - * Initialize the VideoPress_Scheduler and get back a singleton instance. - * - * @return VideoPress_Scheduler - */ - public static function init() { - if ( is_null( self::$instance ) ) { - self::$instance = new VideoPress_Scheduler; - } - - return self::$instance; - } - - /** - * Adds 30 minute running interval to the cron schedules. - * - * @param array $current_schedules Currently defined schedules list. - * - * @return array - */ - public function add_30_minute_cron_interval( $current_schedules ) { - - // Only add the 30 minute interval if it wasn't already set. - if ( ! isset( $current_schedules['minutes_30'] ) ) { - $current_schedules['minutes_30'] = array( - 'interval' => 30 * MINUTE_IN_SECONDS, - 'display' => 'Every 30 minutes' - ); - } - - return $current_schedules; - } - - /** - * Activate a single cron - * - * @param string $cron_name - * - * @return bool - */ - public function activate_cron( $cron_name ) { - - if ( ! $this->is_cron_valid( $cron_name ) ) { - return false; - } - - if ( ! $this->check_cron( $cron_name ) ) { - wp_schedule_event( time(), $this->crons[ $cron_name ]['interval'], $this->crons[ $cron_name ]['method'] ); - } - } - - /** - * Activates widget update cron task. - */ - public function activate_all_crons() { - - if ( ! Jetpack::is_module_active( 'videopress' ) ) { - return false; - } - - foreach ( $this->crons as $cron_name => $cron ) { - if ( ! $this->check_cron( $cron_name ) ) { - wp_schedule_event( time(), $cron['interval'], $cron['method'] ); - } - } - } - - /** - * Only activate the crons if it is Jetpack that was activated. - * - * @param string $plugin_file_name - */ - public function activate_crons_on_jetpack_activation( $plugin_file_name ) { - - if ( plugin_basename( JETPACK__PLUGIN_FILE ) === $plugin_file_name ) { - $this->activate_all_crons(); - } - } - - /** - * Deactivates any crons associated with the VideoPress module. - * - * @return bool - */ - public function deactivate_cron( $cron_name ) { - - if ( ! $this->is_cron_valid( $cron_name ) ) { - return false; - } - - $next_scheduled_time = $this->check_cron( $cron_name ); - wp_unschedule_event( $next_scheduled_time, $this->crons[ $cron_name ]['method'] ); - - return true; - } - - /** - * Deactivates any crons associated with the VideoPress module.. - */ - public function deactivate_all_crons() { - - foreach ( $this->crons as $cron_name => $cron ) { - $this->deactivate_cron( $cron_name ); - } - } - - /** - * Is the given cron job currently active? - * - * If so, return when it will next run, - * - * @param string $cron_name - * - * @return int|bool Timestamp of the next run time OR false. - */ - public function check_cron( $cron_name ) { - if ( ! $this->is_cron_valid( $cron_name ) ) { - return false; - } - - return wp_next_scheduled( $this->crons[ $cron_name ]['method'] ); - } - - /** - * Check that the given cron job name is valid. - * - * @param string $cron_name - * - * @return bool - */ - public function is_cron_valid( $cron_name ) { - - if ( ! isset( $this->crons[ $cron_name ]['method'] ) || ! isset( $this->crons[ $cron_name ]['interval'] ) ) { - return false; - } - - return true; - } - - /** - * Get a list of all of the crons that are available. - * - * @return array - */ - public function get_crons() { - return $this->crons; - } -}
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-video.php b/plugins/jetpack/modules/videopress-v2/class.videopress-video.php deleted file mode 100644 index 103fa4d6..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-video.php +++ /dev/null @@ -1,344 +0,0 @@ -<?php -/** - * VideoPress video object retrieved from VideoPress servers and parsed. - * @since 1.3 - */ -class VideoPress_Video { - public $version = 3; - - /** - * Manifest version returned by remote service. - * - * @var string - * @since 1.3 - */ - const manifest_version = '1.5'; - - /** - * Expiration of the video expressed in Unix time - * - * @var int - * @since 1.3 - */ - public $expires; - - /** - * VideoPress unique identifier - * - * @var string - * @since 1.3 - */ - public $guid; - - /** - * WordPress.com blog identifier - * - * @var int - * @since 1.5 - */ - public $blog_id; - - /** - * Remote blog attachment identifier - * - * @var int - * @since 1.5 - */ - public $post_id; - - /** - * Maximum desired width. - * - * @var int - * @since 1.3 - */ - public $maxwidth; - - /** - * Video width calculated based on original video dimensions and the requested maxwidth - * - * @var int - * @since 1.3 - */ - public $calculated_width; - - /** - * Video height calculated based on original video dimensions and the requested maxwidth - * - * @var int - * @since 1.3 - */ - public $calculated_height; - - /** - * Video title - * - * @var string - * @since 1.3 - */ - public $title; - - /** - * Video description - * - * @var string - * @since 4.4 - */ - public $description; - - /** - * Directionality of title text. ltr or rtl - * - * @var string - * @since 1.3 - */ - public $text_direction; - - /** - * Text and audio language as ISO 639-2 language code - * - * @var string - * @since 1.3 - */ - public $language; - - /** - * Video duration in whole seconds - * - * @var int - * @since 1.3 - */ - public $duration; - - /** - * Recommended minimum age of the viewer. - * - * @var int - * @since 1.3 - */ - public $age_rating; - - /** - * Video author has restricted video embedding or sharing - * - * @var bool - * @since 1.3 - */ - public $restricted_embed; - - /** - * Poster frame image URI for the given video guid and calculated dimensions. - * - * @var string - * @since 1.3 - */ - public $poster_frame_uri; - - /** - * Video files associated with the given guid for the calculated dimensions. - * - * @var stdClass - * @since 1.3 - */ - public $videos; - - /** - * Video player information - * - * @var stdClass - * @since 1.3 - */ - public $players; - - /** - * Video player skinning preferences including background color and watermark - * - * @var array - * @since 1.5 - */ - public $skin; - - /** - * Closed captions if available for the given video. Associative array of ISO 639-2 language code and a WebVTT URI - * - * @var array - * @since 1.5 - */ - public $captions; - - /** - * Setup the object. - * Request video information from VideoPress servers and process the response. - * - * @since 1.3 - * @var string $guid VideoPress unique identifier - * @var int $maxwidth maximum requested video width. final width and height are calculated on VideoPress servers based on the aspect ratio of the original video upload. - */ - public function __construct( $guid, $maxwidth = 640 ) { - $this->guid = $guid; - - $maxwidth = absint( $maxwidth ); - if ( $maxwidth > 0 ) - $this->maxwidth = $maxwidth; - - $data = $this->get_data(); - if ( is_wp_error( $data ) || empty( $data ) ) { - /** This filter is documented in modules/videopress/class.videopress-player.php */ - if ( ! apply_filters( 'jetpack_videopress_use_legacy_player', false ) ) { - // Unlike the Flash player, the new player does it's own error checking, age gate, etc. - $data = (object) array( 'guid' => $guid, 'width' => $maxwidth, 'height' => $maxwidth / 16 * 9 ); - } else { - $this->error = $data; - return; - } - } - - if ( isset( $data->blog_id ) ) - $this->blog_id = absint( $data->blog_id ); - - if ( isset( $data->post_id ) ) - $this->post_id = absint( $data->post_id ); - - if ( isset( $data->title ) && $data->title !== '' ) - $this->title = trim( str_replace( ' ', ' ', $data->title ) ); - - if ( isset( $data->description ) && $data->description !== '' ) - $this->description = trim( $data->description ); - - if ( isset( $data->text_direction ) && $data->text_direction === 'rtl' ) - $this->text_direction = 'rtl'; - else - $this->text_direction = 'ltr'; - - if ( isset( $data->language ) ) - $this->language = $data->language; - - if ( isset( $data->duration ) && $data->duration > 0 ) - $this->duration = absint( $data->duration ); - - if ( isset( $data->width ) && $data->width > 0 ) - $this->calculated_width = absint( $data->width ); - - if ( isset( $data->height ) && $data->height > 0 ) - $this->calculated_height = absint( $data->height ); - - if ( isset( $data->age_rating ) ) - $this->age_rating = absint( $this->age_rating ); - - if ( isset( $data->restricted_embed ) && $data->restricted_embed === true ) - $this->restricted_embed = true; - else - $this->restricted_embed = false; - - if ( isset( $data->posterframe ) && $data->posterframe !== '' ) - $this->poster_frame_uri = esc_url_raw( $data->posterframe, array( 'http', 'https' ) ); - - if ( isset( $data->mp4 ) || isset( $data->ogv ) ) { - $this->videos = new stdClass(); - if ( isset( $data->mp4 ) ) - $this->videos->mp4 = $data->mp4; - if ( isset( $data->ogv ) ) - $this->videos->ogv = $data->ogv; - } - - if ( isset( $data->swf ) ) { - if ( ! isset( $this->players ) ) - $this->players = new stdClass(); - $this->players->swf = $data->swf; - } - - if ( isset( $data->skin ) ) - $this->skin = $data->skin; - - if ( isset( $data->captions ) ) - $this->captions = (array) $data->captions; - } - - /** - * Convert an Expires HTTP header value into Unix time for use in WP Cache - * - * @since 1.3 - * @var string $expires_header - * @return int|bool Unix time or false - */ - public static function calculate_expiration( $expires_header ) { - if ( empty( $expires_header ) || ! is_string( $expires_header ) ) - return false; - - if ( - class_exists( 'DateTimeZone' ) - && method_exists( 'DateTime', 'createFromFormat' ) - ) { - $expires_date = DateTime::createFromFormat( 'D, d M Y H:i:s T', $expires_header, new DateTimeZone( 'UTC' ) ); - if ( $expires_date instanceOf DateTime ) - return date_format( $expires_date, 'U' ); - } else { - $expires_array = strptime( $expires_header, '%a, %d %b %Y %H:%M:%S %Z' ); - if ( is_array( $expires_array ) && isset( $expires_array['tm_hour'] ) && isset( $expires_array['tm_min'] ) && isset( $expires_array['tm_sec'] ) && isset( $expires_array['tm_mon'] ) && isset( $expires_array['tm_mday'] ) && isset( $expires_array['tm_year'] ) ) - return gmmktime( $expires_array['tm_hour'], $expires_array['tm_min'], $expires_array['tm_sec'], 1 + $expires_array['tm_mon'], $expires_array['tm_mday'], 1900 + $expires_array['tm_year'] ); - } - return false; - } - - /** - * Extract the site's host domain for statistics and comparison against an allowed site list in the case of restricted embeds. - * - * @since 1.2 - * @param string $url absolute URL - * @return bool|string host component of the URL, or false if none found - */ - public static function hostname( $url ) { - return parse_url( esc_url_raw( $url ), PHP_URL_HOST ); - } - - - /** - * Request data from WordPress.com for the given guid, maxwidth, and calculated blog hostname. - * - * @since 1.3 - * @return stdClass|WP_Error parsed JSON response or WP_Error if request unsuccessful - */ - private function get_data() { - global $wp_version; - - $domain = self::hostname( home_url() ); - $request_params = array( 'guid' => $this->guid, 'domain' => $domain ); - if ( isset( $this->maxwidth ) && $this->maxwidth > 0 ) - $request_params['maxwidth'] = $this->maxwidth; - - $url = 'http://videopress.com/data/wordpress.json'; - if ( is_ssl() ) - $url = 'https://v.wordpress.com/data/wordpress.json'; - - $response = wp_remote_get( add_query_arg( $request_params, $url ), array( - 'redirection' => 1, - 'user-agent' => 'VideoPress plugin ' . $this->version . '; WordPress ' . $wp_version . ' (' . home_url('/') . ')', - ) ); - - unset( $request_params ); - unset( $url ); - $response_body = wp_remote_retrieve_body( $response ); - $response_code = absint( wp_remote_retrieve_response_code( $response ) ); - - if ( is_wp_error( $response ) ) { - return $response; - } elseif ( $response_code === 400 ) { - return new WP_Error( 'bad_config', __( 'The VideoPress plugin could not communicate with the VideoPress servers. This error is most likely caused by a misconfigured plugin. Please reinstall or upgrade.', 'jetpack' ) ); - } elseif ( $response_code === 403 ) { - return new WP_Error( 'http_forbidden', '<p>' . sprintf( __( '<strong>%s</strong> is not an allowed embed site.' , 'jetpack' ), esc_html( $domain ) ) . '</p><p>' . __( 'Publisher limits playback of video embeds.', 'jetpack' ) . '</p>' ); - } elseif ( $response_code === 404 ) { - return new WP_Error( 'http_not_found', '<p>' . sprintf( __( 'No data found for VideoPress identifier: <strong>%s</strong>.', 'jetpack' ), $this->guid ) . '</p>' ); - } elseif ( $response_code !== 200 || empty( $response_body ) ) { - return; - } else { - $expires_header = wp_remote_retrieve_header( $response, 'Expires' ); - if ( ! empty( $expires_header ) ) { - $expires = self::calculate_expiration( $expires_header ); - if ( ! empty( $expires ) ) - $this->expires = $expires; - - } - return json_decode( $response_body ); - } - } -} diff --git a/plugins/jetpack/modules/videopress-v2/class.videopress-xmlrpc.php b/plugins/jetpack/modules/videopress-v2/class.videopress-xmlrpc.php deleted file mode 100644 index 41e7e614..00000000 --- a/plugins/jetpack/modules/videopress-v2/class.videopress-xmlrpc.php +++ /dev/null @@ -1,149 +0,0 @@ -<?php -/** - * VideoPress playback module markup generator. - * - * @since 1.3 - */ -class VideoPress_XMLRPC { - - /** - * @var VideoPress_XMLRPC - **/ - private static $instance = null; - - - /** - * Private VideoPress_XMLRPC constructor. - * - * Use the VideoPress_XMLRPC::init() method to get an instance. - */ - private function __construct() { - add_filter( 'jetpack_xmlrpc_methods', array( $this, 'xmlrpc_methods' ) ); - } - - /** - * Initialize the VideoPress_XMLRPC and get back a singleton instance. - * - * @return VideoPress_XMLRPC - */ - public static function init() { - if ( is_null( self::$instance ) ) { - self::$instance = new VideoPress_XMLRPC; - } - - return self::$instance; - } - - - - /** - * Adds additional methods the WordPress xmlrpc API for handling VideoPress specific features - * - * @param array $methods - * - * @return array - */ - public function xmlrpc_methods( $methods ) { - - $methods['jetpack.createMediaItem'] = array( $this, 'create_media_item' ); - $methods['jetpack.updateVideoPressInfo'] = array( $this, 'update_videopress_info' ); - - return $methods; - } - - /** - * Endpoint to allow the transcoding session to send updated information about the VideoPress video when it completes a stage of transcoding. - * - * @param array $vp_info - * - * @return array|bool - */ - public function update_videopress_info( $vp_info ) { - $errors = null; - foreach ( $vp_info as $vp_item ) { - $id = $vp_item['post_id']; - $guid = $vp_item['guid']; - - $attachment = get_post( $id ); - - if ( ! $attachment ) { - $errors[] = array( - 'id' => $id, - 'error' => 'Post not found', - ); - - continue; - } - - $attachment->guid = $vp_item['original']; - $attachment->file = $vp_item['original']; - - wp_update_post( $attachment ); - - // Update the vp guid and set it to a direct meta property. - update_post_meta( $id, 'videopress_guid', $guid ); - - $meta = wp_get_attachment_metadata( $attachment->ID ); - - $current_poster = get_post_meta( $id, '_thumbnail_id' ); - - $meta['width'] = $vp_item['width']; - $meta['height'] = $vp_item['height']; - $meta['original']['url'] = $vp_item['original']; - $meta['videopress'] = $vp_item; - $meta['videopress']['url'] = 'https://videopress.com/v/' . $guid; - - if ( ! $current_poster && isset( $vp_item['poster'] ) && ! empty( $vp_item['poster'] ) ) { - $thumbnail_id = videopress_download_poster_image( $vp_item['poster'], $id ); - update_post_meta( $id, '_thumbnail_id', $thumbnail_id ); - } - - wp_update_attachment_metadata( $attachment->ID, $meta ); - - // update the meta to tell us that we're processing or complete - update_post_meta( $id, 'videopress_status', videopress_is_finished_processing( $attachment->ID ) ? 'complete' : 'processing' ); - } - - if ( count( $errors ) > 0 ) { - return array( 'errors' => $errors ); - - } else { - return true; - } - } - - /** - * This is used by the WPCOM VideoPress uploader in order to create a media item with - * specific meta data about an uploaded file. After this, the transcoding session will - * update the meta information via the xmlrpc_update_videopress_info() method. - * - * Note: This method technically handles the creation of multiple media objects, though - * in practice this is never done. - * - * @param array $media - * - * @return array - */ - public function create_media_item( $media ) { - $created_items = array(); - - foreach ( $media as $media_item ) { - - $media_id = videopress_create_new_media_item( sanitize_title( basename( $media_item['url'] ) ) ); - - wp_update_attachment_metadata( $media_id, array( - 'original' => array( - 'url' => $media_item['url'], - ), - ) ); - - $created_items[] = array( - 'id' => $media_id, - 'post' => get_post( $media_id ), - ); - } - - return array( 'media' => $created_items ); - } - -} diff --git a/plugins/jetpack/modules/videopress-v2/css/editor.css b/plugins/jetpack/modules/videopress-v2/css/editor.css deleted file mode 100644 index 69b79dfe..00000000 --- a/plugins/jetpack/modules/videopress-v2/css/editor.css +++ /dev/null @@ -1,59 +0,0 @@ -/* VideoPress Settings Modal style overrides */ -.mce-videopress-field-guid, -.mce-videopress-field-freedom, -.mce-videopress-field-flashonly { - display: none; -} - -.mce-videopress-checkbox .mce-checkbox { - left: 120px !important; - width: 100% !important; /* assigning a full width so the label area is clickable */ -} - -.mce-videopress-checkbox .mce-label { - left: 150px !important; -} - -.mce-videopress-checkbox .mce-label-unit { - position: absolute; - left: 210px; - top: 5px; -} - -.mce-videopress-checkbox i.mce-i-checkbox { - background-color: #fff; - color: #1e8cbe; -} - -.mce-videopress-checkbox .mce-i-checkbox:before { - display: inline-block; - vertical-align: middle; - width: 16px; - font: 400 21px/1 dashicons; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - margin: -3px 0 0 -3px; - content: "\f147"; -} - -.mce-videopress-checkbox .mce-i-checkbox.mce-checked:before { - content: "\f147"; -} - -div[class*=mce-videopress-field] input[type=number] { - width: 70px !important; - left: 120px !important; -} - -.mce-videopress-field-w .mce-label, -.mce-videopress-field-at .mce-label { - width: 115px !important; - text-align: right; -} - -.mce-videopress-field-unit { - position: absolute; - left: 210px; - top: 5px; -} diff --git a/plugins/jetpack/modules/videopress-v2/css/videopress-editor-style.css b/plugins/jetpack/modules/videopress-v2/css/videopress-editor-style.css deleted file mode 100644 index b2c29c5f..00000000 --- a/plugins/jetpack/modules/videopress-v2/css/videopress-editor-style.css +++ /dev/null @@ -1,21 +0,0 @@ -/** - * VideoPress styles for Editor - */ -.videopress-editor-wrapper { - position: relative; - max-width: 100%; - padding: 56.25% 0 0; - height: 0; - overflow: hidden; -} -.tmpl-videopress_iframe_next iframe { - position: absolute; - top: 0; - left: 0; - max-width: 100%; - max-height: 100%; -} -body.rtl .tmpl-videopress_iframe_next iframe { - left: auto; - right: 0; -}
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/editor-media-view.php b/plugins/jetpack/modules/videopress-v2/editor-media-view.php deleted file mode 100644 index 687f5e1e..00000000 --- a/plugins/jetpack/modules/videopress-v2/editor-media-view.php +++ /dev/null @@ -1,213 +0,0 @@ -<?php - -/** - * WordPress Shortcode Editor View JS Code - */ -function videopress_handle_editor_view_js() { - global $content_width; - $current_screen = get_current_screen(); - if ( ! isset( $current_screen->id ) || $current_screen->base !== 'post' ) { - return; - } - - add_action( 'admin_print_footer_scripts', 'videopress_editor_view_js_templates' ); - - wp_enqueue_style( 'videopress-editor-ui', plugins_url( 'css/editor.css', __FILE__ ) ); - wp_enqueue_script( 'videopress-editor-view', plugins_url( 'js/editor-view.js', __FILE__ ), array( 'wp-util', 'jquery' ), false, true ); - wp_localize_script( 'videopress-editor-view', 'vpEditorView', array( - 'home_url_host' => parse_url( home_url(), PHP_URL_HOST ), - 'min_content_width' => VIDEOPRESS_MIN_WIDTH, - 'content_width' => $content_width, - 'modal_labels' => array( - 'title' => esc_html__( 'VideoPress Shortcode', 'jetpack' ), - 'guid' => esc_html__( 'Video ID', 'jetpack' ), - 'w' => esc_html__( 'Video Width', 'jetpack' ), - 'w_unit' => esc_html__( 'pixels', 'jetpack' ), - /* Translators: example of usage of this is "Start Video After 10 seconds" */ - 'at' => esc_html__( 'Start Video After', 'jetpack' ), - 'at_unit' => esc_html__( 'seconds', 'jetpack' ), - 'hd' => esc_html__( 'High definition on by default', 'jetpack' ), - 'permalink' => esc_html__( 'Link the video title to its URL on VideoPress.com', 'jetpack' ), - 'autoplay' => esc_html__( 'Autoplay video on page load', 'jetpack' ), - 'loop' => esc_html__( 'Loop video playback', 'jetpack' ), - 'freedom' => esc_html__( 'Use only Open Source codecs (may degrade performance)', 'jetpack' ), - 'flashonly' => esc_html__( 'Use legacy Flash Player (not recommended)', 'jetpack' ), - ) - ) ); - - add_editor_style( plugins_url( 'css/videopress-editor-style.css', __FILE__ ) ); -} -add_action( 'admin_notices', 'videopress_handle_editor_view_js' ); - -/** - * WordPress Editor Views - */ -function videopress_editor_view_js_templates() { - /** - * This template uses the following parameters, and displays the video as an iframe: - * - data.guid // The guid of the video. - * - data.width // The width of the iframe. - * - data.height // The height of the iframe. - * - data.urlargs // Arguments serialized into a get string. - * - * In addition, the calling script will need to ensure that the following - * JS file is added to the header of the editor iframe: - * - https://s0.wp.com/wp-content/plugins/video/assets/js/next/videopress-iframe.js - */ - ?> - <script type="text/html" id="tmpl-videopress_iframe_vnext"> - <div class="tmpl-videopress_iframe_next" style="max-height:{{ data.height }}px;"> - <div class="videopress-editor-wrapper" style="padding-top:{{ data.ratio }}%;"> - <iframe style="display: block;" width="{{ data.width }}" height="{{ data.height }}" src="https://videopress.com/embed/{{ data.guid }}?{{ data.urlargs }}" frameborder='0' allowfullscreen></iframe> - </div> - </div> - </script> - <?php -} - -/*************************************************\ -| This is the chunk that handles overriding core | -| media stuff so VideoPress can display natively. | -\*************************************************/ - -/** - * Media Grid: - * Filter out any videopress video posters that we've downloaded, - * so that they don't seem to display twice. - */ -add_filter( 'ajax_query_attachments_args', 'videopress_ajax_query_attachments_args' ); -function videopress_ajax_query_attachments_args( $args ) { - $meta_query = array( - array( - 'key' => 'videopress_poster_image', - 'compare' => 'NOT EXISTS', - ), - ); - - // If there was already a meta query, let's AND it via - // nesting it with our new one. No need to specify the - // relation, as it defaults to AND. - if ( ! empty( $args['meta_query'] ) ) { - $meta_query[] = $args['meta_query']; - } - $args['meta_query'] = $meta_query; - - return $args; -} - -/** - * Media List: - * Do the same as ^^ but for the list view. - */ -add_action( 'pre_get_posts', 'videopress_media_list_table_query' ); -function videopress_media_list_table_query( $query ) { - if ( is_admin() && $query->is_main_query() && ( 'upload' === get_current_screen()->id ) ) { - $meta_query = array( - array( - 'key' => 'videopress_poster_image', - 'compare' => 'NOT EXISTS', - ), - ); - - if ( $old_meta_query = $query->get( 'meta_query' ) ) { - $meta_query[] = $old_meta_query; - } - - $query->set( 'meta_query', $meta_query ); - } -} - -/** - * Make sure that any Video that has a VideoPress GUID passes that data back. - */ -add_filter( 'wp_prepare_attachment_for_js', 'videopress_prepare_attachment_for_js' ); -function videopress_prepare_attachment_for_js( $post ) { - if ( 'video' === $post['type'] ) { - $guid = get_post_meta( $post['id'], 'videopress_guid' ); - if ( $guid ) { - $post['videopress_guid'] = $guid; - } - } - return $post; -} - -/** - * Wherever the Media Modal is deployed, also deploy our overrides. - */ -add_action( 'wp_enqueue_media', 'add_videopress_media_overrides' ); -function add_videopress_media_overrides() { - add_action( 'admin_print_footer_scripts', 'videopress_override_media_templates', 11 ); -} - -/** - * Our video overrides! - * - * We have a template for the iframe to get injected. - */ -function videopress_override_media_templates(){ - ?> - <script type="text/html" id="tmpl-videopress_iframe_vnext"> - <iframe style="display: block; max-width: 100%;" width="{{ data.width }}" height="{{ data.height }}" src="https://videopress.com/embed/{{ data.guid }}?{{ data.urlargs }}" frameborder='0' allowfullscreen></iframe> - </script> - <script> - (function( media ){ - // This handles the media library modal attachment details display. - if ( 'undefined' !== typeof media.view.Attachment.Details.TwoColumn ) { - var TwoColumn = media.view.Attachment.Details.TwoColumn, - old_render = TwoColumn.prototype.render, - vp_template = wp.template('videopress_iframe_vnext'); - - TwoColumn.prototype.render = function() { - // Have the original renderer run first. - old_render.apply( this, arguments ); - - // Now our stuff! - if ( 'video' === this.model.get('type') ) { - if ( this.model.get('videopress_guid') ) { - this.$('.attachment-media-view .thumbnail-video').html( vp_template( { - guid : this.model.get('videopress_guid'), - width : this.model.get('width'), - height : this.model.get('height') - })); - } - } - }; - } else { /* console.log( 'media.view.Attachment.Details.TwoColumn undefined' ); */ } - - // This handles the recreating of the core video shortcode when editing the mce embed. - if ( 'undefined' !== typeof media.video ) { - media.video.defaults.videopress_guid = ''; - - // For some reason, even though we're not currently changing anything, the following proxy - // function is necessary to include the above default `videopress_guid` param. ¯\_(ツ)_/¯ - var old_video_shortcode = media.video.shortcode; - media.video.shortcode = function( model ) { - // model.videopress_guid = 'FOOBAR'; - return old_video_shortcode( model ); - }; - } else { /* console.log( 'media.video undefined' ); */ } - - })( wp.media ); - </script> - <?php -} - -/** - * Properly inject VideoPress data into Core shortcodes, and - * generate videopress shortcodes for purely remote videos. - */ -add_filter( 'media_send_to_editor', 'videopress_media_send_to_editor', 10, 3 ); -function videopress_media_send_to_editor( $html, $id, $attachment ) { - $videopress_guid = get_post_meta( $id, 'videopress_guid', true ); - if ( $videopress_guid && videopress_is_valid_guid( $videopress_guid ) ) { - if ( '[video ' === substr( $html, 0, 7 ) ) { - $html = sprintf( '[videopress %1$s]', esc_attr( $videopress_guid ) ); - - } elseif ( '<a href=' === substr( $html, 0, 8 ) ) { - // We got here because `wp_attachment_is()` returned false for - // video, because there isn't a local copy of the file. - $html = sprintf( '[videopress %1$s]', esc_attr( $videopress_guid ) ); - } - } - return $html; -}
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/js/editor-view.js b/plugins/jetpack/modules/videopress-v2/js/editor-view.js deleted file mode 100644 index 9f64859f..00000000 --- a/plugins/jetpack/modules/videopress-v2/js/editor-view.js +++ /dev/null @@ -1,264 +0,0 @@ -/* global tinyMCE, vpEditorView */ -(function( $, wp, vpEditorView ){ - wp.mce = wp.mce || {}; - if ( 'undefined' === typeof wp.mce.views ) { - return; - } - wp.mce.videopress_wp_view_renderer = { - shortcode_string : 'videopress', - shortcode_data : {}, - defaults : { - w : '', - at : '', - permalink : true, - hd : false, - loop : false, - freedom : false, - autoplay : false, - flashonly : false - }, - coerce : wp.media.coerce, - template : wp.template( 'videopress_iframe_vnext' ), - getContent : function() { - var urlargs = 'for=' + encodeURIComponent( vpEditorView.home_url_host ), - named = this.shortcode.attrs.named, - options, key, width; - - for ( key in named ) { - switch ( key ) { - case 'at' : - if ( parseInt( named[ key ], 10 ) ) { - urlargs += '&' + key + '=' + parseInt( named[ key ], 10 ); - } // Else omit, as it's the default. - break; - case 'permalink' : - if ( 'false' === named[ key ] ) { - urlargs += '&' + key + '=0'; - } // Else omit, as it's the default. - break; - case 'hd' : - case 'loop' : - case 'autoplay' : - if ( 'true' === named[ key ] ) { - urlargs += '&' + key + '=1'; - } // Else omit, as it's the default. - break; - default: - // Unknown parameters? Ditch it! - break; - } - } - - options = { - width : vpEditorView.content_width, - height : ( vpEditorView.content_width * 0.5625 ), - guid : this.shortcode.attrs.numeric[0], - urlargs : urlargs - }; - - if ( typeof named.w !== 'undefined' ) { - width = parseInt( named.w, 10 ); - if ( width >= vpEditorView.min_content_width && width < vpEditorView.content_width ) { - options.width = width; - options.height = parseInt( width * 0.5625, 10 ); - } - } - - options.ratio = 100 * ( options.height / options.width ); - - return this.template( options ); - }, - edit: function( data ) { - var shortcode_data = wp.shortcode.next( this.shortcode_string, data), - named = shortcode_data.shortcode.attrs.named, - editor = tinyMCE.activeEditor, - renderer = this, - oldRenderFormItem = tinyMCE.ui.FormItem.prototype.renderHtml; - - /** - * Override TextBox renderHtml to support html5 attrs. - * @link https://github.com/tinymce/tinymce/pull/2784 - * - * @returns {string} - */ - tinyMCE.ui.TextBox.prototype.renderHtml = function() { - var self = this, - settings = self.settings, - element = document.createElement( settings.multiline ? 'textarea' : 'input' ), - extraAttrs = [ - 'rows', - 'spellcheck', - 'maxLength', - 'size', - 'readonly', - 'min', - 'max', - 'step', - 'list', - 'pattern', - 'placeholder', - 'required', - 'multiple' - ], - i, key; - - for ( i = 0; i < extraAttrs.length; i++ ) { - key = extraAttrs[ i ]; - if ( typeof settings[ key ] !== 'undefined' ) { - element.setAttribute( key, settings[ key ] ); - } - } - - if ( settings.multiline ) { - element.innerText = self.state.get( 'value' ); - } else { - element.setAttribute( 'type', settings.subtype ? settings.subtype : 'text' ); - element.setAttribute( 'value', self.state.get( 'value' ) ); - } - - element.id = self._id; - element.className = self.classes; - element.setAttribute( 'hidefocus', 1 ); - if ( self.disabled() ) { - element.disabled = true; - } - - return element.outerHTML; - }; - - tinyMCE.ui.FormItem.prototype.renderHtml = function() { - _.each( vpEditorView.modal_labels, function( value, key ) { - if ( value === this.settings.items.text ) { - this.classes.add( 'videopress-field-' + key ); - } - }, this ); - - if ( _.contains( [ - vpEditorView.modal_labels.hd, - vpEditorView.modal_labels.permalink, - vpEditorView.modal_labels.autoplay, - vpEditorView.modal_labels.loop, - vpEditorView.modal_labels.freedom, - vpEditorView.modal_labels.flashonly - ], this.settings.items.text ) ) { - this.classes.add( 'videopress-checkbox' ); - } - return oldRenderFormItem.call( this ); - }; - - /** - * Populate the defaults. - */ - _.each( this.defaults, function( value, key ) { - named[ key ] = this.coerce( named, key); - }, this ); - - /** - * Declare the fields that will show in the popup when editing the shortcode. - */ - editor.windowManager.open( { - title : vpEditorView.modal_labels.title, - id : 'videopress-shortcode-settings-modal', - width : 520, - height : 240, - body : [ - { - type : 'textbox', - disabled : true, - name : 'guid', - label : vpEditorView.modal_labels.guid, - value : shortcode_data.shortcode.attrs.numeric[0] - }, { - type : 'textbox', - subtype : 'number', - min : vpEditorView.min_content_width, // The `min` may supported be in the future. https://github.com/tinymce/tinymce/pull/2784 - name : 'w', - label : vpEditorView.modal_labels.w, - value : named.w - }, { - type : 'textbox', - subtype : 'number', - min : 0, // The `min` may supported be in the future. https://github.com/tinymce/tinymce/pull/2784 - name : 'at', - label : vpEditorView.modal_labels.at, - value : named.at - }, { - type : 'checkbox', - name : 'hd', - label : vpEditorView.modal_labels.hd, - checked : named.hd - }, { - type : 'checkbox', - name : 'permalink', - label : vpEditorView.modal_labels.permalink, - checked : named.permalink - }, { - type : 'checkbox', - name : 'autoplay', - label : vpEditorView.modal_labels.autoplay, - checked : named.autoplay - }, { - type : 'checkbox', - name : 'loop', - label : vpEditorView.modal_labels.loop, - checked : named.loop - }, { - type : 'checkbox', - name : 'freedom', - label : vpEditorView.modal_labels.freedom, - checked : named.freedom - }, { - type : 'checkbox', - name : 'flashonly', - label : vpEditorView.modal_labels.flashonly, - checked : named.flashonly - } - ], - onsubmit : function( e ) { - var args = { - tag : renderer.shortcode_string, - type : 'single', - attrs : { - named : _.pick( e.data, _.keys( renderer.defaults ) ), - numeric : [ e.data.guid ] - } - }; - - if ( '0' === args.attrs.named.at ) { - args.attrs.named.at = ''; - } - - _.each( renderer.defaults, function( value, key ) { - args.attrs.named[ key ] = this.coerce( args.attrs.named, key ); - - if ( value === args.attrs.named[ key ] ) { - delete args.attrs.named[ key ]; - } - }, renderer ); - - editor.insertContent( wp.shortcode.string( args ) ); - }, - onopen : function ( e ) { - var prefix = 'mce-videopress-field-'; - _.each( ['w', 'at'], function( value ) { - e.target.$el.find( '.' + prefix + value + ' .mce-container-body' ).append( '<span class="' + prefix + 'unit ' + prefix + 'unit-' + value + '">' + vpEditorView.modal_labels[ value + '_unit' ] ); - } ); - $('body').addClass( 'modal-open' ); - }, - onclose: function () { - $('body').removeClass( 'modal-open' ); - } - } ); - - // Set it back to its original renderer. - tinyMCE.ui.FormItem.prototype.renderHtml = oldRenderFormItem; - } - }; - wp.mce.views.register( 'videopress', wp.mce.videopress_wp_view_renderer ); - - // Extend the videopress one to also handle `wpvideo` instances. - wp.mce.wpvideo_wp_view_renderer = _.extend( {}, wp.mce.videopress_wp_view_renderer, { - shortcode_string : 'wpvideo' - }); - wp.mce.views.register( 'wpvideo', wp.mce.wpvideo_wp_view_renderer ); -}( jQuery, wp, vpEditorView )); diff --git a/plugins/jetpack/modules/videopress-v2/js/videopress-plupload.js b/plugins/jetpack/modules/videopress-v2/js/videopress-plupload.js deleted file mode 100644 index 8a162b65..00000000 --- a/plugins/jetpack/modules/videopress-v2/js/videopress-plupload.js +++ /dev/null @@ -1,462 +0,0 @@ -/* global pluploadL10n, plupload, _wpPluploadSettings, JSON */ - -window.wp = window.wp || {}; - -( function( exports, $ ) { - var Uploader, vp; - - if ( typeof _wpPluploadSettings === 'undefined' ) { - return; - } - - /** - * A WordPress uploader. - * - * The Plupload library provides cross-browser uploader UI integration. - * This object bridges the Plupload API to integrate uploads into the - * WordPress back end and the WordPress media experience. - * - * @param {object} options The options passed to the new plupload instance. - * @param {object} options.container The id of uploader container. - * @param {object} options.browser The id of button to trigger the file select. - * @param {object} options.dropzone The id of file drop target. - * @param {object} options.plupload An object of parameters to pass to the plupload instance. - * @param {object} options.params An object of parameters to pass to $_POST when uploading the file. - * Extends this.plupload.multipart_params under the hood. - */ - Uploader = function( options ) { - var self = this, - isIE = navigator.userAgent.indexOf('Trident/') !== -1 || navigator.userAgent.indexOf('MSIE ') !== -1, - elements = { - container: 'container', - browser: 'browse_button', - dropzone: 'drop_element' - }, - key, error; - - this.supports = { - upload: Uploader.browser.supported - }; - - this.supported = this.supports.upload; - - if ( ! this.supported ) { - return; - } - - // Arguments to send to pluplad.Uploader(). - // Use deep extend to ensure that multipart_params and other objects are cloned. - this.plupload = $.extend( true, { multipart_params: {} }, Uploader.defaults ); - this.container = document.body; // Set default container. - - // Extend the instance with options. - // - // Use deep extend to allow options.plupload to override individual - // default plupload keys. - $.extend( true, this, options ); - - // Proxy all methods so this always refers to the current instance. - for ( key in this ) { - if ( $.isFunction( this[ key ] ) ) { - this[ key ] = $.proxy( this[ key ], this ); - } - } - - // Ensure all elements are jQuery elements and have id attributes, - // then set the proper plupload arguments to the ids. - for ( key in elements ) { - if ( ! this[ key ] ) { - continue; - } - - this[ key ] = $( this[ key ] ).first(); - - if ( ! this[ key ].length ) { - delete this[ key ]; - continue; - } - - if ( ! this[ key ].prop('id') ) { - this[ key ].prop( 'id', '__wp-uploader-id-' + Uploader.uuid++ ); - } - - this.plupload[ elements[ key ] ] = this[ key ].prop('id'); - } - - // If the uploader has neither a browse button nor a dropzone, bail. - if ( ! ( this.browser && this.browser.length ) && ! ( this.dropzone && this.dropzone.length ) ) { - return; - } - - // Make sure flash sends cookies (seems in IE it does without switching to urlstream mode) - if ( ! isIE && 'flash' === plupload.predictRuntime( this.plupload ) && - ( ! this.plupload.required_features || ! this.plupload.required_features.hasOwnProperty( 'send_binary_string' ) ) ) { - - this.plupload.required_features = this.plupload.required_features || {}; - this.plupload.required_features.send_binary_string = true; - } - - // Initialize the plupload instance. - this.uploader = new plupload.Uploader( this.plupload ); - delete this.plupload; - - // Set default params and remove this.params alias. - this.param( this.params || {} ); - delete this.params; - - // Make sure that the VideoPress object is available - if ( typeof exports.VideoPress !== 'undefined' ) { - vp = exports.VideoPress; - - } else { - window.console && window.console.error( 'The VideoPress object was not loaded. Errors may occur.' ); - } - - /** - * Custom error callback. - * - * Add a new error to the errors collection, so other modules can track - * and display errors. @see wp.Uploader.errors. - * - * @param {string} message - * @param {object} data - * @param {plupload.File} file File that was uploaded. - */ - error = function( message, data, file ) { - if ( file.attachment ) { - file.attachment.destroy(); - } - - Uploader.errors.unshift({ - message: message || pluploadL10n.default_error, - data: data, - file: file - }); - - self.error( message, data, file ); - }; - - /** - * After the Uploader has been initialized, initialize some behaviors for the dropzone. - * - * @param {plupload.Uploader} uploader Uploader instance. - */ - this.uploader.bind( 'init', function( uploader ) { - var timer, active, dragdrop, - dropzone = self.dropzone; - - dragdrop = self.supports.dragdrop = uploader.features.dragdrop && ! Uploader.browser.mobile; - - // Generate drag/drop helper classes. - if ( ! dropzone ) { - return; - } - - dropzone.toggleClass( 'supports-drag-drop', !! dragdrop ); - - if ( ! dragdrop ) { - return dropzone.unbind('.wp-uploader'); - } - - // 'dragenter' doesn't fire correctly, simulate it with a limited 'dragover'. - dropzone.bind( 'dragover.wp-uploader', function() { - if ( timer ) { - clearTimeout( timer ); - } - - if ( active ) { - return; - } - - dropzone.trigger('dropzone:enter').addClass('drag-over'); - active = true; - }); - - dropzone.bind('dragleave.wp-uploader, drop.wp-uploader', function() { - // Using an instant timer prevents the drag-over class from - // being quickly removed and re-added when elements inside the - // dropzone are repositioned. - // - // @see https://core.trac.wordpress.org/ticket/21705 - timer = setTimeout( function() { - active = false; - dropzone.trigger('dropzone:leave').removeClass('drag-over'); - }, 0 ); - }); - - self.ready = true; - $(self).trigger( 'uploader:ready' ); - }); - - this.uploader.bind( 'postinit', function( up ) { - up.refresh(); - self.init(); - }); - - this.uploader.init(); - - if ( this.browser ) { - this.browser.on( 'mouseenter', this.refresh ); - } else { - this.uploader.disableBrowse( true ); - // If HTML5 mode, hide the auto-created file container. - $('#' + this.uploader.id + '_html5_container').hide(); - } - - /** - * After files were filtered and added to the queue, create a model for each. - * - * @event FilesAdded - * @param {plupload.Uploader} uploader Uploader instance. - * @param {Array} files Array of file objects that were added to queue by the user. - */ - this.uploader.bind( 'FilesAdded', function( up, files ) { - _.each( files, function( file ) { - var attributes, image; - - // Ignore failed uploads. - if ( plupload.FAILED === file.status ) { - return; - } - - // Generate attributes for a new `Attachment` model. - attributes = _.extend({ - file: file, - uploading: true, - date: new Date(), - filename: file.name, - menuOrder: 0, - uploadedTo: wp.media.model.settings.post.id - }, _.pick( file, 'loaded', 'size', 'percent' ) ); - - // Handle early mime type scanning for images. - image = /(?:jpe?g|png|gif)$/i.exec( file.name ); - - // For images set the model's type and subtype attributes. - if ( image ) { - attributes.type = 'image'; - - // `jpeg`, `png` and `gif` are valid subtypes. - // `jpg` is not, so map it to `jpeg`. - attributes.subtype = ( 'jpg' === image[0] ) ? 'jpeg' : image[0]; - } - - // Create a model for the attachment, and add it to the Upload queue collection - // so listeners to the upload queue can track and display upload progress. - file.attachment = wp.media.model.Attachment.create( attributes ); - Uploader.queue.add( file.attachment ); - - self.added( file.attachment ); - }); - - up.refresh(); - up.start(); - }); - - this.uploader.bind( 'UploadProgress', function( up, file ) { - file.attachment.set( _.pick( file, 'loaded', 'percent' ) ); - self.progress( file.attachment ); - }); - - /** - * After a file is successfully uploaded, update its model. - * - * @param {plupload.Uploader} uploader Uploader instance. - * @param {plupload.File} file File that was uploaded. - * @param {Object} response Object with response properties. - * @return {mixed} - */ - this.uploader.bind( 'FileUploaded', function( up, file, response ) { - var complete; - - try { - response = JSON.parse( response.response ); - } catch ( e ) { - return error( pluploadL10n.default_error, e, file ); - } - - if ( typeof response.media !== 'undefined' ) { - response = vp.handleRestApiResponse( response, file ); - } else { - response = vp.handleStandardResponse( response, file ); - } - - _.each(['file','loaded','size','percent'], function( key ) { - file.attachment.unset( key ); - }); - - file.attachment.set( _.extend( response.data, { uploading: false }) ); - wp.media.model.Attachment.get( response.data.id, file.attachment ); - - complete = Uploader.queue.all( function( attachment ) { - return ! attachment.get('uploading'); - }); - - if ( complete ) { - vp && vp.resetToOriginalOptions( up ); - Uploader.queue.reset(); - } - - self.success( file.attachment ); - }); - - /** - * When plupload surfaces an error, send it to the error handler. - * - * @param {plupload.Uploader} uploader Uploader instance. - * @param {Object} error Contains code, message and sometimes file and other details. - */ - this.uploader.bind( 'Error', function( up, pluploadError ) { - var message = pluploadL10n.default_error, - key; - - // Check for plupload errors. - for ( key in Uploader.errorMap ) { - if ( pluploadError.code === plupload[ key ] ) { - message = Uploader.errorMap[ key ]; - - if ( _.isFunction( message ) ) { - message = message( pluploadError.file, pluploadError ); - } - - break; - } - } - - error( message, pluploadError, pluploadError.file ); - vp && vp.resetToOriginalOptions( up ); - up.refresh(); - }); - - /** - * Add in a way for the uploader to reset itself when uploads are complete. - */ - this.uploader.bind( 'UploadComplete', function( up ) { - vp && vp.resetToOriginalOptions( up ); - }); - - /** - * Before we upload, check to see if this file is a videopress upload, if so, set new options and save the old ones. - */ - this.uploader.bind( 'BeforeUpload', function( up, file ) { - if ( typeof file.videopress !== 'undefined' ) { - vp.originalOptions.url = up.getOption( 'url' ); - vp.originalOptions.multipart_params = up.getOption( 'multipart_params' ); - vp.originalOptions.file_data_name = up.getOption( 'file_data_name' ); - - up.setOption( 'file_data_name', 'media[]' ); - up.setOption( 'url', file.videopress.upload_action_url ); - up.setOption( 'multipart_params', { 'media_ids[]': file.videopress.upload_media_id } ); - up.setOption( 'headers', { - Authorization: 'X_UPLOAD_TOKEN token="' + file.videopress.upload_token + '" blog_id="' + file.videopress.upload_blog_id + '"' - }); - } - }); - }; - - // Adds the 'defaults' and 'browser' properties. - $.extend( Uploader, _wpPluploadSettings ); - - Uploader.uuid = 0; - - // Map Plupload error codes to user friendly error messages. - Uploader.errorMap = { - 'FAILED': pluploadL10n.upload_failed, - 'FILE_EXTENSION_ERROR': pluploadL10n.invalid_filetype, - 'IMAGE_FORMAT_ERROR': pluploadL10n.not_an_image, - 'IMAGE_MEMORY_ERROR': pluploadL10n.image_memory_exceeded, - 'IMAGE_DIMENSIONS_ERROR': pluploadL10n.image_dimensions_exceeded, - 'GENERIC_ERROR': pluploadL10n.upload_failed, - 'IO_ERROR': pluploadL10n.io_error, - 'HTTP_ERROR': pluploadL10n.http_error, - 'SECURITY_ERROR': pluploadL10n.security_error, - - 'FILE_SIZE_ERROR': function( file ) { - return pluploadL10n.file_exceeds_size_limit.replace('%s', file.name); - } - }; - - $.extend( Uploader.prototype, { - /** - * Acts as a shortcut to extending the uploader's multipart_params object. - * - * param( key ) - * Returns the value of the key. - * - * param( key, value ) - * Sets the value of a key. - * - * param( map ) - * Sets values for a map of data. - */ - param: function( key, value ) { - if ( arguments.length === 1 && typeof key === 'string' ) { - return this.uploader.settings.multipart_params[ key ]; - } - - if ( arguments.length > 1 ) { - this.uploader.settings.multipart_params[ key ] = value; - } else { - $.extend( this.uploader.settings.multipart_params, key ); - } - }, - - /** - * Make a few internal event callbacks available on the wp.Uploader object - * to change the Uploader internals if absolutely necessary. - */ - init: function() {}, - error: function() {}, - success: function() {}, - added: function() {}, - progress: function() {}, - complete: function() {}, - refresh: function() { - var node, attached, container, id; - - if ( this.browser ) { - node = this.browser[0]; - - // Check if the browser node is in the DOM. - while ( node ) { - if ( node === document.body ) { - attached = true; - break; - } - node = node.parentNode; - } - - // If the browser node is not attached to the DOM, use a - // temporary container to house it, as the browser button - // shims require the button to exist in the DOM at all times. - if ( ! attached ) { - id = 'wp-uploader-browser-' + this.uploader.id; - - container = $( '#' + id ); - if ( ! container.length ) { - container = $('<div class="wp-uploader-browser" />').css({ - position: 'fixed', - top: '-1000px', - left: '-1000px', - height: 0, - width: 0 - }).attr( 'id', 'wp-uploader-browser-' + this.uploader.id ).appendTo('body'); - } - - container.append( this.browser ); - } - } - - this.uploader.refresh(); - } - }); - - // Create a collection of attachments in the upload queue, - // so that other modules can track and display upload progress. - Uploader.queue = new wp.media.model.Attachments( [], { query: false }); - - // Create a collection to collect errors incurred while attempting upload. - Uploader.errors = new Backbone.Collection(); - - exports.Uploader = Uploader; -})( wp, jQuery ); diff --git a/plugins/jetpack/modules/videopress-v2/js/videopress-uploader.js b/plugins/jetpack/modules/videopress-v2/js/videopress-uploader.js deleted file mode 100644 index afe50e69..00000000 --- a/plugins/jetpack/modules/videopress-v2/js/videopress-uploader.js +++ /dev/null @@ -1,157 +0,0 @@ -/* globals plupload, pluploadL10n, error */ -window.wp = window.wp || {}; - -( function( wp ) { - var VideoPress = { - originalOptions: {}, - - /** - * This is the standard uploader response handler. - */ - handleStandardResponse: function( response, file ) { - if ( ! _.isObject( response ) || _.isUndefined( response.success ) ) { - return error(pluploadL10n.default_error, null, file); - - } else if ( ! response.success ) { - return error(response.data && response.data.message, response.data, file); - } - - return response; - }, - - /** - * Handle response from the WPCOM Rest API. - */ - handleRestApiResponse: function( response, file ) { - if ( response.media.length !== 1) { - return error( pluploadL10n.default_error, null, file ); - } - - var media = response.media[0], - mimeParts = media.mime_type.split('/'), - data = { - alt : '', - author : media.author_ID || 0, - authorName: '', - caption: '', - compat: { item: '', meta: '' }, - date: media.date || '', - dateFormatted: media.date || '', - description: media.description || '', - editLink: '', - filename: media.file || '', - filesizeHumanReadable: '', - filesizeInBytes: '', - height: media.height, - icon: media.icon || '', - id: media.ID || '', - link: media.URL || '', - menuOrder: 0, - meta: false, - mime: media.mime_type || '', - modified: 0, - name: '', - nonces: { update: '', 'delete': '', edit: '' }, - orientation: '', - sizes: {}, - status: '', - subtype: mimeParts[1] || '', - title: media.title || '', - type: mimeParts[0] || '', - uploadedTo: 1, - uploadedToLink: '', - uploadedToTitle: '', - url: media.URL || '', - width: media.width, - success: '', - videopress: { - guid: media.videopress_guid || null, - processing_done: media.videopress_processing_done || false - } - }; - - response.data = data; - - return response; - }, - - /** - * Make sure that all of the original variables have been reset, so the uploader - * doesn't try to go to VideoPress again next time. - * - * @param up - */ - resetToOriginalOptions: function( up ) { - if ( typeof VideoPress.originalOptions.url !== 'undefined' ) { - up.setOption( 'url', VideoPress.originalOptions.url ); - delete VideoPress.originalOptions.url; - } - - if ( typeof VideoPress.originalOptions.multipart_params !== 'undefined' ) { - up.setOption( 'multipart_params', VideoPress.originalOptions.multipart_params ); - delete VideoPress.originalOptions.multipart_params; - } - - if ( typeof VideoPress.originalOptions.file_data_name !== 'undefined' ) { - up.setOption( 'file_data_name', VideoPress.originalOptions.file_data_name ); - delete VideoPress.originalOptions.file_data_name; - } - } - }; - - if (typeof wp.Uploader !== 'undefined') { - var media = wp.media; - - /** - * A plupload code specifically for videopress failures. - * - * @type {string} - */ - plupload.VIDEOPRESS_TOKEN_FAILURE = 'VP_TOKEN_FAILURE'; - - /** - * Adds a filter that checks all files to see if they are videopress files and if they are - * it will download extra metadata for them. - */ - plupload.addFileFilter( 'videopress_check_uploads', function( maxSize, file, cb ) { - var mimeParts = file.type.split('/'); - var self = this; - - if ( mimeParts[0] === 'video' ) { - media.ajax( 'videopress-get-upload-token', { async: false, data: { filename: file.name } } ).done( function ( response ) { - file.videopress = response; - cb( true ); - - }).fail( function ( response ) { - self.trigger( 'Error', { - code : plupload.VIDEOPRESS_TOKEN_FAILURE, - message : plupload.translate( 'Could not get the VideoPress token needed for uploading' ), - file : file, - response : response - } ); - cb( false ); - }); - - } else { - // Handles the normal max_file_size functionality. - var undef; - - // Invalid file size - if (file.size !== undef && maxSize && file.size > maxSize) { - this.trigger('Error', { - code: plupload.FILE_SIZE_ERROR, - message: plupload.translate( 'File size error.' ), - file: file - }); - cb(false); - } else { - cb(true); - } - } - }); - } - - wp.VideoPress = VideoPress; - -} )( window.wp ); - diff --git a/plugins/jetpack/modules/videopress-v2/shortcode.php b/plugins/jetpack/modules/videopress-v2/shortcode.php deleted file mode 100644 index ca846de2..00000000 --- a/plugins/jetpack/modules/videopress-v2/shortcode.php +++ /dev/null @@ -1,189 +0,0 @@ -<?php - -/** - * VideoPress Shortcode Handler - * - * This file may or may not be included from the Jetpack VideoPress module. - */ - -/** - * Translate a 'videopress' or 'wpvideo' shortcode and arguments into a video player display. - * - * Expected input formats: - * - * [videopress OcobLTqC] - * [wpvideo OcobLTqC] - * - * @link http://codex.wordpress.org/Shortcode_API Shortcode API - * @param array $attr shortcode attributes - * @return string HTML markup or blank string on fail - */ -function videopress_shortcode_callback( $attr ) { - global $content_width; - - /** - * We only accept GUIDs as a first unnamed argument. - */ - $guid = $attr[0]; - - /** - * Make sure the GUID passed in matches how actual GUIDs are formatted. - */ - if ( ! videopress_is_valid_guid( $guid ) ) { - return ''; - } - - /** - * Set the defaults - */ - $defaults = array( - 'w' => 0, // Width of the video player, in pixels - 'at' => 0, // How many seconds in to initially seek to - 'hd' => true, // Whether to display a high definition version - 'loop' => false, // Whether to loop the video repeatedly - 'freedom' => false, // Whether to use only free/libre codecs - 'autoplay' => false, // Whether to autoplay the video on load - 'permalink' => true, // Whether to display the permalink to the video - 'flashonly' => false, // Whether to support the Flash player exclusively - 'defaultlangcode' => false, // Default language code - ); - - $attr = shortcode_atts( $defaults, $attr, 'videopress' ); - - /** - * Cast the attributes, post-input. - */ - $attr['width'] = absint( $attr['w'] ); - $attr['hd'] = (bool) $attr['hd']; - $attr['freedom'] = (bool) $attr['freedom']; - - /** - * If the provided width is less than the minimum allowed - * width, or greater than `$content_width` ignore. - */ - if ( $attr['width'] < VIDEOPRESS_MIN_WIDTH ) { - $attr['width'] = 0; - } elseif ( isset( $content_width ) && $content_width > VIDEOPRESS_MIN_WIDTH && $attr['width'] > $content_width ) { - $attr['width'] = 0; - } - - /** - * If there was an invalid or unspecified width, set the width equal to the theme's `$content_width`. - */ - if ( 0 === $attr['width'] && isset( $content_width ) && $content_width >= VIDEOPRESS_MIN_WIDTH ) { - $attr['width'] = $content_width; - } - - /** - * If the width isn't an even number, reduce it by one (making it even). - */ - if ( 1 === ( $attr['width'] % 2 ) ) { - $attr['width'] --; - } - - /** - * Filter the default VideoPress shortcode options. - * - * @module videopress - * - * @since 2.5.0 - * - * @param array $args Array of VideoPress shortcode options. - */ - $options = apply_filters( 'videopress_shortcode_options', array( - 'at' => (int) $attr['at'], - 'hd' => $attr['hd'], - 'loop' => $attr['autoplay'] || $attr['loop'], - 'freedom' => $attr['freedom'], - 'autoplay' => $attr['autoplay'], - 'permalink' => $attr['permalink'], - 'force_flash' => (bool) $attr['flashonly'], - 'defaultlangcode' => $attr['defaultlangcode'], - 'forcestatic' => false, // This used to be a displayed option, but now is only - // accessible via the `videopress_shortcode_options` filter. - ) ); - - // Register VideoPress scripts - wp_register_script( 'videopress', 'https://v0.wordpress.com/js/videopress.js', array( 'jquery', 'swfobject' ), '1.09' ); - - require_once( dirname( __FILE__ ) . '/class.videopress-video.php' ); - require_once( dirname( __FILE__ ) . '/class.videopress-player.php' ); - - $player = new VideoPress_Player( $guid, $attr['width'], $options ); - - if ( is_feed() ) { - return $player->asXML(); - } else { - return $player->asHTML(); - } -} -add_shortcode( 'videopress', 'videopress_shortcode_callback' ); -add_shortcode( 'wpvideo', 'videopress_shortcode_callback' ); - -/** - * By explicitly declaring the provider here, we can speed things up by not relying on oEmbed discovery. - */ -wp_oembed_add_provider( '#^https?://videopress.com/v/.*#', 'http://public-api.wordpress.com/oembed/1.0/', true ); - -/** - * Adds a `for` query parameter to the oembed provider request URL. - * @param String $oembed_provider - * @return String $ehnanced_oembed_provider - */ -function videopress_add_oembed_for_parameter( $oembed_provider ) { - if ( false === stripos( $oembed_provider, 'videopress.com' ) ) { - return $oembed_provider; - } - return add_query_arg( 'for', parse_url( home_url(), PHP_URL_HOST ), $oembed_provider ); -} -add_filter( 'oembed_fetch_url', 'videopress_add_oembed_for_parameter' ); - -/** - * An intermediary shortcode parser for the Core `[video]` shortcode. - * - * This lets us convert legacy video embeds over to VideoPress embeds, - * if the video files have been uploaded and transcoded. - * - * @param $attr - * - * @return string|void - */ -function videopress_shortcode_override_for_core_shortcode( $raw_attr, $contents, $tag ) { - $attr = $raw_attr; - $videopress_guid = null; - - if ( isset( $attr['videopress_guid'] ) ) { - $videopress_guid = $attr['videopress_guid']; - - } elseif ( isset( $attr['mp4'] ) ) { - $url = $attr['mp4']; - - if ( preg_match( '@videos.videopress.com/([a-z0-9]{8})/@', $url, $matches ) ) { - $videopress_guid = $matches[1]; - } - } - - if ( $videopress_guid ) { - $videopress_attr = array( $videopress_guid ); - if ( $attr['width'] ) { - $videopress_attr['w'] = (int) $attr['width']; - } - if ( $attr['autoplay'] ) { - $videopress_attr['autoplay'] = $attr['autoplay']; - } - if ( $attr['loop'] ) { - $videopress_attr['loop'] = $attr['loop']; - } - - // Then display the VideoPress version of the stored GUID! - return videopress_shortcode_callback( $videopress_attr ); - } - - // Nothing else caught, so fall back to the core shortcode. - return call_user_func( $GLOBALS['vp_original_video_shortcode_callback'], $raw_attr, $contents, $tag ); -} -// The callback should nearly always be `wp_video_shortcode` unless some other plugin -// has overridden it similarly to what we're doing here. -$GLOBALS['vp_original_video_shortcode_callback'] = $GLOBALS['shortcode_tags']['video']; -remove_shortcode( 'video' ); -add_shortcode( 'video', 'videopress_shortcode_override_for_core_shortcode' ); diff --git a/plugins/jetpack/modules/videopress-v2/utility-functions.php b/plugins/jetpack/modules/videopress-v2/utility-functions.php deleted file mode 100644 index 5826cc71..00000000 --- a/plugins/jetpack/modules/videopress-v2/utility-functions.php +++ /dev/null @@ -1,420 +0,0 @@ -<?php - -/** - * We won't have any videos less than sixty pixels wide. That would be silly. - */ -defined( 'VIDEOPRESS_MIN_WIDTH' ) or define( 'VIDEOPRESS_MIN_WIDTH', 60 ); - -/** - * Validate user-supplied guid values against expected inputs - * - * @since 1.1 - * @param string $guid video identifier - * @return bool true if passes validation test - */ -function videopress_is_valid_guid( $guid ) { - if ( ! empty( $guid ) && strlen( $guid ) === 8 && ctype_alnum( $guid ) ) { - return true; - } - return false; -} - -/** - * Get details about a specific video by GUID: - * - * @param $guid string - * @return object - */ -function videopress_get_video_details( $guid ) { - if ( ! videopress_is_valid_guid( $guid ) ) { - return new WP_Error( 'bad-guid-format', __( 'Invalid Video GUID!', 'jetpack' ) ); - } - - $version = '1.1'; - $endpoint = sprintf( '/videos/%1$s', $guid ); - $query_url = sprintf( - 'https://public-api.wordpress.com/rest/v%1$s%2$s', - $version, - $endpoint - ); - - // Look for data in our transient. If nothing, let's make a new query. - $data_from_cache = get_transient( 'jetpack_videopress_' . $guid ); - if ( false === $data_from_cache ) { - $response = wp_remote_get( esc_url_raw( $query_url ) ); - $data = json_decode( wp_remote_retrieve_body( $response ) ); - - // Cache the response for an hour. - set_transient( 'jetpack_videopress_' . $guid, $data, HOUR_IN_SECONDS ); - } else { - $data = $data_from_cache; - } - - /** - * Allow functions to modify fetched video details. - * - * This filter allows third-party code to modify the return data - * about a given video. It may involve swapping some data out or - * adding new parameters. - * - * @since 4.0.0 - * - * @param object $data The data returned by the WPCOM API. See: https://developer.wordpress.com/docs/api/1.1/get/videos/%24guid/ - * @param string $guid The GUID of the VideoPress video in question. - */ - return apply_filters( 'videopress_get_video_details', $data, $guid ); -} - - -/** - * Get an attachment ID given a URL. - * - * Modified from http://wpscholar.com/blog/get-attachment-id-from-wp-image-url/ - * - * @todo: Add some caching in here. - * - * @param string $url - * - * @return int|bool Attachment ID on success, false on failure - */ -function videopress_get_attachment_id_by_url( $url ) { - $wp_upload_dir = wp_upload_dir(); - // Strip out protocols, so it doesn't fail because searching for http: in https: dir. - $dir = set_url_scheme( trailingslashit( $wp_upload_dir['baseurl'] ), 'relative' ); - - // Is URL in uploads directory? - if ( false !== strpos( $url, $dir ) ) { - - $file = basename( $url ); - - $query_args = array( - 'post_type' => 'attachment', - 'post_status' => 'inherit', - 'fields' => 'ids', - 'meta_query' => array( - array( - 'key' => '_wp_attachment_metadata', - 'compare' => 'LIKE', - 'value' => $file, - ), - ) - ); - - $query = new WP_Query( $query_args ); - - if ( $query->have_posts() ) { - foreach ( $query->posts as $attachment_id ) { - $meta = wp_get_attachment_metadata( $attachment_id ); - $original_file = basename( $meta['file'] ); - $cropped_files = wp_list_pluck( $meta['sizes'], 'file' ); - - if ( $original_file === $file || in_array( $file, $cropped_files ) ) { - return (int) $attachment_id; - } - } - } - - } - - return false; -} - -/** - * Similar to `media_sideload_image` -- but returns an ID. - * - * @param $url - * @param $attachment_id - * - * @return int|mixed|object|WP_Error - */ -function videopress_download_poster_image( $url, $attachment_id ) { - // Set variables for storage, fix file filename for query strings. - preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $url, $matches ); - if ( ! $matches ) { - return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL', 'jetpack' ) ); - } - - $file_array = array(); - $file_array['name'] = basename( $matches[0] ); - $file_array['tmp_name'] = download_url( $url ); - - // If error storing temporarily, return the error. - if ( is_wp_error( $file_array['tmp_name'] ) ) { - return $file_array['tmp_name']; - } - - // Do the validation and storage stuff. - $thumbnail_id = media_handle_sideload( $file_array, $attachment_id, null ); - - // Flag it as poster image, so we can exclude it from display. - update_post_meta( $thumbnail_id, 'videopress_poster_image', 1 ); - - return $thumbnail_id; -} - -/** - * Creates a local media library item of a remote VideoPress video. - * - * @param $guid - * @param int $parent_id - * - * @return int|object - */ -function create_local_media_library_for_videopress_guid( $guid, $parent_id = 0 ) { - $vp_data = videopress_get_video_details( $guid ); - if ( ! $vp_data || is_wp_error( $vp_data ) ) { - return $vp_data; - } - - $args = array( - 'post_date' => $vp_data->upload_date, - 'post_title' => wp_kses( $vp_data->title, array() ), - 'post_content' => wp_kses( $vp_data->description, array() ), - 'post_mime_type' => 'video/videopress', - 'guid' => sprintf( 'https://videopress.com/v/%s', $guid ), - ); - - $attachment_id = wp_insert_attachment( $args, null, $parent_id ); - - if ( ! is_wp_error( $attachment_id ) ) { - update_post_meta( $attachment_id, 'videopress_guid', $guid ); - wp_update_attachment_metadata( $attachment_id, array( - 'width' => $vp_data->width, - 'height' => $vp_data->height, - ) ); - - $thumbnail_id = videopress_download_poster_image( $vp_data->poster, $attachment_id ); - update_post_meta( $attachment_id, '_thumbnail_id', $thumbnail_id ); - } - - return $attachment_id; -} - -/** - * Helper that will look for VideoPress media items that are more than 30 minutes old, - * that have not had anything attached to them by a wpcom upload and deletes the ghost - * attachment. - * - * These happen primarily because of failed upload attempts. - * - * @return int The number of items that were cleaned up. - */ -function videopress_cleanup_media_library() { - $query_args = array( - 'post_type' => 'attachment', - 'post_status' => 'inherit', - 'post_mime_type' => 'video/videopress', - 'meta_query' => array( - array( - 'key' => 'videopress_status', - 'value' => 'new', - ), - ) - ); - - $query = new WP_Query( $query_args ); - - $cleaned = 0; - - $now = current_time( 'timestamp' ); - - if ( $query->have_posts() ) { - foreach ( $query->posts as $post ) { - $post_time = strtotime( $post->post_date_gmt ); - - // If the post is older than 30 minutes, it is safe to delete it. - if ( $now - $post_time > MINUTE_IN_SECONDS * 30 ) { - // Force delete the attachment, because we don't want it appearing in the trash. - wp_delete_attachment( $post->ID, true ); - - $cleaned++; - } - } - } - - return $cleaned; -} - -/** - * Return an absolute URI for a given filename and guid on the CDN. - * No check is performed to ensure the guid exists or the file is present. Simple centralized string builder. - * - * @param string $guid VideoPress identifier - * @param string $filename name of file associated with the guid (video file name or thumbnail file name) - * - * @return string Absolute URL of VideoPress file for the given guid. - */ -function videopress_cdn_file_url( $guid, $filename ) { - return "https://videos.files.wordpress.com/{$guid}/{$filename}"; -} - -/** - * Get an array of the transcoding status for the given video post. - * - * @since 4.4 - * @param int $post_id - * @return array|bool Returns an array of statuses if this is a VideoPress post, otherwise it returns false. - */ -function videopress_get_transcoding_status( $post_id ) { - $meta = wp_get_attachment_metadata( $post_id ); - - // If this has not been processed by videopress, we can skip the rest. - if ( !$meta || ! isset( $meta['videopress'] ) ) { - return false; - } - - $info = (object) $meta['videopress']; - - $status = array( - 'std_mp4' => isset( $info->files_status['std']['mp4'] ) ? $info->files_status['std']['mp4'] : null, - 'std_ogg' => isset( $info->files_status['std']['ogg'] ) ? $info->files_status['std']['ogg'] : null, - 'dvd_mp4' => isset( $info->files_status['dvd']['mp4'] ) ? $info->files_status['dvd']['mp4'] : null, - 'hd_mp4' => isset( $info->files_status['hd']['mp4'] ) ? $info->files_status['hd']['mp4'] : null, - ); - - return $status; -} - -/** - * Get the direct url to the video. - * - * @since 4.4 - * @param string $guid - * @return string - */ -function videopress_build_url( $guid ) { - return 'https://videopress.com/v/' . $guid; -} - -/** - * Create an empty videopress media item that will be filled out later by an xmlrpc - * callback from the VideoPress servers. - * - * @since 4.4 - * @param string $title - * @return int|WP_Error - */ -function videopress_create_new_media_item( $title ) { - $post = array( - 'post_type' => 'attachment', - 'post_mime_type' => 'video/videopress', - 'post_title' => $title, - 'post_content' => '', - ); - - $media_id = wp_insert_post( $post ); - - add_post_meta( $media_id, 'videopress_status', 'new' ); - - return $media_id; -} - - -/** - * Check to see if a video has completed processing. - * - * @since 4.4 - * @param int $post_id - * @return bool - */ -function videopress_is_finished_processing( $post_id ) { - $post = get_post( $post_id ); - - if ( is_wp_error( $post ) ) { - return false; - } - - $meta = wp_get_attachment_metadata( $post->ID ); - - if ( ! isset( $meta['videopress'] ) || ! is_array( $meta['videopress'] ) ) { - return false; - } - - // These are explicitly declared to avoid doing unnecessary loops across two levels of arrays. - if ( isset( $meta['videopress']['files_status']['hd'] ) && $meta['videopress']['files_status']['hd'] != 'DONE' ) { - return false; - } - - if ( isset( $meta['videopress']['files_status']['dvd'] ) && $meta['videopress']['files_status']['dvd'] != 'DONE' ) { - return false; - } - - if ( isset( $meta['videopress']['files_status']['std']['mp4'] ) && $meta['videopress']['files_status']['std']['mp4'] != 'DONE' ) { - return false; - } - - if ( isset( $meta['videopress']['files_status']['std']['ogg'] ) && $meta['videopress']['files_status']['std']['ogg'] != 'DONE' ) { - return false; - } - - return true; -} - - -/** - * Update the meta information status for the given video post. - * - * @since 4.4 - * @param int $post_id - * @return bool - */ -function videopress_update_meta_data( $post_id ) { - - $meta = wp_get_attachment_metadata( $post_id ); - - // If this has not been processed by VideoPress, we can skip the rest. - if ( ! $meta || ! isset( $meta['videopress'] ) ) { - return false; - } - - $info = (object) $meta['videopress']; - - $result = wp_remote_get( videopress_make_video_get_path( $info->guid ) ); - - if ( is_wp_error( $result ) ) { - return false; - } - - $response = json_decode( $result['body'], true ); - - // Update the attachment metadata. - $meta['videopress'] = $response; - - wp_update_attachment_metadata( $post_id, $meta ); - - return true; -} - - - -/** - * Get the video update path - * - * @since 4.4 - * @param string $guid - * @return string - */ -function videopress_make_video_get_path( $guid ) { - return sprintf( - '%s://%s/rest/v%s/videos/%s', - 'https', - JETPACK__WPCOM_JSON_API_HOST, - Jetpack_Client::WPCOM_JSON_API_VERSION, - $guid - ); -} - -/** - * Get the upload api path. - * - * @since 4.4 - * @param int $blog_id The id of the blog we're uploading to. - * @return string - */ -function videopress_make_media_upload_path( $blog_id ) { - return sprintf( - 'https://%s/rest/v1.1/sites/%s/videos/new', - JETPACK__WPCOM_JSON_API_HOST, - $blog_id - ); -}
\ No newline at end of file diff --git a/plugins/jetpack/modules/videopress-v2/videopress-admin.css b/plugins/jetpack/modules/videopress-v2/videopress-admin.css deleted file mode 100644 index c8f1b0af..00000000 --- a/plugins/jetpack/modules/videopress-v2/videopress-admin.css +++ /dev/null @@ -1,97 +0,0 @@ -/** - * VideoPress admin media styles - */ -.videopress-modal-backdrop { - background: #000; - opacity: 0.7; - position: absolute; - top: 0; - width: 100%; - height: 100%; - overflow: hidden; - z-index: 100; -} - -.videopress-modal { - padding: 10px 20px; - background: white; - position: absolute; - top: 0; - width: 440px; - overflow: hidden; - left: 50%; - margin-left: -220px; - z-index: 101; - box-shadow: 2px 2px 5px 2px rgba( 0, 0, 0, 0.5 ); - -webkit-border-bottom-right-radius: 2px; - -webkit-border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 2px; -} - -.videopress-modal .submit { - text-align: right; - padding: 10px 0 5px; -} - -.videopress-preview { - display: block; - float: right; - width: 65%; - margin-top: 18px; - background: black; - min-height: 97px; - text-decoration: none; -} - -.vp-preview span.videopress-preview-unavailable { - width: 65%; - float: right; - text-align: left; - margin-right: 0; -} - -.videopress-preview img { - float: left; - width: 100%; -} - -.videopress-preview span { - display: block; - padding-top: 40px; - color: white !important; - text-align: center; -} - -.vp-setting .help { - margin: 0 0 4px 35%; -} - -.media-sidebar .vp-setting input[type="checkbox"] { - float: left; - margin-top: 10px; -} - -.vp-setting label { - float: left; - margin: 8px 8px 0 5px; - max-width: 135px; -} - -.vp-setting input[type='radio'] { - float: left; - margin-top: 9px; - width: auto; -} - -.vp-preview span { - margin-top: 18px; -} - -.uploader-videopress { - margin: 16px; -} - -.uploader-videopress .videopress-errors div { - margin: 16px 0; -}
\ No newline at end of file |