PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.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-attachment-metadata.php
jetpack / modules / videopress Last commit date
css 3 months ago js 4 weeks ago class-videopress-attachment-metadata.php 2 months ago class.jetpack-videopress.php 4 weeks ago class.videopress-cli.php 2 months ago class.videopress-edit-attachment.php 2 months ago class.videopress-gutenberg.php 9 months ago class.videopress-options.php 9 months ago class.videopress-player.php 1 month ago class.videopress-scheduler.php 9 months ago class.videopress-video.php 9 months ago class.videopress-xmlrpc.php 9 months ago editor-media-view.php 5 months ago shortcode.php 2 months ago videopress-admin-rtl.css 9 months ago videopress-admin-rtl.min.css 9 months ago videopress-admin.css 9 months ago videopress-admin.min.css 9 months ago
class-videopress-attachment-metadata.php
209 lines
1 <?php
2 /**
3 * Handle the VideoPress metadata properties.
4 *
5 * @package Jetpack
6 */
7
8 use Automattic\Jetpack\Connection\Client;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit( 0 );
12 }
13
14 /**
15 * Class Videopress_Attachment_Metadata
16 */
17 class Videopress_Attachment_Metadata {
18
19 /**
20 * Persist the VideoPress metadata information, including rating and display_embed.
21 *
22 * @param string|int $post_id The post id.
23 * @param string $guid VideoPress Guid.
24 * @param string $post_title The post title.
25 * @param string $caption Video caption.
26 * @param string $post_excerpt The post excerpt.
27 * @param string $rating The rating.
28 * @param int $display_embed The display_embed.
29 * @param int $allow_download Allow video downloads.
30 * @param int $privacy_setting The video privacy setting.
31 *
32 * @return bool|\WP_Error
33 */
34 public static function persist_metadata( $post_id, $guid, $post_title, $caption, $post_excerpt, $rating, $display_embed, $allow_download, $privacy_setting ) {
35 $post_id = absint( $post_id );
36
37 $args = array(
38 'method' => 'POST',
39 'headers' => array( 'content-type' => 'application/json' ),
40 );
41
42 // Keep null values to avoid accidental unset.
43 $display_embed = null === $display_embed ? null : (int) $display_embed;
44 $allow_download = null === $allow_download ? null : (int) $allow_download;
45 $privacy_setting = null === $privacy_setting ? null : (int) $privacy_setting;
46
47 $values = self::build_wpcom_api_request_values( $post_title, $caption, $post_excerpt, $rating, $display_embed, $allow_download, $privacy_setting );
48 $endpoint = 'videos';
49 $values['guid'] = $guid;
50
51 $result = Client::wpcom_json_api_request_as_blog( $endpoint, '2', $args, wp_json_encode( $values, JSON_UNESCAPED_SLASHES ), 'wpcom' );
52
53 $validated_result = self::validate_result( $result );
54 if ( true !== $validated_result ) {
55 return $validated_result;
56 }
57
58 // If we are in WPCOM, then we don't need to make anything else since we've already updated the video information.
59 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
60 return true;
61 }
62
63 $meta = wp_get_attachment_metadata( $post_id );
64
65 if ( isset( $values['display_embed'] ) ) {
66 $meta['videopress']['display_embed'] = (bool) $values['display_embed']; // convert it to bool since that's how we store it on wp-admin side.
67 }
68
69 if ( isset( $values['allow_download'] ) ) {
70 $meta['videopress']['allow_download'] = (bool) $values['allow_download'];
71 }
72
73 if ( isset( $values['rating'] ) ) {
74 $meta['videopress']['rating'] = $values['rating'];
75 }
76
77 if ( isset( $values['privacy_setting'] ) ) {
78 $meta['videopress']['privacy_setting'] = $values['privacy_setting'];
79 }
80
81 wp_update_attachment_metadata( $post_id, $meta );
82
83 return true;
84 }
85
86 /**
87 * Check if the given media item is a VideoPress file.
88 *
89 * @param stdClass $item The media item.
90 *
91 * @return bool
92 */
93 public static function is_videopress_media( $item ) {
94 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
95 return str_starts_with( $item->mime_type, 'video/' );
96 }
97
98 // Else, we are in Jetpack and we need to check if the video is video/videopress.
99 return 'video/videopress' === $item->mime_type;
100 }
101
102 /**
103 * Check if display_embed has valid values.
104 *
105 * @param mixed $display_embed The input display embed.
106 *
107 * @return bool
108 */
109 private static function is_display_embed_valid( $display_embed ) {
110 return in_array( $display_embed, array( 0, 1 ), true );
111 }
112
113 /**
114 * Check if allow_download has valid values
115 *
116 * @param mixed $allow_download The value to test.
117 * @return bool
118 */
119 private static function is_allow_download_valid( $allow_download ) {
120 return in_array( $allow_download, array( 0, 1 ), true );
121 }
122
123 /**
124 * Check if privacy_setting has valid values
125 *
126 * @param mixed $privacy_setting The value to test.
127 * @return bool
128 */
129 private static function is_privacy_setting_valid( $privacy_setting ) {
130 return in_array( $privacy_setting, array( VIDEOPRESS_PRIVACY::IS_PUBLIC, VIDEOPRESS_PRIVACY::IS_PRIVATE, VIDEOPRESS_PRIVACY::SITE_DEFAULT ), true );
131 }
132
133 /**
134 * Validate the response received from WPCOM.
135 *
136 * @param array|\WP_Error $result The result returned by the client.
137 */
138 private static function validate_result( $result ) {
139 $response_code = $result['response']['code'] ?? 500;
140
141 // When Client::wpcom_json_api_request_as_blog is called in WPCOM, bad response codes are not converted to WP_Error.
142 // Because of this, we need to manually check the response code to check if the direct API call is 200 (OK).
143 if ( 200 === $response_code && ! is_wp_error( $result ) ) {
144 return true;
145 }
146
147 $error_message = __(
148 'There was an issue saving your updates to the VideoPress service. Please try again later.',
149 'jetpack'
150 );
151
152 $error_code = $response_code;
153
154 if ( is_wp_error( $result ) ) {
155 $error_code = $result->get_error_code();
156 }
157
158 return new \WP_Error( $error_code, $error_message );
159 }
160
161 /**
162 * Build the request values that will be passed to the WPCOM API.
163 *
164 * @param string $post_title The video title.
165 * @param string $caption The video caption.
166 * @param string $post_excerpt The except.
167 * @param string $rating The video rating.
168 * @param string $display_embed The video display_embed.
169 * @param int $allow_download The video allow_download.
170 * @param int $privacy_setting The video privacy setting.
171 *
172 * @return array
173 */
174 private static function build_wpcom_api_request_values( $post_title, $caption, $post_excerpt, $rating, $display_embed, $allow_download, $privacy_setting ) {
175 $values = array();
176
177 // Add the video title & description in, so that we save it properly.
178 if ( isset( $post_title ) ) {
179 $values['title'] = trim( wp_strip_all_tags( $post_title ) );
180 }
181
182 if ( isset( $caption ) ) {
183 $values['caption'] = trim( wp_strip_all_tags( $caption ) );
184 }
185
186 if ( isset( $post_excerpt ) ) {
187 $values['description'] = trim( wp_strip_all_tags( $post_excerpt ) );
188 }
189
190 if ( isset( $rating ) ) {
191 $values['rating'] = $rating;
192 }
193
194 if ( self::is_display_embed_valid( $display_embed ) ) {
195 $values['display_embed'] = $display_embed;
196 }
197
198 if ( self::is_allow_download_valid( $allow_download ) ) {
199 $values['allow_download'] = $allow_download;
200 }
201
202 if ( self::is_privacy_setting_valid( $privacy_setting ) ) {
203 $values['privacy_setting'] = $privacy_setting;
204 }
205
206 return $values;
207 }
208 }
209