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 / videopress / shortcode.php
jetpack / modules / videopress Last commit date
css 1 month ago js 1 month ago class-videopress-attachment-metadata.php 1 month ago class.jetpack-videopress.php 7 months ago class.videopress-cli.php 1 month ago class.videopress-edit-attachment.php 1 month ago class.videopress-gutenberg.php 7 months ago class.videopress-options.php 7 months ago class.videopress-player.php 3 days ago class.videopress-scheduler.php 7 months ago class.videopress-video.php 7 months ago class.videopress-xmlrpc.php 7 months ago editor-media-view.php 4 months ago shortcode.php 1 month ago videopress-admin-rtl.css 7 months ago videopress-admin-rtl.min.css 7 months ago videopress-admin.css 7 months ago videopress-admin.min.css 7 months ago
shortcode.php
276 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 if ( ! defined( 'ABSPATH' ) ) {
4 exit( 0 );
5 }
6
7 /**
8 * VideoPress Shortcode Handler
9 *
10 * This file may or may not be included from the Jetpack VideoPress module.
11 */
12 class VideoPress_Shortcode {
13 /**
14 * Singleton VideoPress_Shortcode instance.
15 *
16 * @var VideoPress_Shortcode
17 */
18 protected static $instance;
19
20 /**
21 * VideoPress_Shortcode constructor.
22 */
23 protected function __construct() {
24 // Only add the shortcode if it hasn't already been added by the standalone VideoPress plugin.
25 if ( ! shortcode_exists( 'videopress' ) ) {
26 add_shortcode( 'videopress', array( $this, 'shortcode_callback' ) );
27 add_shortcode( 'wpvideo', array( $this, 'shortcode_callback' ) );
28
29 add_filter( 'wp_video_shortcode_override', array( $this, 'video_shortcode_override' ), 10, 4 );
30 }
31
32 $this->add_video_embed_hander();
33 }
34
35 /**
36 * VideoPress_Shortcode initialization.
37 *
38 * @return VideoPress_Shortcode
39 */
40 public static function initialize() {
41 if ( ! isset( self::$instance ) ) {
42 self::$instance = new self();
43 }
44
45 return self::$instance;
46 }
47
48 /**
49 * Translate a 'videopress' or 'wpvideo' shortcode and arguments into a video player display.
50 *
51 * Expected input formats:
52 *
53 * [videopress OcobLTqC]
54 * [wpvideo OcobLTqC]
55 *
56 * @link https://codex.wordpress.org/Shortcode_API Shortcode API
57 * @param array $attr shortcode attributes.
58 * @return string HTML markup or blank string on fail
59 */
60 public function shortcode_callback( $attr ) {
61 global $content_width;
62
63 /**
64 * We only accept GUIDs as a first unnamed argument.
65 */
66 $guid = $attr[0] ?? null;
67
68 if ( isset( $attr['postid'] ) ) {
69 $guid = get_post_meta( $attr['postid'], 'videopress_guid', true );
70 }
71
72 /**
73 * Make sure the GUID passed in matches how actual GUIDs are formatted.
74 */
75 if ( ! videopress_is_valid_guid( $guid ) ) {
76 return '';
77 }
78
79 /**
80 * Set the defaults
81 */
82 $defaults = array(
83 'w' => 0, // Width of the video player, in pixels
84 'at' => 0, // How many seconds in to initially seek to
85 'hd' => true, // Whether to display a high definition version
86 'loop' => false, // Whether to loop the video repeatedly
87 'freedom' => false, // Whether to use only free/libre codecs
88 'autoplay' => false, // Whether to autoplay the video on load
89 'permalink' => true, // Whether to display the permalink to the video
90 'flashonly' => false, // Whether to support the Flash player exclusively
91 'defaultlangcode' => false, // Default language code
92 'cover' => true, // Whether to scale the video to its container.
93 'muted' => false, // Whether the video should start without sound.
94 'controls' => true, // Whether the video should display controls.
95 'playsinline' => false, // Whether the video should be allowed to play inline (for browsers that support this).
96 'useaveragecolor' => false, // Whether the video should use the seekbar automatic average color.
97 'preloadcontent' => 'metadata', // Setting for how the browser should preload the video (none, metadata, auto).
98 );
99
100 // Make sure "false" will be actually false.
101 foreach ( $attr as $key => $value ) {
102 if ( is_string( $value ) && 'false' === strtolower( $value ) ) {
103 $attr[ $key ] = false;
104 }
105 }
106
107 if ( isset( $attr['preload'] ) ) {
108 $attr['preloadcontent'] = $attr['preload'];
109 }
110
111 $attr = shortcode_atts( $defaults, $attr, 'videopress' );
112
113 /**
114 * Cast the attributes, post-input.
115 */
116 $attr['width'] = absint( $attr['w'] );
117 $attr['hd'] = (bool) $attr['hd'];
118 $attr['freedom'] = (bool) $attr['freedom'];
119
120 /**
121 * If the provided width is less than the minimum allowed
122 * width, or greater than `$content_width` ignore.
123 */
124 if ( $attr['width'] < VIDEOPRESS_MIN_WIDTH ) {
125 $attr['width'] = 0;
126 } elseif ( isset( $content_width ) && $content_width > VIDEOPRESS_MIN_WIDTH && $attr['width'] > $content_width ) {
127 $attr['width'] = 0;
128 }
129
130 /**
131 * If there was an invalid or unspecified width, set the width equal to the theme's `$content_width`.
132 */
133 if ( 0 === $attr['width'] && isset( $content_width ) && $content_width >= VIDEOPRESS_MIN_WIDTH ) {
134 $attr['width'] = (int) $content_width;
135 }
136
137 /**
138 * If the width isn't an even number, reduce it by one (making it even).
139 */
140 if ( 1 === ( $attr['width'] % 2 ) ) {
141 --$attr['width'];
142 }
143
144 /**
145 * Filter the default VideoPress shortcode options.
146 *
147 * @module videopress
148 *
149 * @since 2.5.0
150 *
151 * @param array $args Array of VideoPress shortcode options.
152 */
153 $options = apply_filters(
154 'videopress_shortcode_options',
155 array(
156 'at' => (int) $attr['at'],
157 'hd' => $attr['hd'],
158 'cover' => (bool) $attr['cover'],
159 'loop' => $attr['loop'],
160 'freedom' => $attr['freedom'],
161 'autoplay' => $attr['autoplay'],
162 'permalink' => $attr['permalink'],
163 'force_flash' => (bool) $attr['flashonly'],
164 'defaultlangcode' => $attr['defaultlangcode'],
165 'forcestatic' => false, // This used to be a displayed option, but now is only.
166 'muted' => $attr['muted'],
167 'controls' => $attr['controls'],
168 'playsinline' => $attr['playsinline'],
169 'useAverageColor' => (bool) $attr['useaveragecolor'], // The casing is intentional, shortcode params are lowercase, but player expects useAverageColor
170 'preloadContent' => $attr['preloadcontent'], // The casing is intentional, shortcode params are lowercase, but player expects preloadContent
171 // accessible via the `videopress_shortcode_options` filter.
172 )
173 );
174
175 // Register VideoPress scripts
176 wp_register_script( 'videopress', 'https://v0.wordpress.com/js/videopress.js', array( 'jquery', 'swfobject' ), '1.09', false );
177
178 require_once __DIR__ . '/class.videopress-video.php';
179 require_once __DIR__ . '/class.videopress-player.php';
180
181 $player = new VideoPress_Player( $guid, $attr['width'], $options );
182
183 if ( is_feed() ) {
184 return $player->as_xml();
185 } else {
186 return $player->as_html();
187 }
188 }
189
190 /**
191 * Override the standard video short tag to also process videopress files as well.
192 *
193 * This will, parse the src given, and if it is a videopress file, it will parse as the
194 * VideoPress shortcode instead.
195 *
196 * @param string $html Empty variable to be replaced with shortcode markup.
197 * @param array $attr Attributes of the video shortcode.
198 * @param string $content Video shortcode content.
199 * @param int $instance Unique numeric ID of this video shortcode instance.
200 *
201 * @return string
202 */
203 public function video_shortcode_override( $html, $attr, $content, $instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
204 $videopress_guid = null;
205
206 if ( isset( $attr['videopress_guid'] ) ) {
207 $videopress_guid = $attr['videopress_guid'];
208 } else {
209 // Handle the different possible url attributes
210 $url_keys = array( 'src', 'mp4' );
211
212 foreach ( $url_keys as $key ) {
213 if ( isset( $attr[ $key ] ) ) {
214 $url = $attr[ $key ];
215 // phpcs:ignore WordPress.WP.CapitalPDangit.MisspelledInText
216 if ( preg_match( '@videos.(videopress\.com|files\.wordpress\.com)/([a-z0-9]{8})/@i', $url, $matches ) ) {
217 $videopress_guid = $matches[2];
218 }
219
220 // Also test for videopress oembed url, which is used by the Video Media Widget.
221 if ( ! $videopress_guid && preg_match( '@https://videopress.com/v/([a-z0-9]{8})@i', $url, $matches ) ) {
222 $videopress_guid = $matches[1];
223 }
224
225 // Also test for old v.wordpress.com oembed URL.
226 if ( ! $videopress_guid && preg_match( '|^https?://v\.wordpress\.com/([a-zA-Z\d]{8})(.+)?$|i', $url, $matches ) ) { // phpcs:ignore WordPress.WP.CapitalPDangit.MisspelledInText
227 $videopress_guid = $matches[1];
228 }
229
230 break;
231 }
232 }
233 }
234
235 if ( $videopress_guid ) {
236 $videopress_attr = array( $videopress_guid );
237 if ( isset( $attr['width'] ) ) {
238 $videopress_attr['w'] = (int) $attr['width'];
239 }
240 if ( isset( $attr['muted'] ) ) {
241 $videopress_attr['muted'] = $attr['muted'];
242 }
243 if ( isset( $attr['autoplay'] ) ) {
244 $videopress_attr['autoplay'] = $attr['autoplay'];
245 }
246 if ( isset( $attr['loop'] ) ) {
247 $videopress_attr['loop'] = $attr['loop'];
248 }
249 // The core video block doesn't support the cover attribute, setting it to false for consistency.
250 $videopress_attr['cover'] = false;
251
252 // Then display the VideoPress version of the stored GUID!
253 return $this->shortcode_callback( $videopress_attr );
254 }
255
256 return '';
257 }
258
259 /**
260 * Register a VideoPress handler for direct links to .mov files (and potential other non-handled types later).
261 */
262 public function add_video_embed_hander() {
263 // These are the video extensions that VideoPress can transcode and considers video as well (even if core does not).
264 $extensions = array( 'mov' );
265 $override_extensions = implode( '|', $extensions );
266
267 $regex = "#^https?://videos.(videopress.com|files.wordpress.com)/.+?.($override_extensions)$#i";
268
269 /** This filter is already documented in core/wp-includes/embed.php */
270 $filter = apply_filters( 'wp_video_embed_handler', 'wp_embed_handler_video' );
271 wp_embed_register_handler( 'video', $regex, $filter, 10 );
272 }
273 }
274
275 VideoPress_Shortcode::initialize();
276