PluginProbe
StockPack – Stock photos and AI images from Unsplash, Adobe Stock, Freepik and more / 3.7.0
StockPack – Stock photos and AI images from Unsplash, Adobe Stock, Freepik and more v3.7.0
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 3.0.0 3.0.1 All 71 releases
stockpack / src / class-stockpackquery.php

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

1,079 lines 51.0 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( $this->with_wallet( $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 if ( isset( $response->data->status ) && 'pending' === $response->data->status ) {
292 wp_send_json_success( $response->data );
293 }
294
295 wp_send_json_success( $this->with_wallet( $response->data ) );
296 }
297
298 private function request_value( $key, $default = '' ) {
299 if ( ! isset( $_REQUEST[ $key ] ) ) {
300 return $default;
301 }
302
303 return sanitize_text_field( wp_unslash( $_REQUEST[ $key ] ) );
304 }
305
306 /**
307 *
308 */
309 public function cache() {
310 check_ajax_referer( 'stockpack_cache', 'security' );
311
312 if ( ! current_user_can( 'upload_files' ) ) {
313 wp_send_json_error();
314 }
315 $id = 0;
316
317 if ( isset( $_REQUEST['media_id'] ) ) {
318 $id = sanitize_text_field( $_REQUEST['media_id'] );
319 }
320 $args = array(
321 'post_type' => 'attachment',
322 'post_status' => 'inherit',
323 'meta_query' => array(
324 array(
325 'key' => 'stockpack_id',
326 'value' => $id
327 )
328 )
329 );
330 $query = new WP_Query( $args );
331 if ( ! $query->have_posts() ) {
332 wp_send_json_error( array( 'message' => __( 'Image not found in cache', 'stockpack' ) ) );
333 }
334
335 wp_send_json_success( wp_prepare_attachment_for_js( $query->post->ID ) );
336
337 }
338
339 /**
340 *
341 */
342 public function download() {
343 check_ajax_referer( 'stockpack_download', 'security' );
344 if ( ! current_user_can( 'upload_files' ) ) {
345 wp_send_json_error( array( 'message' => __( 'You are not allowed to upload files', 'stockpack' ) ) );
346 }
347
348 $id = 0;
349 if ( isset( $_REQUEST['media_id'] ) ) {
350 $id = sanitize_text_field( $_REQUEST['media_id'] );
351 }
352 $post_id = 0;
353 if ( isset( $_REQUEST['post_id'] ) ) {
354 $post_id = sanitize_text_field( $_REQUEST['post_id'] );
355 }
356 $provider = 0;
357 if ( isset( $_REQUEST['provider'] ) ) {
358 $provider = sanitize_text_field( $_REQUEST['provider'] );
359 }
360 $must_license = false;
361 if ( isset( $_REQUEST['must_license'] ) ) {
362 $must_license = sanitize_text_field( $_REQUEST['must_license'] );
363 }
364 $new_filename = "";
365 if ( isset( $_REQUEST['new_filename'] ) ) {
366 $new_filename = sanitize_text_field( $_REQUEST['new_filename'] );
367 }
368 $search = isset( $_REQUEST['search_key'] ) ? sanitize_title( $_REQUEST['search_key'] ) : $this->get_domain();
369 $description = isset( $_REQUEST['description'] ) ? sanitize_textarea_field( $_REQUEST['description'] ) : '';
370
371
372
373 $image = $this->image( $id, $post_id, $description, $search, $must_license, $provider, $new_filename );
374
375 if ( is_wp_error( $image ) ) {
376 if ( strpos( $image->get_error_code(), 'limit_reached' ) !== false ) {
377 wp_send_json_error( $image );
378 die();
379 }
380 wp_send_json_error( array( 'message' => $image->get_error_message() ) );
381 }
382
383 wp_send_json_success( wp_prepare_attachment_for_js( $image ) );
384
385 }
386
387
388
389 public function is_provider_premium( $provider ) {
390 return in_array( $provider, array(
391 'adobe_stock',
392 'getty',
393 'istock',
394 'deposit_photos'
395 )
396 );
397 }
398
399 public function images( $query = [] ) {
400 if ( empty( $query['provider'] ) ) {
401 $available = $this->settings->get_available_search_provider_slugs();
402 if ( $available ) {
403 $query['available_providers'] = implode( ',', $available );
404 }
405 }
406
407 return $this->call( 'GET', 'images/search', $query );
408 }
409
410
411 /**
412 * @param $data
413 *
414 * @return array
415 */
416 private function format( $data ) {
417 return $data;
418 }
419
420
421 public function get_license_cost( $media_id, $provider ) {
422
423 return $this->call( 'GET', 'images/license-cost', array(
424 'id' => $media_id,
425 'locale' => get_locale(),
426 'provider' => $provider
427 ) );
428
429 }
430
431 public function get_ai_prices() {
432 $cached = get_transient( 'stockpack_ai_prices' );
433
434 if ( is_array( $cached ) ) {
435 return $cached;
436 }
437
438 return $this->fetch_ai_prices();
439 }
440
441 public function get_ai_wallet( $fresh = false ) {
442 $cached = get_transient( 'stockpack_ai_wallet' );
443
444 if ( is_array( $cached ) && ! $fresh ) {
445 return $cached;
446 }
447
448 $prices = $this->fetch_ai_prices();
449
450 if ( ! $prices && is_array( $cached ) ) {
451 return $cached;
452 }
453
454 return $this->wallet_from( $prices );
455 }
456
457 public function dashboard_url( $path = '' ) {
458 $base = defined( 'STOCKPACK_DASHBOARD_URL' ) ? STOCKPACK_DASHBOARD_URL : 'https://stockpack.co';
459
460 return rtrim( $base, '/' ) . ( $path ? '/' . ltrim( $path, '/' ) : '' );
461 }
462
463 private function fetch_ai_prices() {
464 $response = $this->call( 'GET', 'generate/prices' );
465 $prices = array();
466
467 if ( isset( $response->data ) ) {
468 $prices = json_decode( wp_json_encode( $response->data ), true );
469 }
470
471 set_transient( 'stockpack_ai_prices', $prices, $prices ? DAY_IN_SECONDS : 5 * MINUTE_IN_SECONDS );
472
473 if ( $prices ) {
474 set_transient( 'stockpack_ai_wallet', $this->wallet_from( $prices ), MINUTE_IN_SECONDS );
475 }
476
477 return $prices;
478 }
479
480 private function wallet_from( $prices ) {
481 $wallet = isset( $prices['wallet'] ) && is_array( $prices['wallet'] ) ? $prices['wallet'] : array();
482 $balance = isset( $wallet['balance'] ) ? (int) $wallet['balance'] : null;
483
484 return array(
485 'mode' => isset( $wallet['mode'] ) ? $wallet['mode'] : 'byok',
486 'balance' => $balance,
487 'balance_text' => null === $balance ? '' : number_format_i18n( $balance ),
488 'top_up_url' => ! empty( $wallet['top_up_url'] ) ? $wallet['top_up_url'] : $this->dashboard_url( 'billing/credits' ),
489 'connect_url' => $this->dashboard_url( 'providers' ),
490 );
491 }
492
493 private function with_wallet( $data ) {
494 $wallet = $this->get_ai_wallet();
495
496 if ( 'managed' === $wallet['mode'] ) {
497 $data->wallet = $this->get_ai_wallet( true );
498 }
499
500 return $data;
501 }
502
503 public function image( $media_id, $post_id, $description = '', $search = '', $must_license = 0, $provider = 0, $new_filename = '' ) {
504
505 do_action( 'stockpack_before_attachment_download', $provider,$new_filename, $media_id, $must_license );
506
507 $big_image_threshold = (int) apply_filters( 'big_image_size_threshold', 2560, array( 0, 0 ), '', 0 );
508
509 $image = $this->call( 'GET', 'images/download',
510 array(
511 'id' => $media_id,
512 'must_license' => $must_license,
513 'provider' => $provider,
514 'min_width'=> $big_image_threshold,
515 'min_height'=> $big_image_threshold,
516 )
517 );
518
519 if ( ! isset( $image->data->download ) ) {
520 if ( is_wp_error( $image ) ) {
521 return $image;
522 }
523
524 return $this->handle_download_errors( $image->data );
525 }
526
527 $filename = $this->getFilename($image, $new_filename, $must_license);
528
529 $caption = $image->data->caption ?: '';
530 $attachment_id = $this->upload_remote_image_and_attach( $image->data->download, $post_id, $description, $filename,$image, $search, $caption );
531 if ( is_wp_error( $attachment_id ) ) {
532 return $attachment_id;
533 }
534 if ( ! $attachment_id ) {
535 return new WP_Error( 'upload_failure', __( 'There has been a problem with the upload. Please try again', 'stockpack' ) );
536 }
537
538 update_post_meta( $attachment_id, 'stockpack_id', $media_id );
539
540 return $attachment_id;
541 }
542
543 private function handle_license_errors( $response ) {
544 if ( isset( $response->code ) ) {
545 switch ( $response->code ) {
546 case 'token_expired':
547 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' ) );
548 }
549
550 if ( ! empty( $response->message ) ) {
551 return new WP_Error( $response->code, $response->message );
552 }
553 }
554
555 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' ) );
556 }
557
558 private function handle_download_errors( $response ) {
559 if ( isset( $response->code ) ) {
560 switch ( $response->code ) {
561 case 'token_expired':
562 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' ) );
563 }
564
565 if ( ! empty( $response->message ) ) {
566 return new WP_Error( $response->code, $response->message );
567 }
568 }
569
570 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' ) );
571 }
572
573 private function handle_search_errors( $response ) {
574 if ( isset( $response->code ) ) {
575 switch ( $response->code ) {
576 case 'token_expired':
577 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' ) );
578 }
579 }
580
581 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' ) );
582
583 }
584
585
586 /**
587 * @param $method
588 * @param $path
589 * @param array $query
590 *
591 * @return mixed|null
592 */
593 private function call( $method, $path, $query = [] ) {
594 /** @var StockPack $stockpack */
595 $stockpack = StockPack::get_instance();
596
597
598 if ( ! isset( $query['key'] ) ) {
599 $api_key = $stockpack->settings->get_api_key();
600 if ( $api_key ) {
601 $query = array_merge( $query,
602 [
603 'api_token' => $api_key
604 ]
605 );
606 } else {
607 $path .= '-trial';
608 }
609 }
610
611 $query = array_merge( $query,
612 [
613 'referral' => get_bloginfo( 'url' ),
614 'safe_search' => $stockpack->settings->get_safe_search(),
615 'user_data' => $stockpack->settings->get_license_state(),
616 ]
617 );
618
619 $url = $this->url . '/' . self::VERSION . '/' . $path;
620 $is_post = 'post' === strtolower( $method );
621
622 if ( ! $is_post ) {
623 $url .= '?' . http_build_query( $query );
624 }
625
626 do_action( 'stockpack_before_api_request', $url, $query );
627
628 $headers = array( 'Accept' => 'application/json' );
629
630 if ( $is_post ) {
631 $response = wp_remote_post( $url, array(
632 'timeout' => 20,
633 'sslverify' => false,
634 'headers' => $headers,
635 'body' => $query,
636 ) );
637 } else {
638 $response = wp_remote_get( $url, array(
639 'timeout' => apply_filters( 'stockpack_api_timeout', $this->timeout_for( $path ), $path ),
640 'sslverify' => false,
641 'headers' => $headers,
642 ) );
643 }
644
645 do_action( 'stockpack_after_api_request', $url, $query, $response );
646
647 if ( is_wp_error( $response ) ) {
648 return $response;
649 }
650
651 $response_code = wp_remote_retrieve_response_code( $response );
652 if ( $response_code !== 200 ) {
653 switch ( $response_code ) {
654 case 429: // too many requests
655 return $this->limit_exceeded( $response );
656 case 401: // access denied
657 return $this->invalid_token( $response );
658 default:
659 return $this->server_error( $response, $response_code );
660 }
661 }
662
663 $response_body = wp_remote_retrieve_body( $response );
664
665 return json_decode( $response_body );
666 }
667
668 private function timeout_for( $path ) {
669 return strpos( $path, 'images/download' ) === 0 ? 30 : 10;
670 }
671
672 private function error_payload( $error ) {
673 $payload = array(
674 'code' => $error->get_error_code(),
675 'message' => $error->get_error_message(),
676 );
677 $wallet = $this->get_ai_wallet();
678
679 if ( 'insufficient_credits' === $payload['code'] ) {
680 $data = $error->get_error_data();
681 $payload['link'] = ! empty( $data->top_up_url ) ? $data->top_up_url : $wallet['top_up_url'];
682 $payload['link_text'] = __( 'Top up credits', 'stockpack' );
683 }
684
685 if ( 'managed' === $wallet['mode'] ) {
686 $payload['wallet'] = $this->get_ai_wallet( true );
687 }
688
689 return $payload;
690 }
691
692 private function server_error( $response, $response_code ) {
693 $body = json_decode( wp_remote_retrieve_body( $response ) );
694
695 if ( ! empty( $body->message ) ) {
696 return new WP_Error( ! empty( $body->code ) ? $body->code : 1, $body->message, $body );
697 }
698
699 return new WP_Error( 1, sprintf(
700 /* translators: %d: HTTP status code returned by the StockPack API */
701 __( 'The StockPack server returned an error (HTTP %d). If this keeps happening, contact StockPack support.', 'stockpack' ),
702 $response_code
703 ) );
704 }
705
706 private function limit_exceeded( $response ) {
707 /** @var StockPack $stockpack */
708 $stockpack = StockPack::get_instance();
709
710
711 $limit = wp_remote_retrieve_header( $response, 'x-ratelimit-limit' );
712 $retry_after = wp_remote_retrieve_header( $response, 'retry-after' );
713 $retry_after = $this->human_seconds( $retry_after );
714 $retry_after = '<span class ="stockpack-timer">' . $retry_after . '</span>';
715 if ( $limit > 50 ) {
716 return new WP_Error( 'premium_limit_reached', __( 'Request limit reached, the reset will be in ', 'stockpack' ) . $retry_after );
717 }
718 $api_key = $stockpack->admin->get_api_key();
719 if ( $api_key ) {
720 return new WP_Error( 'free_limit_reached', __( 'Request limit reached, the reset will be in ', 'stockpack' ) . $retry_after );
721 }
722
723
724 return new WP_Error( 'anonymous_limit_reached', __( 'Request limit reached, the reset will be in ', 'stockpack' ) . $retry_after );
725 }
726
727 private function invalid_token( $response ) {
728 return new WP_Error( 'invalid_token', __( 'Request denied. Please check your token!', 'stockpack' ) );
729 }
730
731 private function support_caption_translation( $caption ) {
732 if ( ! $caption ) {
733 return '';
734 }
735
736 $caption = str_replace( 'Photo by', __( 'Photo by', 'stockpack' ), $caption );
737 $caption = str_replace( ' on ', _x( ' on ', 'Make sure to keep the space', 'stockpack' ), $caption );
738
739 return $caption;
740 }
741
742 /**
743 * @param $image_url
744 * @param $parent_id
745 *
746 * @param $description
747 *
748 * @param $name
749 * @param string $search
750 *
751 * @param string $caption
752 *
753 * @return bool|int|WP_Error
754 */
755 private function upload_remote_image_and_attach( $image_url, $parent_id, $description, $name, $image, $search = '', $caption = '' ) {
756
757 $get = wp_remote_get( $image_url, array(
758 'timeout' => apply_filters( 'stockpack_download_timeout', 30 )
759 )
760 );
761 if ( is_wp_error( $get ) ) {
762 return new WP_Error( 100, __( 'Image download failed, please try again. Errors:', 'stockpack' ) . PHP_EOL . $get->get_error_message() );
763 }
764 $type = wp_remote_retrieve_header( $get, 'content-type' );
765 if ( ! $type ) {
766 $type = wp_check_filetype( $name )['type'];
767 }
768 if ( ! $type ) {
769 return new WP_Error( 100, __( 'Image type couldn\'t be determined', 'stockpack' ) );
770 }
771 $name = $this->update_extension( $name, $type );
772
773 $name = apply_filters( 'stockpack_attachment_filename', $name, $image );
774
775 $mirror = wp_upload_bits( $name, '', wp_remote_retrieve_body( $get ) );
776 $attachment = array(
777 'post_title' => $this->strip_extension($name),
778 'post_content' => $description,
779 'post_excerpt' => apply_filters( 'stockpack_caption', $this->support_caption_translation( $caption ), $image ),
780 'post_mime_type' => $type
781 );
782 $attach_id = wp_insert_attachment( $attachment, $mirror['file'], $parent_id );
783 require_once( ABSPATH . 'wp-admin/includes/image.php' );
784
785 // An upscale that WordPress immediately scales back down is an
786 // upscale the user paid for and did not get, so the threshold is
787 // lifted for the result of one. Priority 999 so it wins over a theme
788 // or plugin that lowers it.
789 $is_upscale = isset( $image->data->meta->action ) && 'upscale' === $image->data->meta->action;
790
791 if ( $is_upscale ) {
792 add_filter( 'big_image_size_threshold', '__return_false', 999 );
793 }
794
795 $attach_data = wp_generate_attachment_metadata( $attach_id, $mirror['file'] );
796 wp_update_attachment_metadata( $attach_id, $attach_data );
797
798 if ( $is_upscale ) {
799 remove_filter( 'big_image_size_threshold', '__return_false', 999 );
800 }
801 update_post_meta( $attach_id, '_wp_attachment_image_alt', $description );
802 $this->store_attachment_meta($attach_id,$image);
803
804 do_action( 'stockpack_after_attachment_uploaded', $attach_id, $image );
805
806 return $attach_id;
807
808 }
809
810 private function store_attachment_meta($attach_id, $image){
811 $data = $image->data;
812 $meta = isset($data->meta) ? $data->meta : new stdClass();
813 update_post_meta($attach_id,'stockpack_media_id',$data->id);
814 update_post_meta($attach_id,'stockpack_provider',isset($meta->provider) ? $meta->provider : '');
815 update_post_meta($attach_id,'stockpack_author_url',isset($meta->author_url) ? $meta->author_url : '');
816 update_post_meta($attach_id,'stockpack_author_name',isset($meta->author_name) ? $meta->author_name : '');
817 update_post_meta($attach_id,'stockpack_image_url',isset($meta->image_url) ? $meta->image_url : '');
818 update_post_meta($attach_id,'stockpack_download_timestamp',time());
819 }
820
821 /**
822 * @return mixed
823 */
824 private function get_domain() {
825 $url = get_bloginfo( 'url' );
826 $parse = wp_parse_url( $url );
827
828 return strtok( $parse['host'], '.' );
829 }
830
831
832 private function human_seconds( $seconds, $separator = ":" ) {
833 return sprintf( "%02d%s%02d%s%02d", floor( $seconds / 3600 ), $separator, ( $seconds / 60 ) % 60, $separator, $seconds % 60 );
834 }
835
836 private function update_extension( $name, $mime ) {
837 $name = explode( '.', $name );
838 $extension = $this->mime2ext( $mime );
839 if ( $extension ) {
840 return $name[0] . '.' . $extension;
841 }
842
843 return $name[0] . '.' . $name[1];
844
845 }
846
847 private function strip_extension( $name ) {
848 $name = explode( '.', $name );
849 return $name[0];
850 }
851
852 private function getFilename($image, $new_filename, $must_license)
853 {
854 $stockpack = StockPack::get_instance();
855
856 $filename = $image->data->name;
857
858 if($new_filename) {
859 $filename = $new_filename;
860 }
861
862 if(!$this->is_provider_premium($image->data->provider) || $must_license) {
863 return $filename;
864 }
865
866 if($stockpack->settings->add_license_state_to_filename()==='yes') {
867 $filename = '--sto--placeholder--' . $image->data->provider.'--'.$image->data->id.'--'.$filename;
868 }
869
870 return $filename;
871 }
872
873 public function debug_wp_remote_post_and_get_request( $response, $context, $class, $r, $url ) {
874 error_log( '------------------------------' );
875 error_log( $url );
876 error_log( json_encode( $response ) );
877 error_log( $class );
878 error_log( $context );
879 error_log( json_encode( $r ) );
880 }
881
882 private function mime2ext( $mime ) {
883 $mime = str_replace( ';charset=UTF-8', '', $mime );
884 $mime_map = [
885 'video/3gpp2' => '3g2',
886 'video/3gp' => '3gp',
887 'video/3gpp' => '3gp',
888 'application/x-compressed' => '7zip',
889 'audio/x-acc' => 'aac',
890 'audio/ac3' => 'ac3',
891 'application/postscript' => 'ai',
892 'audio/x-aiff' => 'aif',
893 'audio/aiff' => 'aif',
894 'audio/x-au' => 'au',
895 'video/x-msvideo' => 'avi',
896 'video/msvideo' => 'avi',
897 'video/avi' => 'avi',
898 'application/x-troff-msvideo' => 'avi',
899 'application/macbinary' => 'bin',
900 'application/mac-binary' => 'bin',
901 'application/x-binary' => 'bin',
902 'application/x-macbinary' => 'bin',
903 'image/bmp' => 'bmp',
904 'image/x-bmp' => 'bmp',
905 'image/x-bitmap' => 'bmp',
906 'image/x-xbitmap' => 'bmp',
907 'image/x-win-bitmap' => 'bmp',
908 'image/x-windows-bmp' => 'bmp',
909 'image/ms-bmp' => 'bmp',
910 'image/x-ms-bmp' => 'bmp',
911 'application/bmp' => 'bmp',
912 'application/x-bmp' => 'bmp',
913 'application/x-win-bitmap' => 'bmp',
914 'application/cdr' => 'cdr',
915 'application/coreldraw' => 'cdr',
916 'application/x-cdr' => 'cdr',
917 'application/x-coreldraw' => 'cdr',
918 'image/cdr' => 'cdr',
919 'image/x-cdr' => 'cdr',
920 'zz-application/zz-winassoc-cdr' => 'cdr',
921 'application/mac-compactpro' => 'cpt',
922 'application/pkix-crl' => 'crl',
923 'application/pkcs-crl' => 'crl',
924 'application/x-x509-ca-cert' => 'crt',
925 'application/pkix-cert' => 'crt',
926 'text/css' => 'css',
927 'text/x-comma-separated-values' => 'csv',
928 'text/comma-separated-values' => 'csv',
929 'application/vnd.msexcel' => 'csv',
930 'application/x-director' => 'dcr',
931 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx',
932 'application/x-dvi' => 'dvi',
933 'message/rfc822' => 'eml',
934 'application/x-msdownload' => 'exe',
935 'video/x-f4v' => 'f4v',
936 'audio/x-flac' => 'flac',
937 'video/x-flv' => 'flv',
938 'image/gif' => 'gif',
939 'application/gpg-keys' => 'gpg',
940 'application/x-gtar' => 'gtar',
941 'application/x-gzip' => 'gzip',
942 'application/mac-binhex40' => 'hqx',
943 'application/mac-binhex' => 'hqx',
944 'application/x-binhex40' => 'hqx',
945 'application/x-mac-binhex40' => 'hqx',
946 'text/html' => 'html',
947 'image/x-icon' => 'ico',
948 'image/x-ico' => 'ico',
949 'image/vnd.microsoft.icon' => 'ico',
950 'text/calendar' => 'ics',
951 'application/java-archive' => 'jar',
952 'application/x-java-application' => 'jar',
953 'application/x-jar' => 'jar',
954 'image/jp2' => 'jp2',
955 'video/mj2' => 'jp2',
956 'image/jpx' => 'jp2',
957 'image/jpm' => 'jp2',
958 'image/jpeg' => 'jpg',
959 'image/pjpeg' => 'jpg',
960 'application/x-javascript' => 'js',
961 'application/json' => 'json',
962 'text/json' => 'json',
963 'application/vnd.google-earth.kml+xml' => 'kml',
964 'application/vnd.google-earth.kmz' => 'kmz',
965 'text/x-log' => 'log',
966 'audio/x-m4a' => 'm4a',
967 'application/vnd.mpegurl' => 'm4u',
968 'audio/midi' => 'mid',
969 'application/vnd.mif' => 'mif',
970 'video/quicktime' => 'mov',
971 'video/x-sgi-movie' => 'movie',
972 'audio/mpeg' => 'mp3',
973 'audio/mpg' => 'mp3',
974 'audio/mpeg3' => 'mp3',
975 'audio/mp3' => 'mp3',
976 'video/mp4' => 'mp4',
977 'video/mpeg' => 'mpeg',
978 'application/oda' => 'oda',
979 'audio/ogg' => 'ogg',
980 'video/ogg' => 'ogg',
981 'application/ogg' => 'ogg',
982 'application/x-pkcs10' => 'p10',
983 'application/pkcs10' => 'p10',
984 'application/x-pkcs12' => 'p12',
985 'application/x-pkcs7-signature' => 'p7a',
986 'application/pkcs7-mime' => 'p7c',
987 'application/x-pkcs7-mime' => 'p7c',
988 'application/x-pkcs7-certreqresp' => 'p7r',
989 'application/pkcs7-signature' => 'p7s',
990 'application/pdf' => 'pdf',
991 'application/octet-stream' => 'pdf',
992 'application/x-x509-user-cert' => 'pem',
993 'application/x-pem-file' => 'pem',
994 'application/pgp' => 'pgp',
995 'application/x-httpd-php' => 'php',
996 'application/php' => 'php',
997 'application/x-php' => 'php',
998 'text/php' => 'php',
999 'text/x-php' => 'php',
1000 'application/x-httpd-php-source' => 'php',
1001 'image/png' => 'png',
1002 'image/x-png' => 'png',
1003 'application/powerpoint' => 'ppt',
1004 'application/vnd.ms-powerpoint' => 'ppt',
1005 'application/vnd.ms-office' => 'ppt',
1006 'application/msword' => 'doc',
1007 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx',
1008 'application/x-photoshop' => 'psd',
1009 'image/vnd.adobe.photoshop' => 'psd',
1010 'audio/x-realaudio' => 'ra',
1011 'audio/x-pn-realaudio' => 'ram',
1012 'application/x-rar' => 'rar',
1013 'application/rar' => 'rar',
1014 'application/x-rar-compressed' => 'rar',
1015 'audio/x-pn-realaudio-plugin' => 'rpm',
1016 'application/x-pkcs7' => 'rsa',
1017 'text/rtf' => 'rtf',
1018 'text/richtext' => 'rtx',
1019 'video/vnd.rn-realvideo' => 'rv',
1020 'application/x-stuffit' => 'sit',
1021 'application/smil' => 'smil',
1022 'text/srt' => 'srt',
1023 'image/svg+xml' => 'svg',
1024 'application/x-shockwave-flash' => 'swf',
1025 'application/x-tar' => 'tar',
1026 'application/x-gzip-compressed' => 'tgz',
1027 'image/tiff' => 'tiff',
1028 'text/plain' => 'txt',
1029 'text/x-vcard' => 'vcf',
1030 'application/videolan' => 'vlc',
1031 'text/vtt' => 'vtt',
1032 'audio/x-wav' => 'wav',
1033 'audio/wave' => 'wav',
1034 'audio/wav' => 'wav',
1035 'application/wbxml' => 'wbxml',
1036 'video/webm' => 'webm',
1037 'audio/x-ms-wma' => 'wma',
1038 'application/wmlc' => 'wmlc',
1039 'video/x-ms-wmv' => 'wmv',
1040 'video/x-ms-asf' => 'wmv',
1041 'application/xhtml+xml' => 'xhtml',
1042 'application/excel' => 'xl',
1043 'application/msexcel' => 'xls',
1044 'application/x-msexcel' => 'xls',
1045 'application/x-ms-excel' => 'xls',
1046 'application/x-excel' => 'xls',
1047 'application/x-dos_ms_excel' => 'xls',
1048 'application/xls' => 'xls',
1049 'application/x-xls' => 'xls',
1050 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx',
1051 'application/vnd.ms-excel' => 'xlsx',
1052 'application/xml' => 'xml',
1053 'text/xml' => 'xml',
1054 'text/xsl' => 'xsl',
1055 'application/xspf+xml' => 'xspf',
1056 'application/x-compress' => 'z',
1057 'application/x-zip' => 'zip',
1058 'application/zip' => 'zip',
1059 'application/x-zip-compressed' => 'zip',
1060 'application/s-compressed' => 'zip',
1061 'multipart/x-zip' => 'zip',
1062 'text/x-scriptzsh' => 'zsh',
1063 'application/illustrator' => 'ai',
1064 'application/eps' => 'eps',
1065 'application/x-eps' => 'eps',
1066 'image/eps' => 'eps',
1067 'image/x-eps' => 'eps'
1068 ];
1069
1070 return isset( $mime_map[ $mime ] ) === true ? $mime_map[ $mime ] : false;
1071 }
1072
1073
1074
1075 }
1076
1077 $GLOBALS['stockpack_query'] = StockpackQuery::get_instance();
1078 }
1079