PluginProbe
StockPack – Stock photos and AI images from Unsplash, Adobe Stock, Freepik and more / 3.6.0
StockPack – Stock photos and AI images from Unsplash, Adobe Stock, Freepik and more v3.6.0
3.7.2 3.7.1 3.7.0 3.6.0 3.6.1 3.5.2 trunk 2.0 2.1 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.6.0 2.6.1 All 73 releases
stockpack / src / class-stockpackquery.php

class-stockpackquery.php in StockPack – Stock photos and AI images from Unsplash, Adobe Stock, Freepik and more 3.6.0, at src/class-stockpackquery.php

1,003 lines 48.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit;
6 }
7 if ( ! class_exists( 'StockpackQuery' ) ) {
8 class StockpackQuery {
9 /**
10 * @var Singleton The reference the *Singleton* instance of this class
11 */
12 private static $instance;
13
14 /**
15 * Api url
16 */
17 private $url = 'https://api.stockpack.co/api';
18 /**
19 * Api version
20 */
21 const VERSION = 'v1';
22
23 public $admin;
24
25 public $settings;
26
27 public static function get_instance() {
28 if ( null === self::$instance ) {
29 self::$instance = new self();
30 }
31
32 return self::$instance;
33 }
34
35 /**
36 * StockPack constructor.
37 */
38 protected function __construct() {
39 if ( ! defined( 'STOCKPACK_URL' ) ) {
40 $this->url = 'https://api.stockpack.co/api';
41 } else {
42 $this->url = STOCKPACK_URL;
43 }
44
45 add_action( 'init', array( $this, 'init' ) );
46 }
47
48 /**
49 *
50 */
51 public function init() {
52 $this->admin = \StockpackAdmin::get_instance();
53 $this->settings = \StockpackSettings::get_instance();
54 $this->actions();
55 $this->filters();
56 }
57
58 /**
59 *
60 */
61 public function filters() {
62
63 }
64
65 /**
66 *
67 */
68 public function actions() {
69 add_action( 'wp_ajax_query-stockpack', array( $this, 'query' ) ); // executed when logged in
70 add_action( 'wp_ajax_license_cost-stockpack', array(
71 $this,
72 'license_cost'
73 ) ); // executed when logged in
74 add_action( 'wp_ajax_download-stockpack', array( $this, 'download' ) ); // executed when logged in
75 add_action( 'wp_ajax_generate-stockpack', array( $this, 'generate' ) ); // executed when logged in
76 add_action( 'wp_ajax_generate_status-stockpack', array(
77 $this,
78 'generate_status'
79 ) ); // executed when logged in
80 add_action( 'wp_ajax_cache-stockpack', array( $this, 'cache' ) ); // executed when logged in
81 add_action( 'wp_ajax_validate-stockpack', array( $this, 'validate' ) ); // executed when logged in
82 add_action( 'wp_ajax_terms-stockpack', array( $this, 'terms' ) ); // executed when logged in
83 add_action( 'wp_ajax_token-stockpack', array( $this, 'token' ) ); // executed when logged in
84
85 if($this->settings->get_url_debugging_setting() ==='yes') {
86 add_action('http_api_debug', array($this, 'debug_wp_remote_post_and_get_request'), 10, 5);
87 }
88 }
89
90 public function terms() {
91 check_ajax_referer( 'stockpack_terms', 'security' );
92
93 $provider = '';
94 if ( isset( $_REQUEST['provider'] ) ) {
95 $provider = sanitize_key( $_REQUEST['provider'] );
96 }
97
98 wp_send_json_success( update_option( 'terms_accepted_' . $provider, true ) );
99 }
100
101 public function license_cost() {
102 check_ajax_referer( 'stockpack_license_cost', 'security' );
103 $media_id = '';
104 if ( isset( $_REQUEST['media_id'] ) ) {
105 $media_id = sanitize_text_field( $_REQUEST['media_id'] );
106 }
107
108 $provider = 0;
109 if ( isset( $_REQUEST['provider'] ) ) {
110 $provider = sanitize_text_field( $_REQUEST['provider'] );
111 }
112
113 $response = $this->get_license_cost( $media_id, $provider );
114
115 if ( isset( $response->data->error ) ) {
116 wp_send_json_error( $this->handle_license_errors( $response->data ) );
117 die();
118 }
119
120 if ( is_wp_error( $response ) ) {
121 wp_send_json_error( $this->handle_license_errors( $response ) );
122 die();
123 }
124
125 if ( $response->data->cost == - 1 ) {
126 $response->data->cost_message = __( 'You already own the asset, you can proceed without additional cost', 'stockpack' );
127 }
128
129 if ( $response->data->cost == 1 && ! $response->data->cost_message ) {
130 $response->data->cost_message = __( 'You will be charged for one image on you provider account', 'stockpack' );
131 }
132
133 if ( $this->already_in_library( $media_id ) ) {
134 $response->data->cost_message = __( 'This image is already in your library. Adding it again reuses the file you downloaded before, so it will not use another download.', 'stockpack' );
135 }
136
137 wp_send_json_success( $response->data, true );
138 }
139
140 private function already_in_library( $media_id ) {
141 if ( ! $media_id ) {
142 return false;
143 }
144
145 $query = new WP_Query( array(
146 'post_type' => 'attachment',
147 'post_status' => 'inherit',
148 'fields' => 'ids',
149 'posts_per_page' => 1,
150 'meta_query' => array(
151 array(
152 'key' => 'stockpack_id',
153 'value' => $media_id
154 )
155 )
156 ) );
157
158 return $query->have_posts();
159 }
160
161 public function token() {
162 $stockpack = StockPack::get_instance();
163 check_ajax_referer( 'stockpack_token', 'security' );
164 $token = '';
165 if ( isset( $_REQUEST['token'] ) ) {
166 $token = sanitize_text_field( $_REQUEST['token'] );
167 }
168 wp_send_json_success( $stockpack->admin->set_api_key( $token ), true );
169 }
170
171 /**
172 *
173 */
174 public function validate() {
175 check_ajax_referer( 'stockpack_validate', 'security' );
176 $key = '';
177 if ( isset( $_REQUEST['key'] ) ) {
178 $key = sanitize_key( $_REQUEST['key'] );
179 }
180 wp_send_json_success( $this->call( 'GET', 'validate/token', array( 'key' => $key ) ) );
181 }
182
183 /**
184 *
185 */
186 public function query() {
187 check_ajax_referer( 'stockpack_query', 'security' );
188 if ( ! current_user_can( 'upload_files' ) ) {
189 wp_send_json_error();
190 }
191 $query = array();
192 if ( isset( $_REQUEST['query'] ) ) {
193 $query = array_map( 'sanitize_text_field', wp_unslash( $_REQUEST['query'] ) );
194 }
195
196 if ( ! isset( $query['query'] ) ) {
197 return wp_send_json_success( array() );
198 }
199
200 $images = $this->images( $query );
201 if ( is_wp_error( $images ) ) {
202 /** @var WP_Error $images */
203 wp_send_json_error( $images );
204 die();
205 }
206
207 if ( isset( $images->data->error ) ) {
208 wp_send_json_error( $this->handle_search_errors( $images->data ) );
209 die();
210 }
211
212 wp_send_json_success( $this->format( $images->data ) );
213 }
214
215 public function generate() {
216 check_ajax_referer( 'stockpack_generate', 'security' );
217 if ( ! current_user_can( 'upload_files' ) ) {
218 wp_send_json_error( array( 'message' => __( 'You are not allowed to upload files', 'stockpack' ) ) );
219 }
220
221 /** @var StockPack $stockpack */
222 $stockpack = StockPack::get_instance();
223 if ( ! $stockpack->settings->get_api_key() ) {
224 wp_send_json_error( array(
225 'message' => __( 'Add your StockPack API key in the plugin settings before generating images.',
226 'stockpack' )
227 ) );
228 }
229
230 $args = array(
231 'action' => $this->request_value( 'generate_action', 'generate' ),
232 );
233
234 if ( 'upscale' === $args['action'] ) {
235 $args['image_url'] = esc_url_raw( $this->request_value( 'image_url' ) );
236 $args['scale_factor'] = (int) $this->request_value( 'scale_factor', 2 );
237
238 if ( ! $args['image_url'] ) {
239 wp_send_json_error( array( 'message' => __( 'Pick an image to upscale.', 'stockpack' ) ) );
240 }
241 } else {
242 $args['prompt'] = $this->request_value( 'prompt' );
243 $args['model'] = $this->request_value( 'model', 'mystic-25' );
244 $args['resolution'] = $this->request_value( 'resolution', '2k' );
245
246 $refine = esc_url_raw( $this->request_value( 'refine_url' ) );
247
248 if ( $refine ) {
249 $args['refine_url'] = $refine;
250 }
251
252 if ( ! $args['prompt'] ) {
253 wp_send_json_error( array( 'message' => __( 'Describe the image you want first.', 'stockpack' ) ) );
254 }
255 }
256
257 $response = $this->call( 'POST', 'generate', $args );
258
259 if ( is_wp_error( $response ) ) {
260 wp_send_json_error( $this->error_payload( $response ) );
261 }
262
263 if ( isset( $response->error ) ) {
264 wp_send_json_error( $this->handle_search_errors( $response ) );
265 }
266
267 wp_send_json_success( $response->data );
268 }
269
270 public function generate_status() {
271 check_ajax_referer( 'stockpack_generate', 'security' );
272 if ( ! current_user_can( 'upload_files' ) ) {
273 wp_send_json_error( array( 'message' => __( 'You are not allowed to upload files', 'stockpack' ) ) );
274 }
275
276 $task = $this->request_value( 'task' );
277 if ( ! $task ) {
278 wp_send_json_error( array( 'message' => __( 'Unknown generation task.', 'stockpack' ) ) );
279 }
280
281 $response = $this->call( 'GET', 'generate/' . rawurlencode( $task ) );
282
283 if ( is_wp_error( $response ) ) {
284 wp_send_json_error( $this->error_payload( $response ) );
285 }
286
287 if ( isset( $response->error ) ) {
288 wp_send_json_error( $this->handle_search_errors( $response ) );
289 }
290
291 wp_send_json_success( $response->data );
292 }
293
294 private function request_value( $key, $default = '' ) {
295 if ( ! isset( $_REQUEST[ $key ] ) ) {
296 return $default;
297 }
298
299 return sanitize_text_field( wp_unslash( $_REQUEST[ $key ] ) );
300 }
301
302 /**
303 *
304 */
305 public function cache() {
306 check_ajax_referer( 'stockpack_cache', 'security' );
307
308 if ( ! current_user_can( 'upload_files' ) ) {
309 wp_send_json_error();
310 }
311 $id = 0;
312
313 if ( isset( $_REQUEST['media_id'] ) ) {
314 $id = sanitize_text_field( $_REQUEST['media_id'] );
315 }
316 $args = array(
317 'post_type' => 'attachment',
318 'post_status' => 'inherit',
319 'meta_query' => array(
320 array(
321 'key' => 'stockpack_id',
322 'value' => $id
323 )
324 )
325 );
326 $query = new WP_Query( $args );
327 if ( ! $query->have_posts() ) {
328 wp_send_json_error( array( 'message' => __( 'Image not found in cache', 'stockpack' ) ) );
329 }
330
331 wp_send_json_success( wp_prepare_attachment_for_js( $query->post->ID ) );
332
333 }
334
335 /**
336 *
337 */
338 public function download() {
339 check_ajax_referer( 'stockpack_download', 'security' );
340 if ( ! current_user_can( 'upload_files' ) ) {
341 wp_send_json_error( array( 'message' => __( 'You are not allowed to upload files', 'stockpack' ) ) );
342 }
343
344 $id = 0;
345 if ( isset( $_REQUEST['media_id'] ) ) {
346 $id = sanitize_text_field( $_REQUEST['media_id'] );
347 }
348 $post_id = 0;
349 if ( isset( $_REQUEST['post_id'] ) ) {
350 $post_id = sanitize_text_field( $_REQUEST['post_id'] );
351 }
352 $provider = 0;
353 if ( isset( $_REQUEST['provider'] ) ) {
354 $provider = sanitize_text_field( $_REQUEST['provider'] );
355 }
356 $must_license = false;
357 if ( isset( $_REQUEST['must_license'] ) ) {
358 $must_license = sanitize_text_field( $_REQUEST['must_license'] );
359 }
360 $new_filename = "";
361 if ( isset( $_REQUEST['new_filename'] ) ) {
362 $new_filename = sanitize_text_field( $_REQUEST['new_filename'] );
363 }
364 $search = isset( $_REQUEST['search_key'] ) ? sanitize_title( $_REQUEST['search_key'] ) : $this->get_domain();
365 $description = isset( $_REQUEST['description'] ) ? sanitize_textarea_field( $_REQUEST['description'] ) : '';
366
367
368
369 $image = $this->image( $id, $post_id, $description, $search, $must_license, $provider, $new_filename );
370
371 if ( is_wp_error( $image ) ) {
372 if ( strpos( $image->get_error_code(), 'limit_reached' ) !== false ) {
373 wp_send_json_error( $image );
374 die();
375 }
376 wp_send_json_error( array( 'message' => $image->get_error_message() ) );
377 }
378
379 wp_send_json_success( wp_prepare_attachment_for_js( $image ) );
380
381 }
382
383
384
385 public function is_provider_premium( $provider ) {
386 return in_array( $provider, array(
387 'adobe_stock',
388 'getty',
389 'istock',
390 'deposit_photos'
391 )
392 );
393 }
394
395 public function images( $query = [] ) {
396
397 return $this->call( 'GET', 'images/search', $query );
398 }
399
400
401 /**
402 * @param $data
403 *
404 * @return array
405 */
406 private function format( $data ) {
407 return $data;
408 }
409
410
411 public function get_license_cost( $media_id, $provider ) {
412
413 return $this->call( 'GET', 'images/license-cost', array(
414 'id' => $media_id,
415 'locale' => get_locale(),
416 'provider' => $provider
417 ) );
418
419 }
420
421 public function get_ai_prices() {
422 $cached = get_transient( 'stockpack_ai_prices' );
423
424 if ( is_array( $cached ) ) {
425 return $cached;
426 }
427
428 $response = $this->call( 'GET', 'generate/prices' );
429 $prices = array();
430
431 if ( isset( $response->data ) ) {
432 $prices = json_decode( wp_json_encode( $response->data ), true );
433 }
434
435 set_transient( 'stockpack_ai_prices', $prices, $prices ? DAY_IN_SECONDS : 5 * MINUTE_IN_SECONDS );
436
437 return $prices;
438 }
439
440 public function image( $media_id, $post_id, $description = '', $search = '', $must_license = 0, $provider = 0, $new_filename = '' ) {
441
442 do_action( 'stockpack_before_attachment_download', $provider,$new_filename, $media_id, $must_license );
443
444 $big_image_threshold = (int) apply_filters( 'big_image_size_threshold', 2560, array( 0, 0 ), '', 0 );
445
446 $image = $this->call( 'GET', 'images/download',
447 array(
448 'id' => $media_id,
449 'must_license' => $must_license,
450 'provider' => $provider,
451 'min_width'=> $big_image_threshold,
452 'min_height'=> $big_image_threshold,
453 )
454 );
455
456 if ( ! isset( $image->data->download ) ) {
457 if ( is_wp_error( $image ) ) {
458 return $image;
459 }
460
461 return $this->handle_download_errors( $image->data );
462 }
463
464 $filename = $this->getFilename($image, $new_filename, $must_license);
465
466 $caption = $image->data->caption ?: '';
467 $attachment_id = $this->upload_remote_image_and_attach( $image->data->download, $post_id, $description, $filename,$image, $search, $caption );
468 if ( is_wp_error( $attachment_id ) ) {
469 return $attachment_id;
470 }
471 if ( ! $attachment_id ) {
472 return new WP_Error( __( 'upload_failure', 'There has been a problem with the upload. Please try again', 'stockpack' ) );
473 }
474
475 update_post_meta( $attachment_id, 'stockpack_id', $media_id );
476
477 return $attachment_id;
478 }
479
480 private function handle_license_errors( $response ) {
481 if ( isset( $response->code ) ) {
482 switch ( $response->code ) {
483 case 'token_expired':
484 return new WP_Error( 'license_cost_failure', __( 'Please reconnect the account on StockPack, the permissions have expired. Go the providers page on stockpack.co/providers', 'stockpack' ) );
485 }
486
487 if ( ! empty( $response->message ) ) {
488 return new WP_Error( $response->code, $response->message );
489 }
490 }
491
492 return new WP_Error( 'license_cost_failure', __( 'There has been a problem fetching the cost. Please try to reconnect the account on the providers page on stockpack.co/providers', 'stockpack' ) );
493 }
494
495 private function handle_download_errors( $response ) {
496 if ( isset( $response->code ) ) {
497 switch ( $response->code ) {
498 case 'token_expired':
499 return new WP_Error( 'token_expired', __( 'Please reconnect the account on StockPack, the permissions have expired. Go the providers page on stockpack.co/providers', 'stockpack' ) );
500 }
501
502 if ( ! empty( $response->message ) ) {
503 return new WP_Error( $response->code, $response->message );
504 }
505 }
506
507 return new WP_Error( 'download_failure', __( 'There has been a problem with the download. Try to reconnect the account for the provider on StockPack. If the issue persists, contact stockpack support.', 'stockpack' ) );
508 }
509
510 private function handle_search_errors( $response ) {
511 if ( isset( $response->code ) ) {
512 switch ( $response->code ) {
513 case 'token_expired':
514 return new WP_Error( 'token_expired', __( 'Please reconnect the account on stockpack, the permissions have expired. Go to the providers page on stockpack.co/providers', 'stockpack' ) );
515 }
516 }
517
518 return new WP_Error( 'search_failure', __( 'There has been a problem with the api, please check the accounts on the providers page in stockpack.co/providers', 'stockpack' ) );
519
520 }
521
522
523 /**
524 * @param $method
525 * @param $path
526 * @param array $query
527 *
528 * @return mixed|null
529 */
530 private function call( $method, $path, $query = [] ) {
531 /** @var StockPack $stockpack */
532 $stockpack = StockPack::get_instance();
533
534
535 if ( ! isset( $query['key'] ) ) {
536 $api_key = $stockpack->settings->get_api_key();
537 if ( $api_key ) {
538 $query = array_merge( $query,
539 [
540 'api_token' => $api_key
541 ]
542 );
543 } else {
544 $path .= '-trial';
545 }
546 }
547
548 $query = array_merge( $query,
549 [
550 'referral' => get_bloginfo( 'url' ),
551 'safe_search' => $stockpack->settings->get_safe_search(),
552 'user_data' => $stockpack->settings->get_license_state(),
553 ]
554 );
555
556 $url = $this->url . '/' . self::VERSION . '/' . $path;
557 $is_post = 'post' === strtolower( $method );
558
559 if ( ! $is_post ) {
560 $url .= '?' . http_build_query( $query );
561 }
562
563 do_action( 'stockpack_before_api_request', $url, $query );
564
565 $headers = array( 'Accept' => 'application/json' );
566
567 if ( $is_post ) {
568 $response = wp_remote_post( $url, array(
569 'timeout' => 20,
570 'sslverify' => false,
571 'headers' => $headers,
572 'body' => $query,
573 ) );
574 } else {
575 $response = wp_remote_get( $url, array(
576 'timeout' => apply_filters( 'stockpack_api_timeout', $this->timeout_for( $path ), $path ),
577 'sslverify' => false,
578 'headers' => $headers,
579 ) );
580 }
581
582 do_action( 'stockpack_after_api_request', $url, $query, $response );
583
584 if ( is_wp_error( $response ) ) {
585 return $response;
586 }
587
588 $response_code = wp_remote_retrieve_response_code( $response );
589 if ( $response_code !== 200 ) {
590 switch ( $response_code ) {
591 case 429: // too many requests
592 return $this->limit_exceeded( $response );
593 case 401: // access denied
594 return $this->invalid_token( $response );
595 default:
596 return $this->server_error( $response, $response_code );
597 }
598 }
599
600 $response_body = wp_remote_retrieve_body( $response );
601
602 return json_decode( $response_body );
603 }
604
605 private function timeout_for( $path ) {
606 return strpos( $path, 'images/download' ) === 0 ? 30 : 10;
607 }
608
609 private function error_payload( $error ) {
610 return array(
611 'code' => $error->get_error_code(),
612 'message' => $error->get_error_message(),
613 );
614 }
615
616 private function server_error( $response, $response_code ) {
617 $body = json_decode( wp_remote_retrieve_body( $response ) );
618
619 if ( ! empty( $body->message ) ) {
620 return new WP_Error( ! empty( $body->code ) ? $body->code : 1, $body->message );
621 }
622
623 return new WP_Error( 1, sprintf(
624 /* translators: %d: HTTP status code returned by the StockPack API */
625 __( 'The StockPack server returned an error (HTTP %d). If this keeps happening, contact StockPack support.', 'stockpack' ),
626 $response_code
627 ) );
628 }
629
630 private function limit_exceeded( $response ) {
631 /** @var StockPack $stockpack */
632 $stockpack = StockPack::get_instance();
633
634
635 $limit = wp_remote_retrieve_header( $response, 'x-ratelimit-limit' );
636 $retry_after = wp_remote_retrieve_header( $response, 'retry-after' );
637 $retry_after = $this->human_seconds( $retry_after );
638 $retry_after = '<span class ="stockpack-timer">' . $retry_after . '</span>';
639 if ( $limit > 50 ) {
640 return new WP_Error( 'premium_limit_reached', __( 'Request limit reached, the reset will be in ', 'stockpack' ) . $retry_after );
641 }
642 $api_key = $stockpack->admin->get_api_key();
643 if ( $api_key ) {
644 return new WP_Error( 'free_limit_reached', __( 'Request limit reached, the reset will be in ', 'stockpack' ) . $retry_after );
645 }
646
647
648 return new WP_Error( 'anonymous_limit_reached', __( 'Request limit reached, the reset will be in ', 'stockpack' ) . $retry_after );
649 }
650
651 private function invalid_token( $response ) {
652 return new WP_Error( 'invalid_token', __( 'Request denied. Please check your token!', 'stockpack' ) );
653 }
654
655 private function support_caption_translation( $caption ) {
656 if ( ! $caption ) {
657 return '';
658 }
659
660 $caption = str_replace( 'Photo by', __( 'Photo by', 'stockpack' ), $caption );
661 $caption = str_replace( ' on ', _x( ' on ', 'Make sure to keep the space', 'stockpack' ), $caption );
662
663 return $caption;
664 }
665
666 /**
667 * @param $image_url
668 * @param $parent_id
669 *
670 * @param $description
671 *
672 * @param $name
673 * @param string $search
674 *
675 * @param string $caption
676 *
677 * @return bool|int|WP_Error
678 */
679 private function upload_remote_image_and_attach( $image_url, $parent_id, $description, $name, $image, $search = '', $caption = '' ) {
680
681 $get = wp_remote_get( $image_url, array(
682 'timeout' => apply_filters( 'stockpack_download_timeout', 30 )
683 )
684 );
685 if ( is_wp_error( $get ) ) {
686 return new WP_Error( 100, __( 'Image download failed, please try again. Errors:', 'stockpack' ) . PHP_EOL . $get->get_error_message() );
687 }
688 $type = wp_remote_retrieve_header( $get, 'content-type' );
689 if ( ! $type ) {
690 $type = wp_check_filetype( $name )['type'];
691 }
692 if ( ! $type ) {
693 return new WP_Error( 100, __( 'Image type couldn\'t be determined', 'stockpack' ) );
694 }
695 $name = $this->update_extension( $name, $type );
696
697 $name = apply_filters( 'stockpack_attachment_filename', $name, $image );
698
699 $mirror = wp_upload_bits( $name, '', wp_remote_retrieve_body( $get ) );
700 $attachment = array(
701 'post_title' => $this->strip_extension($name),
702 'post_content' => $description,
703 'post_excerpt' => apply_filters( 'stockpack_caption', $this->support_caption_translation( $caption ), $image ),
704 'post_mime_type' => $type
705 );
706 $attach_id = wp_insert_attachment( $attachment, $mirror['file'], $parent_id );
707 require_once( ABSPATH . 'wp-admin/includes/image.php' );
708
709 // An upscale that WordPress immediately scales back down is an
710 // upscale the user paid for and did not get, so the threshold is
711 // lifted for the result of one. Priority 999 so it wins over a theme
712 // or plugin that lowers it.
713 $is_upscale = isset( $image->data->meta->action ) && 'upscale' === $image->data->meta->action;
714
715 if ( $is_upscale ) {
716 add_filter( 'big_image_size_threshold', '__return_false', 999 );
717 }
718
719 $attach_data = wp_generate_attachment_metadata( $attach_id, $mirror['file'] );
720 wp_update_attachment_metadata( $attach_id, $attach_data );
721
722 if ( $is_upscale ) {
723 remove_filter( 'big_image_size_threshold', '__return_false', 999 );
724 }
725 update_post_meta( $attach_id, '_wp_attachment_image_alt', $description );
726 $this->store_attachment_meta($attach_id,$image);
727
728 do_action( 'stockpack_after_attachment_uploaded', $attach_id, $image );
729
730 return $attach_id;
731
732 }
733
734 private function store_attachment_meta($attach_id, $image){
735 $data = $image->data;
736 $meta = isset($data->meta) ? $data->meta : new stdClass();
737 update_post_meta($attach_id,'stockpack_media_id',$data->id);
738 update_post_meta($attach_id,'stockpack_provider',isset($meta->provider) ? $meta->provider : '');
739 update_post_meta($attach_id,'stockpack_author_url',isset($meta->author_url) ? $meta->author_url : '');
740 update_post_meta($attach_id,'stockpack_author_name',isset($meta->author_name) ? $meta->author_name : '');
741 update_post_meta($attach_id,'stockpack_image_url',isset($meta->image_url) ? $meta->image_url : '');
742 update_post_meta($attach_id,'stockpack_download_timestamp',time());
743 }
744
745 /**
746 * @return mixed
747 */
748 private function get_domain() {
749 $url = get_bloginfo( 'url' );
750 $parse = wp_parse_url( $url );
751
752 return strtok( $parse['host'], '.' );
753 }
754
755
756 private function human_seconds( $seconds, $separator = ":" ) {
757 return sprintf( "%02d%s%02d%s%02d", floor( $seconds / 3600 ), $separator, ( $seconds / 60 ) % 60, $separator, $seconds % 60 );
758 }
759
760 private function update_extension( $name, $mime ) {
761 $name = explode( '.', $name );
762 $extension = $this->mime2ext( $mime );
763 if ( $extension ) {
764 return $name[0] . '.' . $extension;
765 }
766
767 return $name[0] . '.' . $name[1];
768
769 }
770
771 private function strip_extension( $name ) {
772 $name = explode( '.', $name );
773 return $name[0];
774 }
775
776 private function getFilename($image, $new_filename, $must_license)
777 {
778 $stockpack = StockPack::get_instance();
779
780 $filename = $image->data->name;
781
782 if($new_filename) {
783 $filename = $new_filename;
784 }
785
786 if(!$this->is_provider_premium($image->data->provider) || $must_license) {
787 return $filename;
788 }
789
790 if($stockpack->settings->add_license_state_to_filename()==='yes') {
791 $filename = '--sto--placeholder--' . $image->data->provider.'--'.$image->data->id.'--'.$filename;
792 }
793
794 return $filename;
795 }
796
797 public function debug_wp_remote_post_and_get_request( $response, $context, $class, $r, $url ) {
798 error_log( '------------------------------' );
799 error_log( $url );
800 error_log( json_encode( $response ) );
801 error_log( $class );
802 error_log( $context );
803 error_log( json_encode( $r ) );
804 }
805
806 private function mime2ext( $mime ) {
807 $mime = str_replace( ';charset=UTF-8', '', $mime );
808 $mime_map = [
809 'video/3gpp2' => '3g2',
810 'video/3gp' => '3gp',
811 'video/3gpp' => '3gp',
812 'application/x-compressed' => '7zip',
813 'audio/x-acc' => 'aac',
814 'audio/ac3' => 'ac3',
815 'application/postscript' => 'ai',
816 'audio/x-aiff' => 'aif',
817 'audio/aiff' => 'aif',
818 'audio/x-au' => 'au',
819 'video/x-msvideo' => 'avi',
820 'video/msvideo' => 'avi',
821 'video/avi' => 'avi',
822 'application/x-troff-msvideo' => 'avi',
823 'application/macbinary' => 'bin',
824 'application/mac-binary' => 'bin',
825 'application/x-binary' => 'bin',
826 'application/x-macbinary' => 'bin',
827 'image/bmp' => 'bmp',
828 'image/x-bmp' => 'bmp',
829 'image/x-bitmap' => 'bmp',
830 'image/x-xbitmap' => 'bmp',
831 'image/x-win-bitmap' => 'bmp',
832 'image/x-windows-bmp' => 'bmp',
833 'image/ms-bmp' => 'bmp',
834 'image/x-ms-bmp' => 'bmp',
835 'application/bmp' => 'bmp',
836 'application/x-bmp' => 'bmp',
837 'application/x-win-bitmap' => 'bmp',
838 'application/cdr' => 'cdr',
839 'application/coreldraw' => 'cdr',
840 'application/x-cdr' => 'cdr',
841 'application/x-coreldraw' => 'cdr',
842 'image/cdr' => 'cdr',
843 'image/x-cdr' => 'cdr',
844 'zz-application/zz-winassoc-cdr' => 'cdr',
845 'application/mac-compactpro' => 'cpt',
846 'application/pkix-crl' => 'crl',
847 'application/pkcs-crl' => 'crl',
848 'application/x-x509-ca-cert' => 'crt',
849 'application/pkix-cert' => 'crt',
850 'text/css' => 'css',
851 'text/x-comma-separated-values' => 'csv',
852 'text/comma-separated-values' => 'csv',
853 'application/vnd.msexcel' => 'csv',
854 'application/x-director' => 'dcr',
855 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx',
856 'application/x-dvi' => 'dvi',
857 'message/rfc822' => 'eml',
858 'application/x-msdownload' => 'exe',
859 'video/x-f4v' => 'f4v',
860 'audio/x-flac' => 'flac',
861 'video/x-flv' => 'flv',
862 'image/gif' => 'gif',
863 'application/gpg-keys' => 'gpg',
864 'application/x-gtar' => 'gtar',
865 'application/x-gzip' => 'gzip',
866 'application/mac-binhex40' => 'hqx',
867 'application/mac-binhex' => 'hqx',
868 'application/x-binhex40' => 'hqx',
869 'application/x-mac-binhex40' => 'hqx',
870 'text/html' => 'html',
871 'image/x-icon' => 'ico',
872 'image/x-ico' => 'ico',
873 'image/vnd.microsoft.icon' => 'ico',
874 'text/calendar' => 'ics',
875 'application/java-archive' => 'jar',
876 'application/x-java-application' => 'jar',
877 'application/x-jar' => 'jar',
878 'image/jp2' => 'jp2',
879 'video/mj2' => 'jp2',
880 'image/jpx' => 'jp2',
881 'image/jpm' => 'jp2',
882 'image/jpeg' => 'jpg',
883 'image/pjpeg' => 'jpg',
884 'application/x-javascript' => 'js',
885 'application/json' => 'json',
886 'text/json' => 'json',
887 'application/vnd.google-earth.kml+xml' => 'kml',
888 'application/vnd.google-earth.kmz' => 'kmz',
889 'text/x-log' => 'log',
890 'audio/x-m4a' => 'm4a',
891 'application/vnd.mpegurl' => 'm4u',
892 'audio/midi' => 'mid',
893 'application/vnd.mif' => 'mif',
894 'video/quicktime' => 'mov',
895 'video/x-sgi-movie' => 'movie',
896 'audio/mpeg' => 'mp3',
897 'audio/mpg' => 'mp3',
898 'audio/mpeg3' => 'mp3',
899 'audio/mp3' => 'mp3',
900 'video/mp4' => 'mp4',
901 'video/mpeg' => 'mpeg',
902 'application/oda' => 'oda',
903 'audio/ogg' => 'ogg',
904 'video/ogg' => 'ogg',
905 'application/ogg' => 'ogg',
906 'application/x-pkcs10' => 'p10',
907 'application/pkcs10' => 'p10',
908 'application/x-pkcs12' => 'p12',
909 'application/x-pkcs7-signature' => 'p7a',
910 'application/pkcs7-mime' => 'p7c',
911 'application/x-pkcs7-mime' => 'p7c',
912 'application/x-pkcs7-certreqresp' => 'p7r',
913 'application/pkcs7-signature' => 'p7s',
914 'application/pdf' => 'pdf',
915 'application/octet-stream' => 'pdf',
916 'application/x-x509-user-cert' => 'pem',
917 'application/x-pem-file' => 'pem',
918 'application/pgp' => 'pgp',
919 'application/x-httpd-php' => 'php',
920 'application/php' => 'php',
921 'application/x-php' => 'php',
922 'text/php' => 'php',
923 'text/x-php' => 'php',
924 'application/x-httpd-php-source' => 'php',
925 'image/png' => 'png',
926 'image/x-png' => 'png',
927 'application/powerpoint' => 'ppt',
928 'application/vnd.ms-powerpoint' => 'ppt',
929 'application/vnd.ms-office' => 'ppt',
930 'application/msword' => 'doc',
931 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx',
932 'application/x-photoshop' => 'psd',
933 'image/vnd.adobe.photoshop' => 'psd',
934 'audio/x-realaudio' => 'ra',
935 'audio/x-pn-realaudio' => 'ram',
936 'application/x-rar' => 'rar',
937 'application/rar' => 'rar',
938 'application/x-rar-compressed' => 'rar',
939 'audio/x-pn-realaudio-plugin' => 'rpm',
940 'application/x-pkcs7' => 'rsa',
941 'text/rtf' => 'rtf',
942 'text/richtext' => 'rtx',
943 'video/vnd.rn-realvideo' => 'rv',
944 'application/x-stuffit' => 'sit',
945 'application/smil' => 'smil',
946 'text/srt' => 'srt',
947 'image/svg+xml' => 'svg',
948 'application/x-shockwave-flash' => 'swf',
949 'application/x-tar' => 'tar',
950 'application/x-gzip-compressed' => 'tgz',
951 'image/tiff' => 'tiff',
952 'text/plain' => 'txt',
953 'text/x-vcard' => 'vcf',
954 'application/videolan' => 'vlc',
955 'text/vtt' => 'vtt',
956 'audio/x-wav' => 'wav',
957 'audio/wave' => 'wav',
958 'audio/wav' => 'wav',
959 'application/wbxml' => 'wbxml',
960 'video/webm' => 'webm',
961 'audio/x-ms-wma' => 'wma',
962 'application/wmlc' => 'wmlc',
963 'video/x-ms-wmv' => 'wmv',
964 'video/x-ms-asf' => 'wmv',
965 'application/xhtml+xml' => 'xhtml',
966 'application/excel' => 'xl',
967 'application/msexcel' => 'xls',
968 'application/x-msexcel' => 'xls',
969 'application/x-ms-excel' => 'xls',
970 'application/x-excel' => 'xls',
971 'application/x-dos_ms_excel' => 'xls',
972 'application/xls' => 'xls',
973 'application/x-xls' => 'xls',
974 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx',
975 'application/vnd.ms-excel' => 'xlsx',
976 'application/xml' => 'xml',
977 'text/xml' => 'xml',
978 'text/xsl' => 'xsl',
979 'application/xspf+xml' => 'xspf',
980 'application/x-compress' => 'z',
981 'application/x-zip' => 'zip',
982 'application/zip' => 'zip',
983 'application/x-zip-compressed' => 'zip',
984 'application/s-compressed' => 'zip',
985 'multipart/x-zip' => 'zip',
986 'text/x-scriptzsh' => 'zsh',
987 'application/illustrator' => 'ai',
988 'application/eps' => 'eps',
989 'application/x-eps' => 'eps',
990 'image/eps' => 'eps',
991 'image/x-eps' => 'eps'
992 ];
993
994 return isset( $mime_map[ $mime ] ) === true ? $mime_map[ $mime ] : false;
995 }
996
997
998
999 }
1000
1001 $GLOBALS['stockpack_query'] = StockpackQuery::get_instance();
1002 }
1003