PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.8.3
Jetpack – WP Security, Backup, Speed, & Growth v12.8.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 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 / modules / videopress / class.videopress-video.php
jetpack / modules / videopress Last commit date
css 3 years ago js 3 years ago class-videopress-attachment-metadata.php 4 years ago class.jetpack-videopress.php 4 years ago class.videopress-cli.php 3 years ago class.videopress-edit-attachment.php 3 years ago class.videopress-gutenberg.php 3 years ago class.videopress-options.php 2 years ago class.videopress-player.php 3 years ago class.videopress-scheduler.php 4 years ago class.videopress-video.php 4 years ago class.videopress-xmlrpc.php 2 years ago editor-media-view.php 3 years ago shortcode.php 2 years ago videopress-admin-rtl.css 4 years ago videopress-admin-rtl.min.css 4 years ago videopress-admin.css 4 years ago videopress-admin.min.css 4 years ago
class.videopress-video.php
372 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * VideoPress video object retrieved from VideoPress servers and parsed.
4 *
5 * @since 1.3
6 */
7 class VideoPress_Video {
8 /**
9 * VideoPress version.
10 *
11 * @var int
12 */
13 public $version = 3;
14
15 /**
16 * Manifest version returned by remote service.
17 *
18 * @var string
19 * @since 1.3
20 */
21 const manifest_version = '1.5'; // phpcs:ignore Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase
22
23 /**
24 * Expiration of the video expressed in Unix time
25 *
26 * @var int
27 * @since 1.3
28 */
29 public $expires;
30
31 /**
32 * VideoPress unique identifier
33 *
34 * @var string
35 * @since 1.3
36 */
37 public $guid;
38
39 /**
40 * WordPress.com blog identifier
41 *
42 * @var int
43 * @since 1.5
44 */
45 public $blog_id;
46
47 /**
48 * Remote blog attachment identifier
49 *
50 * @var int
51 * @since 1.5
52 */
53 public $post_id;
54
55 /**
56 * Maximum desired width.
57 *
58 * @var int
59 * @since 1.3
60 */
61 public $maxwidth;
62
63 /**
64 * Video width calculated based on original video dimensions and the requested maxwidth
65 *
66 * @var int
67 * @since 1.3
68 */
69 public $calculated_width;
70
71 /**
72 * Video height calculated based on original video dimensions and the requested maxwidth
73 *
74 * @var int
75 * @since 1.3
76 */
77 public $calculated_height;
78
79 /**
80 * Video title
81 *
82 * @var string
83 * @since 1.3
84 */
85 public $title;
86
87 /**
88 * Video description
89 *
90 * @var string
91 * @since 4.4
92 */
93 public $description;
94
95 /**
96 * Directionality of title text. ltr or rtl
97 *
98 * @var string
99 * @since 1.3
100 */
101 public $text_direction;
102
103 /**
104 * Text and audio language as ISO 639-2 language code
105 *
106 * @var string
107 * @since 1.3
108 */
109 public $language;
110
111 /**
112 * Video duration in whole seconds
113 *
114 * @var int
115 * @since 1.3
116 */
117 public $duration;
118
119 /**
120 * Recommended minimum age of the viewer.
121 *
122 * @var int
123 * @since 1.3
124 */
125 public $age_rating;
126
127 /**
128 * Video author has restricted video embedding or sharing
129 *
130 * @var bool
131 * @since 1.3
132 */
133 public $restricted_embed;
134
135 /**
136 * Poster frame image URI for the given video guid and calculated dimensions.
137 *
138 * @var string
139 * @since 1.3
140 */
141 public $poster_frame_uri;
142
143 /**
144 * Video files associated with the given guid for the calculated dimensions.
145 *
146 * @var stdClass
147 * @since 1.3
148 */
149 public $videos;
150
151 /**
152 * Video player information
153 *
154 * @var stdClass
155 * @since 1.3
156 */
157 public $players;
158
159 /**
160 * Video player skinning preferences including background color and watermark
161 *
162 * @var array
163 * @since 1.5
164 */
165 public $skin;
166
167 /**
168 * Closed captions if available for the given video. Associative array of ISO 639-2 language code and a WebVTT URI
169 *
170 * @var array
171 * @since 1.5
172 */
173 public $captions;
174
175 /**
176 * Setup the object.
177 * Request video information from VideoPress servers and process the response.
178 *
179 * @since 1.3
180 * @param string $guid VideoPress unique identifier.
181 * @param 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.
182 */
183 public function __construct( $guid, $maxwidth = 640 ) {
184 $this->guid = $guid;
185
186 $maxwidth = absint( $maxwidth );
187 if ( $maxwidth > 0 ) {
188 $this->maxwidth = $maxwidth;
189 }
190
191 $data = $this->get_data();
192 if ( is_wp_error( $data ) || empty( $data ) ) {
193 /** This filter is documented in modules/videopress/class.videopress-player.php */
194 if ( ! apply_filters( 'jetpack_videopress_use_legacy_player', false ) ) {
195 // Unlike the Flash player, the new player does it's own error checking, age gate, etc.
196 $data = (object) array(
197 'guid' => $guid,
198 'width' => $maxwidth,
199 'height' => $maxwidth / 16 * 9,
200 );
201 } else {
202 $this->error = $data;
203 return;
204 }
205 }
206
207 if ( isset( $data->blog_id ) ) {
208 $this->blog_id = absint( $data->blog_id );
209 }
210
211 if ( isset( $data->post_id ) ) {
212 $this->post_id = absint( $data->post_id );
213 }
214
215 if ( isset( $data->title ) && $data->title !== '' ) {
216 $this->title = trim( str_replace( '&nbsp;', ' ', $data->title ) );
217 }
218
219 if ( isset( $data->description ) && $data->description !== '' ) {
220 $this->description = trim( $data->description );
221 }
222
223 if ( isset( $data->text_direction ) && $data->text_direction === 'rtl' ) {
224 $this->text_direction = 'rtl';
225 } else {
226 $this->text_direction = 'ltr';
227 }
228
229 if ( isset( $data->language ) ) {
230 $this->language = $data->language;
231 }
232
233 if ( isset( $data->duration ) && $data->duration > 0 ) {
234 $this->duration = absint( $data->duration );
235 }
236
237 if ( isset( $data->width ) && $data->width > 0 ) {
238 $this->calculated_width = absint( $data->width );
239 }
240
241 if ( isset( $data->height ) && $data->height > 0 ) {
242 $this->calculated_height = absint( $data->height );
243 }
244
245 if ( isset( $data->age_rating ) ) {
246 $this->age_rating = absint( $this->age_rating );
247 }
248
249 if ( isset( $data->restricted_embed ) && $data->restricted_embed === true ) {
250 $this->restricted_embed = true;
251 } else {
252 $this->restricted_embed = false;
253 }
254
255 if ( isset( $data->posterframe ) && $data->posterframe !== '' ) {
256 $this->poster_frame_uri = esc_url_raw( $data->posterframe, array( 'http', 'https' ) );
257 }
258
259 if ( isset( $data->mp4 ) || isset( $data->ogv ) ) {
260 $this->videos = new stdClass();
261 if ( isset( $data->mp4 ) ) {
262 $this->videos->mp4 = $data->mp4;
263 }
264 if ( isset( $data->ogv ) ) {
265 $this->videos->ogv = $data->ogv;
266 }
267 }
268
269 if ( isset( $data->swf ) ) {
270 if ( ! isset( $this->players ) ) {
271 $this->players = new stdClass();
272 }
273 $this->players->swf = $data->swf;
274 }
275
276 if ( isset( $data->skin ) ) {
277 $this->skin = $data->skin;
278 }
279
280 if ( isset( $data->captions ) ) {
281 $this->captions = (array) $data->captions;
282 }
283 }
284
285 /**
286 * Convert an Expires HTTP header value into Unix time for use in WP Cache.
287 *
288 * @since 1.3
289 * @param string $expires_header Expires header value.
290 * @return int|bool Unix time or false
291 */
292 public static function calculate_expiration( $expires_header ) {
293 if ( empty( $expires_header ) || ! is_string( $expires_header ) ) {
294 return false;
295 }
296
297 $expires_date = DateTime::createFromFormat( 'D, d M Y H:i:s T', $expires_header, new DateTimeZone( 'UTC' ) );
298 if ( $expires_date instanceof DateTime ) {
299 return date_format( $expires_date, 'U' );
300 }
301 return false;
302 }
303
304 /**
305 * Extract the site's host domain for statistics and comparison against an allowed site list in the case of restricted embeds.
306 *
307 * @since 1.2
308 * @param string $url absolute URL.
309 * @return bool|string host component of the URL, or false if none found.
310 */
311 public static function hostname( $url ) {
312 return wp_parse_url( esc_url_raw( $url ), PHP_URL_HOST );
313 }
314
315 /**
316 * Request data from WordPress.com for the given guid, maxwidth, and calculated blog hostname.
317 *
318 * @since 1.3
319 * @return stdClass|WP_Error parsed JSON response or WP_Error if request unsuccessful
320 */
321 private function get_data() {
322 global $wp_version;
323
324 $domain = self::hostname( home_url() );
325 $request_params = array(
326 'guid' => $this->guid,
327 'domain' => $domain,
328 );
329 if ( isset( $this->maxwidth ) && $this->maxwidth > 0 ) {
330 $request_params['maxwidth'] = $this->maxwidth;
331 }
332
333 $url = 'https://v.wordpress.com/data/wordpress.json';
334
335 $response = wp_remote_get(
336 add_query_arg( $request_params, $url ),
337 array(
338 'redirection' => 1,
339 'user-agent' => 'VideoPress plugin ' . $this->version . '; WordPress ' . $wp_version . ' (' . home_url( '/' ) . ')',
340 )
341 );
342
343 unset( $request_params );
344 unset( $url );
345 $response_body = wp_remote_retrieve_body( $response );
346 $response_code = absint( wp_remote_retrieve_response_code( $response ) );
347
348 if ( is_wp_error( $response ) ) {
349 return $response;
350 } elseif ( $response_code === 400 ) {
351 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' ) );
352 } elseif ( $response_code === 403 ) {
353 /* translators: %s URL of site trying to embed a VideoPress video */
354 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>' );
355 } elseif ( $response_code === 404 ) {
356 /* translators: %s VideoPress object identifier */
357 return new WP_Error( 'http_not_found', '<p>' . sprintf( __( 'No data found for VideoPress identifier: <strong>%s</strong>.', 'jetpack' ), $this->guid ) . '</p>' );
358 } elseif ( $response_code !== 200 || empty( $response_body ) ) {
359 return;
360 } else {
361 $expires_header = wp_remote_retrieve_header( $response, 'Expires' );
362 if ( ! empty( $expires_header ) ) {
363 $expires = self::calculate_expiration( $expires_header );
364 if ( ! empty( $expires ) ) {
365 $this->expires = $expires;
366 }
367 }
368 return json_decode( $response_body );
369 }
370 }
371 }
372