PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.9.2
Jetpack – WP Security, Backup, Speed, & Growth v13.9.2
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 / shortcodes / brightcove.php
jetpack / modules / shortcodes Last commit date
css 2 years ago images 2 years ago img 2 years ago js 2 years ago archiveorg-book.php 5 years ago archiveorg.php 5 years ago archives.php 5 years ago bandcamp.php 3 years ago brightcove.php 5 years ago cartodb.php 5 years ago class.filter-embedded-html-objects.php 2 years ago codepen.php 5 years ago crowdsignal.php 2 years ago dailymotion.php 3 years ago descript.php 4 years ago facebook.php 2 years ago flatio.php 5 years ago flickr.php 2 years ago getty.php 2 years ago gist.php 3 years ago googleapps.php 2 years ago googlemaps.php 2 years ago googleplus.php 5 years ago gravatar.php 2 years ago houzz.php 5 years ago inline-pdfs.php 4 years ago instagram.php 3 years ago kickstarter.php 3 years ago mailchimp.php 3 years ago medium.php 3 years ago mixcloud.php 2 years ago others.php 2 years ago pinterest.php 2 years ago presentations.php 2 years ago quiz.php 4 years ago recipe.php 2 years ago scribd.php 5 years ago sitemap.php 5 years ago slideshare.php 5 years ago slideshow.php 2 years ago smartframe.php 3 years ago soundcloud.php 3 years ago spotify.php 2 years ago ted.php 5 years ago tweet.php 2 years ago twitchtv.php 5 years ago twitter-timeline.php 5 years ago unavailable.php 3 years ago untappd-menu.php 3 years ago upcoming-events.php 3 years ago ustream.php 5 years ago videopress.php 4 years ago vimeo.php 2 years ago vine.php 5 years ago vr.php 2 years ago wordads.php 5 years ago wufoo.php 3 years ago youtube.php 1 year ago
brightcove.php
298 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 use Automattic\Jetpack\Assets;
4
5 /**
6 * Brightcove shortcode.
7 *
8 * Brighcove had renovated their video player embedding code since they introduced their "new studio".
9 * See https://support.brightcove.com/en/video-cloud/docs.
10 * The new code is not 100% backward compatible, as long as a customized player is used.
11 * By the time I wrote this, there were about 150000+ posts embedded legacy players, so it would be a bad
12 * idea either to introduce a new brightcove shortcode, or to break those posts completely.
13 *
14 * That's why we introduce a less aggressive way: leaving the old embedding code untouched, and
15 * introduce a new set of shortcode parameters which are translated to the latest Brightcove embedding code.
16 *
17 * e.g.
18 * [brightcove video_id="12345" account_id="99999"] will be translated to the latest embedding code.
19 * [brightcove exp=627045696&vid=1415670151] or [brightcove exp=1463233149&vref=1601200825] will be translated
20 * to the legacy code.
21 */
22 class Jetpack_Brightcove_Shortcode {
23 /**
24 * Shortcode name.
25 *
26 * @var string
27 */
28 public static $shortcode = 'brightcove';
29
30 /**
31 * Parse shortcode arguments and render its output.
32 *
33 * @since 4.5.0
34 *
35 * @param array $atts Shortcode parameters.
36 *
37 * @return string
38 */
39 public static function convert( $atts ) {
40 $normalized_atts = self::normalize_attributes( $atts );
41
42 if ( empty( $atts ) ) {
43 return '<!-- Missing Brightcove parameters -->';
44 }
45
46 return self::has_legacy_atts( $normalized_atts )
47 ? self::convert_to_legacy_studio( $normalized_atts )
48 : self::convert_to_new_studio( $normalized_atts );
49 }
50
51 /**
52 * We need to take care of two kinds of shortcode format here.
53 * The latest: [shortcode a=1 b=2] and the legacy: [shortcode a=1&b=2]
54 * For an old shortcode: [shortcode a=1&b=2&c=3], it would be parsed into array( 'a' => 1&b=2&c=3' ), which is useless.
55 * However, since we want to determine whether to call convert_to_legacy_studio() or convert_to_new_studio() via passed parameters, we still need to parse the two properly.
56 * See https://jetpack.wp-a2z.org/oik_api/shortcode_new_to_old_params/
57 *
58 * @since 4.5.0
59 *
60 * @param array $atts Shortcode parameters.
61 *
62 * @return array
63 */
64 public static function normalize_attributes( $atts ) {
65 if ( is_array( $atts ) && 1 === count( $atts ) ) { // this is the case we need to take care of.
66 $parsed_atts = array();
67 $params = shortcode_new_to_old_params( $atts );
68
69 /**
70 * Filter the Brightcove shortcode parameters.
71 *
72 * @module shortcodes
73 *
74 * @since 4.5.0
75 *
76 * @param string $params String of shortcode parameters.
77 */
78 $params = apply_filters( 'brightcove_dimensions', $params );
79 parse_str( $params, $parsed_atts );
80
81 return $parsed_atts;
82 } else {
83 return $atts;
84 }
85 }
86
87 /**
88 * Check that it has legacy attributes.
89 *
90 * @since 4.5.0
91 *
92 * @param array $atts Shortcode parameters.
93 *
94 * @return bool
95 */
96 public static function has_legacy_atts( $atts ) {
97 return ( isset( $atts['vid'] ) || isset( $atts['vref'] ) )
98 && ( isset( $atts['exp'] ) || isset( $atts['exp3'] ) );
99 }
100
101 /**
102 * Convert to latest player format.
103 *
104 * @since 4.5.0
105 *
106 * @param array $atts Shortcode parameters.
107 *
108 * @return string
109 */
110 public static function convert_to_new_studio( $atts ) {
111 $defaults = array(
112 'account_id' => '',
113 'video_id' => '',
114 'player_id' => 'default',
115 'width' => '100%',
116 'height' => '100%',
117 );
118
119 $atts_applied = shortcode_atts( $defaults, $atts, self::$shortcode );
120
121 $player_url = sprintf(
122 '//players.brightcove.net/%s/%s_default/index.html?videoId=%s',
123 esc_attr( $atts_applied['account_id'] ),
124 esc_attr( $atts_applied['player_id'] ),
125 esc_attr( $atts_applied['video_id'] )
126 );
127
128 $output_html = sprintf(
129 '<iframe src="' . esc_url( $player_url ) . '" allowfullscreen webkitallowfullscreen mozallowfullscreen style="width: %spx; height: %spx;"></iframe>',
130 esc_attr( $atts_applied['width'] ),
131 esc_attr( $atts_applied['height'] )
132 );
133
134 return $output_html;
135 }
136
137 /**
138 * Convert to legacy player format.
139 *
140 * [brightcove exp=627045696&vid=1415670151] for the older player and backward compatibility
141 * [brightcove exp=1463233149&vref=1601200825] for the new player
142 *
143 * @since 4.5.0
144 *
145 * @param array $atts Shortcode parameters.
146 *
147 * @return string
148 */
149 public static function convert_to_legacy_studio( $atts ) {
150 $attr = shortcode_atts(
151 array(
152 'bg' => '',
153 'exp' => '',
154 'exp3' => '',
155 'h' => '',
156 'lbu' => '',
157 'pk' => '',
158 'pubid' => '',
159 's' => '',
160 'surl' => '',
161 'vid' => '',
162 'vref' => '',
163 'w' => '',
164 ),
165 $atts
166 );
167
168 if ( isset( $attr['pk'] ) ) {
169 $attr['pk'] = rawurlencode( preg_replace( '/[^a-zA-Z0-9!*\'();:@&=+$,\/?#\[\]\-_.~ ]/', '', $attr['pk'] ) );
170 }
171
172 if ( isset( $attr['bg'] ) ) {
173 $attr['bg'] = preg_replace( '![^-a-zA-Z0-9#]!', '', $attr['bg'] );
174 }
175
176 $fv = array(
177 'viewerSecureGatewayURL' => 'https://services.brightcove.com/services/amfgateway',
178 'servicesURL' => 'http://services.brightcove.com/services',
179 'cdnURL' => 'http://admin.brightcove.com',
180 'autoStart' => 'false',
181 );
182
183 $js_tld = 'com';
184 $src = '';
185 $name = 'flashObj';
186 $html5 = false;
187
188 if ( isset( $attr['exp3'] ) ) {
189 if ( isset( $attr['surl'] ) && strpos( $attr['surl'], 'brightcove.co.jp' ) ) {
190 $js_tld = 'co.jp';
191 }
192 if ( ! isset( $attr['surl'] ) || ! preg_match( '#^https?://(?:[a-z\d-]+\.)*brightcove\.(?:com|co\.jp)/#', $attr['surl'] ) ) {
193 $attr['surl'] = 'http://c.brightcove.com/services';
194 }
195
196 $attr['exp3'] = (int) $attr['exp3'];
197 $attr['pubid'] = (int) $attr['pubid'];
198 $attr['vid'] = (int) $attr['vid'];
199
200 $fv['servicesURL'] = $attr['surl'];
201 $fv['playerID'] = $attr['exp3'];
202 $fv['domain'] = 'embed';
203 $fv['videoID'] = (int) $attr['vid'];
204
205 $src = sprintf(
206 '%s/viewer/federated_f9/%s?isVid=1&amp;isUI=1&amp;publisherID=%s',
207 $attr['surl'],
208 $attr['exp3'],
209 $attr['pubid']
210 );
211 $html5 = true;
212 } elseif ( isset( $attr['exp'] ) ) {
213 $attr['exp'] = (int) $attr['exp'];
214 $src = 'http://services.brightcove.com/services/viewer/federated_f8/' . $attr['exp'];
215 if ( $attr['vid'] ) {
216 $fv['videoId'] = $attr['vid'];
217 } elseif ( $attr['vref'] ) {
218 $fv['videoRef'] = $attr['vref'];
219 }
220
221 $fv['playerId'] = $attr['exp'];
222 $fv['domain'] = 'embed';
223 } else {
224 return '<small>brightcove error: missing required parameter exp or exp3</small>';
225 }
226
227 if ( ! empty( $attr['lbu'] ) ) {
228 $fv['linkBaseURL'] = $attr['lbu'];
229 }
230
231 $flashvars = trim( add_query_arg( array_map( 'urlencode', $fv ), '' ), '?' );
232
233 $width = null;
234 $height = null;
235
236 if ( ! empty( $attr['w'] ) && ! empty( $attr['h'] ) ) {
237 $w = abs( (int) $attr['w'] );
238 $h = abs( (int) $attr['h'] );
239 if ( $w && $h ) {
240 $width = $w;
241 $height = $h;
242 }
243 } elseif ( empty( $attr['s'] ) || 'l' === $attr['s'] ) {
244 $width = '480';
245 $height = '360';
246 }
247
248 if ( empty( $width ) || empty( $height ) ) {
249 $width = '280';
250 $height = '210';
251 }
252
253 if ( $html5 ) {
254 wp_enqueue_script(
255 'brightcove-loader',
256 Assets::get_file_url_for_environment( '_inc/build/shortcodes/js/brightcove.min.js', 'modules/shortcodes/js/brightcove.js' ),
257 array( 'jquery' ),
258 20121127,
259 false
260 );
261 wp_localize_script(
262 'brightcove-loader',
263 'brightcoveData',
264 array(
265 'tld' => esc_js( $js_tld ),
266 )
267 );
268
269 return '
270 <object id="myExperience" class="BrightcoveExperience">
271 <param name="bgcolor" value="' . esc_attr( $attr['bg'] ) . '" />
272 <param name="width" value="' . esc_attr( $width ) . '" />
273 <param name="height" value="' . esc_attr( $height ) . '" />
274 <param name="playerID" value="' . esc_attr( $attr['exp3'] ) . '" />
275 <param name="@videoPlayer" value="' . esc_attr( $attr['vid'] ) . '" />
276 <param name="playerKey" value="' . esc_attr( $attr['pk'] ) . '" />
277 <param name="isVid" value="1" />
278 <param name="isUI" value="1" />
279 <param name="dynamicStreaming" value="true" />
280 <param name="autoStart" value="false" />
281 <param name="secureConnections" value="true" />
282 <param name="secureHTMLConnections" value="true" />
283 </object>';
284 }
285
286 return sprintf(
287 '<embed src="%s" bgcolor="#FFFFFF" flashvars="%s" base="http://admin.brightcove.com" name="%s" width="%s" height="%s" allowFullScreen="true" seamlesstabbing="false" type="application/x-shockwave-flash" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" />',
288 esc_url( $src ),
289 $flashvars,
290 esc_attr( $name ),
291 esc_attr( $width ),
292 esc_attr( $height )
293 );
294 }
295 }
296
297 add_shortcode( Jetpack_Brightcove_Shortcode::$shortcode, array( 'Jetpack_Brightcove_Shortcode', 'convert' ) );
298