PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-videopress / src / class-block-editor-content.php
jetpack / jetpack_vendor / automattic / jetpack-videopress / src Last commit date
js 2 months ago tus 1 month ago videopress-divi 2 months ago videopress-divi-5 2 months ago class-access-control.php 5 days ago class-admin-ui.php 2 weeks ago class-ajax.php 1 month ago class-attachment-handler.php 1 month ago class-block-editor-content.php 1 month ago class-block-editor-extensions.php 2 weeks ago class-block-replacement.php 9 months ago class-caption-tracks.php 1 month ago class-data.php 1 month ago class-divi.php 2 months ago class-initial-state.php 2 weeks ago class-initializer.php 5 days ago class-jwt-token-bridge.php 2 years ago class-module-control.php 3 years ago class-options.php 2 years ago class-package-version.php 5 days ago class-plan.php 2 years ago class-rest-controller.php 1 month ago class-site.php 3 years ago class-stats.php 1 year ago class-status.php 9 months ago class-upload-exception.php 3 years ago class-uploader-rest-endpoints.php 2 weeks ago class-uploader.php 1 month ago class-utils.php 3 months ago class-video-block-email-renderer.php 2 months ago class-videopress-rest-api-v1-features.php 6 months ago class-videopress-rest-api-v1-settings.php 1 month ago class-videopress-rest-api-v1-site.php 2 weeks ago class-videopress-rest-api-v1-stats.php 3 years ago class-videopresstoken.php 1 month ago class-wpcom-rest-api-v2-attachment-field-videopress.php 9 months ago class-wpcom-rest-api-v2-attachment-videopress-data.php 1 month ago class-wpcom-rest-api-v2-endpoint-videopress-caption-tracks.php 1 month ago class-wpcom-rest-api-v2-endpoint-videopress.php 2 weeks ago class-xmlrpc.php 1 month ago utility-functions.php 4 weeks ago
class-block-editor-content.php
252 lines
1 <?php
2 /**
3 * VideoPress Block Editor Content
4 *
5 * @package automattic/jetpack-videopress
6 */
7
8 namespace Automattic\Jetpack\VideoPress;
9
10 use WP_Post;
11
12 /**
13 * VideoPress block editor class for content generation
14 */
15 class Block_Editor_Content {
16 /**
17 * Initializer
18 *
19 * This method should be called only once by the Initializer class. Do not call this method again.
20 */
21 public static function init() {
22 if ( ! Status::is_standalone_plugin_active() ) {
23 return;
24 }
25
26 // Remove the videopress shortcodes added by the Jetpack plugin.
27 if ( shortcode_exists( 'videopress' ) ) {
28 remove_shortcode( 'videopress' );
29 }
30 if ( shortcode_exists( 'wpvideo' ) ) {
31 remove_shortcode( 'wpvideo' );
32 }
33
34 add_shortcode( 'videopress', array( static::class, 'videopress_embed_shortcode' ) );
35 add_shortcode( 'wpvideo', array( static::class, 'videopress_embed_shortcode' ) );
36
37 add_filter( 'wp_video_shortcode_override', array( static::class, 'video_shortcode_override' ), 10, 4 );
38
39 add_filter( 'default_content', array( static::class, 'videopress_video_block_by_guid' ), 10, 2 );
40 }
41
42 /**
43 * VideoPress embed shortcode
44 *
45 * Expected input format:
46 * [videopress tLvEwHYZ]
47 *
48 * @param array $atts Shortcode attributes.
49 *
50 * @return string html
51 */
52 public static function videopress_embed_shortcode( $atts ) {
53 /**
54 * We only accept GUIDs as a first unnamed argument.
55 */
56 $guid = $atts[0] ?? null;
57
58 /**
59 * Make sure the GUID passed in matches how actual GUIDs are formatted.
60 */
61 if ( ! videopress_is_valid_guid( $guid ) ) {
62 return '<!-- error: missing or invalid VideoPress video ID -->';
63 }
64
65 /**
66 * Set the defaults
67 */
68 $defaults = array(
69 'w' => 640, // Width of the video player, in pixels
70 'h' => 0, // Height of the video player, in pixels
71 'at' => 0, // How many seconds in to initially seek to
72 'loop' => false, // Whether to loop the video repeatedly
73 'autoplay' => false, // Whether to autoplay the video on load
74 'cover' => true, // Whether to scale the video to its container
75 'muted' => false, // Whether the video should start without sound
76 'controls' => true, // Whether the video should display controls
77 'playsinline' => false, // Whether the video should be allowed to play inline (for browsers that support this)
78 'useaveragecolor' => false, // Whether the video should use the seekbar automatic average color
79 'preloadcontent' => 'metadata',
80 );
81
82 // Make sure "false" will be actually false.
83 foreach ( $atts as $key => $value ) {
84 if ( is_string( $value ) && 'false' === strtolower( $value ) ) {
85 $atts[ $key ] = 0;
86 }
87 }
88
89 if ( isset( $atts['preload'] ) && videopress_is_valid_preload( $atts['preload'] ) ) {
90 $atts['preloadcontent'] = $atts['preload'];
91 }
92
93 if ( isset( $atts['preloadcontent'] ) && ! videopress_is_valid_preload( $atts['preloadcontent'] ) ) {
94 unset( $atts['preloadcontent'] );
95 }
96
97 $atts = shortcode_atts( $defaults, $atts, 'videopress' );
98
99 $base_url = 'https://videopress.com/embed/' . $guid;
100 $query_params = array(
101 'at' => $atts['at'],
102 'loop' => $atts['loop'],
103 'autoplay' => $atts['autoplay'],
104 'muted' => $atts['muted'],
105 'controls' => $atts['controls'],
106 'playsinline' => $atts['playsinline'],
107 'useAverageColor' => $atts['useaveragecolor'], // The casing is intentional, shortcode params are lowercase, but player expects useAverageColor
108 'preloadContent' => $atts['preloadcontent'], // The casing is intentional, shortcode params are lowercase, but player expects preloadContent
109 );
110 $src = esc_url( add_query_arg( $query_params, $base_url ) );
111
112 $width = absint( $atts['w'] );
113 if ( ! $atts['h'] ) {
114 $aspect_ratio = 16 / 9; // TODO: Get the correct aspect ratio for the video.
115 $height = $width / $aspect_ratio;
116 } else {
117 $height = absint( $atts['h'] );
118 }
119
120 $cover = $atts['cover'] ? ' data-resize-to-parent="true"' : '';
121
122 $block_template =
123 '<figure class="wp-block-videopress-video wp-block-jetpack-videopress jetpack-videopress-player">' .
124 '<div class="jetpack-videopress-player__wrapper">' .
125 '<iframe ' .
126 'title="' . __( 'VideoPress Video Player', 'jetpack-videopress-pkg' ) . '" ' .
127 'aria-label="' . __( 'VideoPress Video Player', 'jetpack-videopress-pkg' ) . '" ' .
128 'src="%s" ' .
129 'width="%s" ' .
130 'height="%s" ' .
131 'frameborder="0" ' .
132 'allowfullscreen%s allow="clipboard-write; presentation">' .
133 '</iframe>' .
134 '</div>' .
135 '</figure>';
136
137 $version = Package_Version::PACKAGE_VERSION;
138 Jwt_Token_Bridge::enqueue_jwt_token_bridge();
139 wp_enqueue_script( 'videopress-iframe', 'https://videopress.com/videopress-iframe.js', array(), $version, true );
140
141 return sprintf( $block_template, $src, $width, $height, $cover );
142 }
143
144 /**
145 * Generates a VideoPress video block content with the given guid
146 *
147 * @param string $content Post content.
148 * @param WP_Post $post Post.
149 * @return string
150 */
151 public static function videopress_video_block_by_guid( $content, $post ) {
152 if ( isset( $_GET['videopress_guid'] ) && isset( $_GET['_wpnonce'] )
153 && wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), 'videopress-content-nonce' )
154 && current_user_can( 'edit_post', $post->ID )
155 && '' === $content
156 ) {
157 $guid = sanitize_text_field( wp_unslash( $_GET['videopress_guid'] ) );
158
159 $base_url = 'https://videopress.com/v/' . $guid;
160 $query_params = array(
161 'resizeToParent' => 'true',
162 'cover' => 'true',
163 'preloadContent' => 'metadata',
164 'useAverageColor' => 'true',
165 );
166 $url = esc_url( add_query_arg( $query_params, $base_url ) );
167
168 if ( ! empty( $guid ) ) {
169 // ref /client/lib/url/index.ts
170 $content = '<!-- wp:videopress/video {"guid":"' . $guid . '"} -->
171 <figure class="wp-block-videopress-video wp-block-jetpack-videopress jetpack-videopress-player">
172 <div class="jetpack-videopress-player__wrapper">' . $url . '</div>
173 </figure>
174 <!-- /wp:videopress/video -->';
175 }
176 }
177
178 return $content;
179 }
180
181 /**
182 * Override the standard video short tag to also process videopress files as well.
183 *
184 * This will parse the given src and, if it is a videopress file, parse as the
185 * VideoPress shortcode instead.
186 *
187 * @param string $html Empty variable to be replaced with shortcode markup.
188 * @param array $attr Attributes of the video shortcode.
189 * @param string $content Video shortcode content.
190 * @param int $instance Unique numeric ID of this video shortcode instance.
191 *
192 * @return string
193 */
194 public static function video_shortcode_override( $html, $attr, $content, $instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
195 $videopress_guid = null;
196
197 if ( isset( $attr['videopress_guid'] ) ) {
198 $videopress_guid = $attr['videopress_guid'];
199 } else {
200 // Handle the different possible url attributes
201 $url_keys = array( 'src', 'mp4' );
202
203 foreach ( $url_keys as $key ) {
204 if ( isset( $attr[ $key ] ) ) {
205 $url = $attr[ $key ];
206 // phpcs:ignore WordPress.WP.CapitalPDangit
207 if ( preg_match( '@videos.(videopress\.com|files\.wordpress\.com)/([a-z0-9]{8})/@i', $url, $matches ) ) {
208 $videopress_guid = $matches[2];
209 }
210
211 // Also test for videopress oembed url, which is used by the Video Media Widget.
212 if ( ! $videopress_guid && preg_match( '@https://videopress.com/v/([a-z0-9]{8})@i', $url, $matches ) ) {
213 $videopress_guid = $matches[1];
214 }
215
216 // Also test for old v.wordpress.com oembed URL.
217 if ( ! $videopress_guid && preg_match( '|^https?://v\.wordpress\.com/([a-zA-Z\d]{8})(.+)?$|i', $url, $matches ) ) { // phpcs:ignore WordPress.WP.CapitalPDangit.MisspelledInText
218 $videopress_guid = $matches[1];
219 }
220
221 break;
222 }
223 }
224 }
225
226 if ( $videopress_guid ) {
227 $videopress_atts = array( $videopress_guid );
228
229 // height is ignored on jetpack video block, so we don't pass it for consistency.
230 if ( isset( $attr['width'] ) ) {
231 $videopress_atts['w'] = (int) $attr['width'];
232 }
233 if ( isset( $attr['muted'] ) ) {
234 $videopress_atts['muted'] = $attr['muted'];
235 }
236 if ( isset( $attr['autoplay'] ) ) {
237 $videopress_atts['autoplay'] = $attr['autoplay'];
238 }
239 if ( isset( $attr['loop'] ) ) {
240 $videopress_atts['loop'] = $attr['loop'];
241 }
242 // The core video block doesn't support the cover attribute, setting it to false for consistency.
243 $videopress_atts['cover'] = false;
244
245 // Then display the VideoPress version of the stored GUID!
246 return self::videopress_embed_shortcode( $videopress_atts );
247 }
248
249 return '';
250 }
251 }
252