true ); } } // It is available on Simple Sites having the appropriate a plan. if ( defined( 'IS_WPCOM' ) && IS_WPCOM && method_exists( 'Store_Product_List', 'get_site_specific_features_data' ) ) { $features = Store_Product_List::get_site_specific_features_data(); if ( in_array( 'videopress', $features['active'], true ) ) { return array( 'available' => true ); } else { return array( 'available' => false, 'unavailable_reason' => 'missing_plan', ); } } // It is available on Jetpack Sites having the module active. if ( method_exists( 'Jetpack', 'is_connection_ready' ) && Jetpack::is_connection_ready() && method_exists( 'Jetpack', 'is_module_active' ) && method_exists( 'Jetpack_Plan', 'supports' ) ) { if ( Jetpack::is_module_active( 'videopress' ) ) { return array( 'available' => true ); } elseif ( ! Jetpack_Plan::supports( 'videopress' ) ) { return array( 'available' => false, 'unavailable_reason' => 'missing_plan', ); } else { return array( 'available' => false, 'unavailable_reason' => 'missing_module', ); } } return array( 'available' => false, 'unavailable_reason' => 'unknown', ); } /** * Set the Jetpack Gutenberg extension availability. */ public function set_extension_availability() { $availability = $this->check_videopress_availability(); if ( $availability['available'] ) { Jetpack_Gutenberg::set_extension_available( 'jetpack/videopress' ); } else { Jetpack_Gutenberg::set_extension_unavailable( 'jetpack/videopress', $availability['unavailable_reason'] ); } } /** * Register the core video block as a dynamic block. * * It defines a server-side rendering that adds VideoPress support to the core video block. */ public function register_video_block_with_videopress() { Blocks::jetpack_register_block( 'core/video', array( 'render_callback' => array( $this, 'render_video_block_with_videopress' ), ) ); } /** * Render the core video block replacing the src attribute with the VideoPress URL * * @param array $attributes Array containing the video block attributes. * @param string $content String containing the video block content. * * @return string */ public function render_video_block_with_videopress( $attributes, $content ) { if ( ! isset( $attributes['id'] ) || isset( $attributes['guid'] ) ) { return $content; } $blog_id = self::get_blog_id(); if ( ! isset( $blog_id ) ) { return $content; } $post_id = absint( $attributes['id'] ); $videopress_id = video_get_info_by_blogpostid( $blog_id, $post_id )->guid; $videopress_data = videopress_get_video_details( $videopress_id ); if ( empty( $videopress_data->file_url_base->https ) || empty( $videopress_data->files->hd->mp4 ) ) { return $content; } $videopress_url = $videopress_data->file_url_base->https . $videopress_data->files->hd->mp4; $pattern = '/(\s)src=([\'"])(?:(?!\2).)+?\2/'; return preg_replace( $pattern, sprintf( '\1src="%1$s"', esc_url_raw( $videopress_url ) ), $content, 1 ); } /** * Replaces the video uploaded in the block editor. * * Enqueues a script that registers an API fetch middleware replacing the video uploads in Gutenberg so they are * uploaded against the WP.com API media endpoint and thus transcoded by VideoPress. */ public function override_video_upload() { // Bail if Jetpack is not connected or VideoPress module is not active. if ( ! Jetpack::is_connection_ready() || ! Jetpack::is_module_active( 'videopress' ) ) { return; } wp_enqueue_script( 'jetpack-videopress-gutenberg-override-video-upload', Assets::get_file_url_for_environment( '_inc/build/videopress/js/gutenberg-video-upload.min.js', 'modules/videopress/js/gutenberg-video-upload.js' ), array( 'wp-api-fetch', 'wp-polyfill', 'lodash' ), JETPACK__VERSION, false ); } } VideoPress_Gutenberg::init();