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