PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.3
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 / jetpack_vendor / automattic / jetpack-videopress / src / class-uploader.php
jetpack / jetpack_vendor / automattic / jetpack-videopress / src Last commit date
js 2 months ago tus 1 month ago videopress-divi 2 months ago videopress-divi-5 2 months ago class-access-control.php 3 months ago class-admin-ui.php 3 weeks ago class-ajax.php 1 month ago class-attachment-handler.php 1 month ago class-block-editor-content.php 1 month ago class-block-editor-extensions.php 1 month ago class-block-replacement.php 9 months ago class-caption-tracks.php 1 month ago class-data.php 1 month ago class-divi.php 2 months ago class-initial-state.php 1 month ago class-initializer.php 1 month ago class-jwt-token-bridge.php 2 years ago class-module-control.php 3 years ago class-options.php 2 years ago class-package-version.php 3 weeks ago class-plan.php 2 years ago class-rest-controller.php 1 month ago class-site.php 3 years ago class-stats.php 1 year ago class-status.php 9 months ago class-upload-exception.php 3 years ago class-uploader-rest-endpoints.php 9 months ago class-uploader.php 1 month ago class-utils.php 4 months ago class-video-block-email-renderer.php 2 months ago class-videopress-rest-api-v1-features.php 6 months ago class-videopress-rest-api-v1-settings.php 1 month ago class-videopress-rest-api-v1-site.php 2 years ago class-videopress-rest-api-v1-stats.php 3 years ago class-videopresstoken.php 1 month ago class-wpcom-rest-api-v2-attachment-field-videopress.php 9 months ago class-wpcom-rest-api-v2-attachment-videopress-data.php 1 month ago class-wpcom-rest-api-v2-endpoint-videopress-caption-tracks.php 1 month ago class-wpcom-rest-api-v2-endpoint-videopress.php 1 month ago class-xmlrpc.php 1 month ago utility-functions.php 1 month ago
class-uploader.php
310 lines
1 <?php
2 /**
3 * VideoPress Uploader
4 *
5 * @package automattic/jetpack-videopress
6 */
7
8 namespace Automattic\Jetpack\VideoPress;
9
10 use Jetpack_Options;
11 use VideoPressUploader\File_Exception;
12 use VideoPressUploader\Tus_Client;
13
14 /**
15 * VideoPress Uploader class
16 *
17 * Handles the upload from the Media Library to VideoPress servers
18 */
19 class Uploader {
20
21 /**
22 * The key of the post meta that holds the ID of the attachment that holds the VideoPress video, in case this attachment was uploaded before.
23 *
24 * @var string
25 */
26 const UPLOADED_KEY = '_videopress_uploaded_id';
27
28 /**
29 * The chunk size of each upload step
30 *
31 * @var int
32 */
33 const CHUNK_SIZE = 5000000;
34
35 /**
36 * The Tus Client instance
37 *
38 * @var Tus_Client
39 */
40 protected $client = null;
41
42 /**
43 * The attachment ID
44 *
45 * @var int
46 */
47 protected $attachment_id;
48
49 /**
50 * Checks whether this feature is supported by the server
51 *
52 * @param int $attachment_id The ID of the video attachment we want to upload to VideoPress.
53 * @return boolean
54 */
55 public static function is_valid_attachment_id( $attachment_id ) {
56 $file_path = get_attached_file( $attachment_id );
57 if ( ! $file_path || ! is_readable( $file_path ) ) {
58 return false;
59 }
60 if ( ! str_starts_with( get_post_mime_type( $attachment_id ), 'video/' ) ) {
61 return false;
62 }
63 return true;
64 }
65
66 /**
67 * Constructs the object
68 *
69 * @throws Upload_Exception If attachment is invalid or server does not support it.
70 * @param int $attachment_id The ID of the video attachment we want to upload to VideoPress.
71 */
72 public function __construct( $attachment_id ) {
73 $this->attachment_id = $attachment_id;
74 if ( ! $this->get_file_path() ) {
75 throw new Upload_Exception( __( 'Invalid attachment ID', 'jetpack-videopress-pkg' ), Upload_Exception::ERROR_INVALID_ATTACHMENT_ID );
76 }
77 if ( ! is_readable( $this->get_file_path() ) ) {
78 throw new Upload_Exception( __( 'File not found', 'jetpack-videopress-pkg' ), Upload_Exception::ERROR_FILE_NOT_FOUND );
79 }
80 if ( ! $this->file_has_supported_mime_type() ) {
81 throw new Upload_Exception( __( 'Mime type not supported', 'jetpack-videopress-pkg' ), Upload_Exception::ERROR_MIME_TYPE_NOT_SUPPORTED );
82 }
83 }
84
85 /**
86 * Gets the path of the video file
87 *
88 * @return string
89 */
90 public function get_file_path() {
91 return get_attached_file( $this->attachment_id );
92 }
93
94 /**
95 * Gets the mime type of the attachment
96 *
97 * @return string
98 */
99 public function get_file_mime_type() {
100 return get_post_mime_type( $this->attachment_id );
101 }
102
103 /**
104 * Gets the name of the video file
105 *
106 * @return string
107 */
108 public function get_file_name() {
109 return basename( $this->get_file_path() );
110 }
111
112 /**
113 * Gets the size of the video file
114 *
115 * @return int
116 */
117 public function get_file_size() {
118 return filesize( $this->get_file_path() );
119 }
120
121 /**
122 * Checks if the mime type of the attachment is supported to be uploaded
123 *
124 * @return boolean
125 */
126 public function file_has_supported_mime_type() {
127 return str_starts_with( $this->get_file_mime_type(), 'video/' );
128 }
129
130 /**
131 * Gets the VideoPress upload token
132 *
133 * @throws Upload_Exception If it fails to fetch the token.
134 *
135 * @return string
136 */
137 public function get_upload_token() {
138 return VideoPressToken::videopress_upload_jwt();
139 }
140
141 /**
142 * Gets a unique upload key for this attachment
143 *
144 * @return string
145 */
146 public function get_key() {
147 return sprintf( 's-%d-v-%d', Jetpack_Options::get_option( 'id' ), $this->attachment_id );
148 }
149
150 /**
151 * Sets the current attachment as uploaded and stores the ID of the VideoPress video attachment ID
152 *
153 * @param int $new_attachment_id The ID of the new attachment created to hold the VideoPress video.
154 * @return void
155 */
156 protected function mark_as_uploaded( $new_attachment_id ) {
157 update_post_meta( $this->attachment_id, self::UPLOADED_KEY, $new_attachment_id );
158 }
159
160 /**
161 * Sets the current attachment as not being uploaded before. Deletes the reference to the videopress attachment
162 *
163 * @return void
164 */
165 protected function unmark_as_uploaded() {
166 delete_post_meta( $this->attachment_id, self::UPLOADED_KEY );
167 }
168
169 /**
170 * Checks whether this attachment was uploaded before
171 *
172 * @return boolean
173 */
174 public function is_uploaded() {
175 return ! empty( $this->get_uploaded_attachment_id() );
176 }
177
178 /**
179 * Gets the ID of the VideoPress video attachment in case this attachment was uploaded before
180 *
181 * @return boolean|string False if value is absent. Post ID on success.
182 */
183 public function get_uploaded_attachment_id() {
184 return get_post_meta( $this->attachment_id, self::UPLOADED_KEY, true );
185 }
186
187 /**
188 * Retrieves the instance of the Tus_Client
189 *
190 * @return Tus_Client
191 */
192 public function get_client() {
193 if ( $this->client !== null ) {
194 return $this->client;
195 }
196
197 $this->client = new Tus_Client( $this->get_key(), $this->get_upload_token(), Jetpack_Options::get_option( 'id' ) );
198
199 return $this->client;
200 }
201
202 /**
203 * Uploads a chunk of the file
204 *
205 * @return array With the status of the upload
206 */
207 public function upload() {
208 if ( $this->is_uploaded() ) {
209 return $this->check_status();
210 }
211 try {
212 $attachment = get_post( $this->attachment_id );
213 $client = $this->get_client();
214 $client->file( $this->get_file_path(), $this->get_file_name() );
215 $client->add_metadata( 'title', $attachment->post_title );
216 if ( '' !== $attachment->post_content ) {
217 $client->add_metadata( 'description', $attachment->post_content );
218 }
219 if ( '' !== $attachment->post_excerpt ) {
220 $client->add_metadata( 'caption', $attachment->post_excerpt );
221 }
222
223 $bytes_uploaded = $client->upload( self::CHUNK_SIZE );
224
225 if ( $bytes_uploaded === $this->get_file_size() ) {
226 $this->mark_as_uploaded( $this->get_client()->get_uploaded_video_details()['media_id'] );
227 return array(
228 'status' => 'complete',
229 'bytes_uploaded' => $bytes_uploaded,
230 'file_size' => $this->get_file_size(),
231 'file_name' => $this->get_file_name(),
232 'upload_key' => $this->get_key(),
233 'uploaded_details' => $this->get_client()->get_uploaded_video_details(),
234 );
235 }
236
237 return array(
238 'status' => 'uploading',
239 'bytes_uploaded' => $bytes_uploaded,
240 'file_size' => $this->get_file_size(),
241 'file_name' => $this->get_file_name(),
242 'upload_key' => $this->get_key(),
243 );
244 } catch ( \Exception $e ) {
245 return array(
246 'status' => 'error',
247 'bytes_uploaded' => -1,
248 'file_size' => $this->get_file_size(),
249 'file_name' => $this->get_file_name(),
250 'upload_key' => $this->get_key(),
251 'error' => $e->getCode() . ': ' . $e->getMessage(),
252 );
253 }
254 }
255
256 /**
257 * Checks the status of the upload of this attachment
258 *
259 * @return array
260 */
261 public function check_status() {
262
263 if ( $this->is_uploaded() ) {
264 $uploaded_attachment_id = $this->get_uploaded_attachment_id();
265 $uploaded_video_guid = get_post_meta( $uploaded_attachment_id, 'videopress_guid', true );
266 if ( $uploaded_video_guid ) {
267 return array(
268 'status' => 'uploaded',
269 'upload_key' => $this->get_key(),
270 'uploaded_post_id' => $uploaded_attachment_id,
271 'uploaded_video_guid' => $uploaded_video_guid,
272 );
273 } else {
274 // VideoPress attachment is gone, allow user to upload it again.
275 $this->unmark_as_uploaded();
276 }
277 }
278
279 try {
280 $offset = $this->get_client()->get_offset();
281 $status = false !== $offset ? 'resume' : 'new';
282 $offset = false === $offset ? 0 : $offset;
283
284 return array(
285 'status' => $status,
286 'bytes_uploaded' => $offset,
287 'file_size' => $this->get_file_size(),
288 'file_name' => $this->get_file_name(),
289 'upload_key' => $this->get_key(),
290 );
291 } catch ( File_Exception $e ) {
292 return array(
293 'status' => 'resume',
294 'bytes_uploaded' => 0,
295 'file_size' => $this->get_file_size(),
296 'file_name' => $this->get_file_name(),
297 'upload_key' => $this->get_key(),
298 );
299 } catch ( \Exception $e ) {
300 return array(
301 'status' => 'error',
302 'bytes_uploaded' => -1,
303 'file_size' => $this->get_file_size(),
304 'file_name' => $this->get_file_name(),
305 'message' => $e->getMessage(),
306 );
307 }
308 }
309 }
310