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