diff options
author | Yury German <blueknight@gentoo.org> | 2019-05-22 01:01:36 -0400 |
---|---|---|
committer | Yury German <blueknight@gentoo.org> | 2019-05-22 01:01:36 -0400 |
commit | 0914c92da22824025992c368c745546e41fbeb84 (patch) | |
tree | 965f6adf3b725e56d559fe4a93eff02281499dcc /plugins/jetpack/modules/videopress/class.videopress-gutenberg.php | |
parent | Deleting plugins for update (diff) | |
download | blogs-gentoo-0914c92da22824025992c368c745546e41fbeb84.tar.gz blogs-gentoo-0914c92da22824025992c368c745546e41fbeb84.tar.bz2 blogs-gentoo-0914c92da22824025992c368c745546e41fbeb84.zip |
Adding Plugins
Updating the following
akismet.4.1.2, google-authenticator.0.52, jetpack.7.3.1
Signed-off-by: Yury German <blueknight@gentoo.org>
Diffstat (limited to 'plugins/jetpack/modules/videopress/class.videopress-gutenberg.php')
-rw-r--r-- | plugins/jetpack/modules/videopress/class.videopress-gutenberg.php | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/videopress/class.videopress-gutenberg.php b/plugins/jetpack/modules/videopress/class.videopress-gutenberg.php new file mode 100644 index 00000000..be0bd1db --- /dev/null +++ b/plugins/jetpack/modules/videopress/class.videopress-gutenberg.php @@ -0,0 +1,169 @@ +<?php +/** + * Block Editor functionality for VideoPress users. + * + * @package Jetpack + */ + +/** + * Register a VideoPress extension to replace the default Core Video block. + */ +class VideoPress_Gutenberg { + + /** + * Singleton + */ + public static function init() { + static $instance = false; + + if ( ! $instance ) { + $instance = new VideoPress_Gutenberg(); + } + + return $instance; + } + + /** + * VideoPress_Gutenberg constructor. + * + * Initialize the VideoPress Gutenberg extension + */ + private function __construct() { + add_action( 'init', array( $this, 'register_video_block_with_videopress' ) ); + add_action( 'jetpack_register_gutenberg_extensions', array( $this, 'set_extension_availability' ) ); + } + + /** + * Used to check whether VideoPress is enabled for given site. + * + * @todo Create a global `jetpack_check_module_availability( $module )` helper so we can re-use it on other modules. + * This global helper should be created in a file synced with WordPress.com so we can use it there too. + * @see https://github.com/Automattic/jetpack/pull/11321#discussion_r255477815 + * + * @return array Associative array indicating if the module is available (key `available`) and the reason why it is + * unavailable (key `unavailable_reason`) + */ + public function check_videopress_availability() { + // 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_active' ) && Jetpack::is_active() + && 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() { + 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; + } + + if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) { + $blog_id = get_current_blog_id(); + } elseif ( method_exists( 'Jetpack', 'is_active' ) && Jetpack::is_active() ) { + /** + * We're intentionally not using `get_current_blog_id` because it was returning unexpected values. + * + * @see https://github.com/Automattic/jetpack/pull/11193#issuecomment-457883886 + * @see https://github.com/Automattic/jetpack/pull/11193/commits/215cf789f3d8bd03ff9eb1bbdb693acb8831d273 + */ + $blog_id = Jetpack_Options::get_option( '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 + ); + } +} + +VideoPress_Gutenberg::init(); |