PluginProbe
StockPack – Stock photos and AI images from Unsplash, Adobe Stock, Freepik and more / 3.7.2
StockPack – Stock photos and AI images from Unsplash, Adobe Stock, Freepik and more v3.7.2
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
← All changes | src/class-stockpackquery.php +447 -121 2.5.1 → 3.7.2 View file →
@@ -1,12 +1,7 @@
1 1 <?php
2 2
3 3
4 -use GuzzleHttp\Client;
5 -use GuzzleHttp\Cookie\CookieJar;
6 -use GuzzleHttp\Exception\GuzzleException;
7 -use GuzzleHttp\TransferStats;
8 -
9 4 if ( ! defined( 'ABSPATH' ) ) {
10 5 exit;
11 6 }
12 7 if ( ! class_exists( 'StockpackQuery' ) ) {
@@ -24,17 +19,11 @@
24 19 * Api version
25 20 */
26 21 const VERSION = 'v1';
27 22
28 - /**
29 - * @var string
30 - */
31 - private $api_key;
23 + public $admin;
32 24
33 - /**
34 - * @var Client
35 - */
36 - private $client;
25 + public $settings;
37 26
38 27 public static function get_instance() {
39 28 if ( null === self::$instance ) {
40 29 self::$instance = new self();
@@ -52,10 +41,9 @@
52 41 } else {
53 42 $this->url = STOCKPACK_URL;
54 43 }
55 44
56 - $this->api_key =
57 - add_action( 'plugins_loaded', array( $this, 'init' ) );
45 + add_action( 'init', array( $this, 'init' ) );
58 46 }
59 47
60 48 /**
61 49 *
@@ -60,12 +48,21 @@
60 48 /**
61 49 *
62 50 */
63 51 public function init() {
52 + $this->admin = \StockpackAdmin::get_instance();
53 + $this->settings = \StockpackSettings::get_instance();
64 54 $this->actions();
55 + $this->filters();
65 56 }
66 57
58 + /**
59 + *
60 + */
61 + public function filters() {
67 62
63 + }
64 +
68 65 /**
69 66 *
70 67 */
71 68 public function actions() {
@@ -74,12 +71,21 @@
74 71 $this,
75 72 'license_cost'
76 73 ) ); // executed when logged in
77 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
78 80 add_action( 'wp_ajax_cache-stockpack', array( $this, 'cache' ) ); // executed when logged in
79 81 add_action( 'wp_ajax_validate-stockpack', array( $this, 'validate' ) ); // executed when logged in
80 82 add_action( 'wp_ajax_terms-stockpack', array( $this, 'terms' ) ); // executed when logged in
81 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 + }
82 88 }
83 89
84 90 public function terms() {
85 91 check_ajax_referer( 'stockpack_terms', 'security' );
@@ -123,13 +129,38 @@
123 129 if ( $response->data->cost == 1 && ! $response->data->cost_message ) {
124 130 $response->data->cost_message = __( 'You will be charged for one image on you provider account', 'stockpack' );
125 131 }
126 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 +
127 137 wp_send_json_success( $response->data, true );
128 138 }
129 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 +
130 161 public function token() {
131 - global $stockpack;
162 + $stockpack = StockPack::get_instance();
132 163 check_ajax_referer( 'stockpack_token', 'security' );
133 164 $token = '';
134 165 if ( isset( $_REQUEST['token'] ) ) {
135 166 $token = sanitize_text_field( $_REQUEST['token'] );
@@ -161,9 +192,9 @@
161 192 if ( isset( $_REQUEST['query'] ) ) {
162 193 $query = array_map( 'sanitize_text_field', wp_unslash( $_REQUEST['query'] ) );
163 194 }
164 195
165 - if ( ! $query['query'] ) {
196 + if ( ! isset( $query['query'] ) ) {
166 197 return wp_send_json_success( array() );
167 198 }
168 199
169 200 $images = $this->images( $query );
@@ -180,8 +211,99 @@
180 211
181 212 wp_send_json_success( $this->format( $images->data ) );
182 213 }
183 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 +
184 306 /**
185 307 *
186 308 */
187 309 public function cache() {
@@ -238,14 +360,17 @@
238 360 $must_license = false;
239 361 if ( isset( $_REQUEST['must_license'] ) ) {
240 362 $must_license = sanitize_text_field( $_REQUEST['must_license'] );
241 363 }
242 -
364 + $new_filename = "";
243 365 if ( isset( $_REQUEST['new_filename'] ) ) {
244 366 $new_filename = sanitize_text_field( $_REQUEST['new_filename'] );
245 367 }
246 - $search = isset( $_REQUEST['search'] ) ? sanitize_title( $_REQUEST['search'] ) : $this->get_domain();
368 + $search = isset( $_REQUEST['search_key'] ) ? sanitize_title( $_REQUEST['search_key'] ) : $this->get_domain();
247 369 $description = isset( $_REQUEST['description'] ) ? sanitize_textarea_field( $_REQUEST['description'] ) : '';
370 +
371 +
372 +
248 373 $image = $this->image( $id, $post_id, $description, $search, $must_license, $provider, $new_filename );
249 374
250 375 if ( is_wp_error( $image ) ) {
251 376 if ( strpos( $image->get_error_code(), 'limit_reached' ) !== false ) {
@@ -259,8 +384,31 @@
259 384
260 385 }
261 386
262 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 +
263 411 /**
264 412 * @param $data
265 413 *
266 414 * @return array
@@ -268,56 +416,104 @@
268 416 private function format( $data ) {
269 417 return $data;
270 418 }
271 419
272 - /**
273 - * @param $image
274 - *
275 - * @return array
276 - */
277 - private function individual( $image ) {
278 - return [
279 - 'id' => $image->id,
280 - 'description' => $image->description,
281 - 'caption' => $image->caption ? $image->caption : '',
282 - 'url' => $image->assets->huge_thumb->url,
283 - 'sizes' => [
284 - 'full' => $this->size( $image, 'huge_thumb' ),
285 - 'medium' => $this->size( $image, 'preview' ),
286 - 'thumbnail' => $this->size( $image, 'large_thumb' )
287 - ]
288 - ];
289 - }
290 420
291 - private function size( $image, $format ) {
292 - return [
293 - 'height' => $image->assets->$format->height,
294 - 'width' => $image->assets->$format->width,
295 - 'orientation' => ( $image->aspect > 1 ? 'landscape' : 'portrait' ),
296 - 'url' => $image->assets->$format->url
297 - ];
298 - }
421 + public function get_license_cost( $media_id, $provider ) {
299 422
300 - private function get_license_cost( $media_id, $provider ) {
301 -
302 - $response = $this->call( 'GET', 'images/license-cost', array(
423 + return $this->call( 'GET', 'images/license-cost', array(
303 424 'id' => $media_id,
304 425 'locale' => get_locale(),
305 426 'provider' => $provider
306 427 ) );
307 428
308 - return $response;
429 + }
309 430
431 + public function get_ai_prices() {
432 + $cached = get_transient( 'stockpack_ai_prices' );
310 433
434 + if ( is_array( $cached ) ) {
435 + return $cached;
436 + }
437 +
438 + return $this->fetch_ai_prices();
311 439 }
312 440
313 - private function image( $media_id, $post_id, $description = '', $search = '', $must_license = 0, $provider = 0, $new_filename = '' ) {
441 + public function get_ai_wallet( $fresh = false ) {
442 + $cached = get_transient( 'stockpack_ai_wallet' );
314 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 +
315 509 $image = $this->call( 'GET', 'images/download',
316 510 array(
317 511 'id' => $media_id,
318 512 'must_license' => $must_license,
319 - 'provider' => $provider
513 + 'provider' => $provider,
514 + 'min_width'=> $big_image_threshold,
515 + 'min_height'=> $big_image_threshold,
320 516 )
321 517 );
322 518
323 519 if ( ! isset( $image->data->download ) ) {
@@ -327,21 +523,17 @@
327 523
328 524 return $this->handle_download_errors( $image->data );
329 525 }
330 526
331 - $filename = $image->data->name;
527 + $filename = $this->getFilename($image, $new_filename, $must_license);
332 528
333 - if ( $new_filename ) {
334 - $filename = $new_filename;
335 - }
336 -
337 529 $caption = $image->data->caption ?: '';
338 - $attachment_id = $this->upload_remote_image_and_attach( $image->data->download, $post_id, $description, $filename, $search, $caption );
530 + $attachment_id = $this->upload_remote_image_and_attach( $image->data->download, $post_id, $description, $filename,$image, $search, $caption );
339 531 if ( is_wp_error( $attachment_id ) ) {
340 532 return $attachment_id;
341 533 }
342 534 if ( ! $attachment_id ) {
343 - return new WP_Error( __( 'upload_failure', 'There has been a problem with the upload. Please try again', 'stockpack' ) );
535 + return new WP_Error( 'upload_failure', __( 'There has been a problem with the upload. Please try again', 'stockpack' ) );
344 536 }
345 537
346 538 update_post_meta( $attachment_id, 'stockpack_id', $media_id );
347 539
@@ -353,8 +545,12 @@
353 545 switch ( $response->code ) {
354 546 case 'token_expired':
355 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' ) );
356 548 }
549 +
550 + if ( ! empty( $response->message ) ) {
551 + return new WP_Error( $response->code, $response->message );
552 + }
357 553 }
358 554
359 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' ) );
360 556 }
@@ -362,10 +558,14 @@
362 558 private function handle_download_errors( $response ) {
363 559 if ( isset( $response->code ) ) {
364 560 switch ( $response->code ) {
365 561 case 'token_expired':
366 - return new WP_Error( 'download_failure', __( 'Please reconnect the account on StockPack, the permissions have expired. Go the providers page on stockpack.co/providers', 'stockpack' ) );
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' ) );
367 563 }
564 +
565 + if ( ! empty( $response->message ) ) {
566 + return new WP_Error( $response->code, $response->message );
567 + }
368 568 }
369 569
370 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' ) );
371 571 }
@@ -373,9 +573,9 @@
373 573 private function handle_search_errors( $response ) {
374 574 if ( isset( $response->code ) ) {
375 575 switch ( $response->code ) {
376 576 case 'token_expired':
377 - return new WP_Error( 'search_failure', __( 'Please reconnect the account on stockpack, the permissions have expired. Go to the providers page on stockpack.co/providers', 'stockpack' ) );
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' ) );
378 578 }
379 579 }
380 580
381 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' ) );
@@ -381,13 +581,9 @@
381 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' ) );
382 582
383 583 }
384 584
385 - private function images( $query = [] ) {
386 585
387 - return $this->call( 'GET', 'images/search', $query );
388 - }
389 -
390 586 /**
391 587 * @param $method
392 588 * @param $path
393 589 * @param array $query
@@ -395,57 +591,126 @@
395 591 * @return mixed|null
396 592 */
397 593 private function call( $method, $path, $query = [] ) {
398 594 /** @var StockPack $stockpack */
399 - global $stockpack;
595 + $stockpack = StockPack::get_instance();
400 596
401 - try {
402 - if ( ! isset( $query['key'] ) ) {
403 - $api_key = $stockpack->admin->get_api_key();
404 - if ( $api_key ) {
405 - $query = array_merge( $query,
406 - [
407 - 'api_token' => $api_key
408 - ]
409 - );
410 - } else {
411 - $path .= '-trial';
412 - }
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';
413 608 }
609 + }
414 610
415 - $query = array_merge( $query,
416 - [
417 - 'referral' => get_bloginfo( 'url' ),
418 - 'safe_search' => $stockpack->admin->get_safe_search(),
419 - 'user_data' => $stockpack->admin->get_license_state(),
420 - ]
421 - );
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 + );
422 618
423 - $response = $this->client()->request( $method, $path,
424 - [
425 - 'query' => $query
426 - ]
427 - );
619 + $url = $this->url . '/' . self::VERSION . '/' . $path;
620 + $is_post = 'post' === strtolower( $method );
428 621
429 - return json_decode( $response->getBody() );
430 - } catch ( GuzzleException $exception ) {
431 - switch ( $exception->getCode() ) {
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 ) {
432 654 case 429: // too many requests
433 - return $this->limit_exceeded( $exception );
434 -
655 + return $this->limit_exceeded( $response );
656 + case 401: // access denied
657 + return $this->invalid_token( $response );
435 658 default:
436 - return new WP_Error( 1, __( 'Can\'t connect to StockPack server.', 'stockpack' ) );
659 + return $this->server_error( $response, $response_code );
437 660 }
438 661 }
662 +
663 + $response_body = wp_remote_retrieve_body( $response );
664 +
665 + return json_decode( $response_body );
439 666 }
440 667
441 - private function limit_exceeded( $exception ) {
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 ) {
442 707 /** @var StockPack $stockpack */
443 - global $stockpack;
708 + $stockpack = StockPack::get_instance();
444 709
445 - $response = $exception->getResponse();
446 - $limit = $response->getHeaderLine( 'x-ratelimit-limit' );
447 - $retry_after = $response->getHeaderLine( 'retry-after' );
710 +
711 + $limit = wp_remote_retrieve_header( $response, 'x-ratelimit-limit' );
712 + $retry_after = wp_remote_retrieve_header( $response, 'retry-after' );
448 713 $retry_after = $this->human_seconds( $retry_after );
449 714 $retry_after = '<span class ="stockpack-timer">' . $retry_after . '</span>';
450 715 if ( $limit > 50 ) {
451 716 return new WP_Error( 'premium_limit_reached', __( 'Request limit reached, the reset will be in ', 'stockpack' ) . $retry_after );
@@ -458,22 +723,10 @@
458 723
459 724 return new WP_Error( 'anonymous_limit_reached', __( 'Request limit reached, the reset will be in ', 'stockpack' ) . $retry_after );
460 725 }
461 726
462 - /**
463 - * @return Client
464 - */
465 - private function client() {
466 -
467 - if ( ! $this->client ) {
468 - $this->client = new Client(
469 - [
470 - 'base_uri' => $this->url . '/' . self::VERSION . '/',
471 - ]
472 - );
473 - }
474 -
475 - return $this->client;
727 + private function invalid_token( $response ) {
728 + return new WP_Error( 'invalid_token', __( 'Request denied. Please check your token!', 'stockpack' ) );
476 729 }
477 730
478 731 private function support_caption_translation( $caption ) {
479 732 if ( ! $caption ) {
@@ -498,38 +751,74 @@
498 751 * @param string $caption
499 752 *
500 753 * @return bool|int|WP_Error
501 754 */
502 - private function upload_remote_image_and_attach( $image_url, $parent_id, $description, $name, $search = '', $caption = '' ) {
755 + private function upload_remote_image_and_attach( $image_url, $parent_id, $description, $name, $image, $search = '', $caption = '' ) {
503 756
504 - $image = $image_url;
505 - $get = wp_remote_get( $image, array( 'timeout' => 30 ) );
757 + $get = wp_remote_get( $image_url, array(
758 + 'timeout' => apply_filters( 'stockpack_download_timeout', 30 )
759 + )
760 + );
506 761 if ( is_wp_error( $get ) ) {
507 762 return new WP_Error( 100, __( 'Image download failed, please try again. Errors:', 'stockpack' ) . PHP_EOL . $get->get_error_message() );
508 763 }
509 764 $type = wp_remote_retrieve_header( $get, 'content-type' );
510 765 if ( ! $type ) {
766 + $type = wp_check_filetype( $name )['type'];
767 + }
768 + if ( ! $type ) {
511 769 return new WP_Error( 100, __( 'Image type couldn\'t be determined', 'stockpack' ) );
512 770 }
513 771 $name = $this->update_extension( $name, $type );
514 772
773 + $name = apply_filters( 'stockpack_attachment_filename', $name, $image );
774 +
515 775 $mirror = wp_upload_bits( $name, '', wp_remote_retrieve_body( $get ) );
516 776 $attachment = array(
517 - 'post_title' => $name,
777 + 'post_title' => $this->strip_extension($name),
518 778 'post_content' => $description,
519 - 'post_excerpt' => $this->support_caption_translation( $caption ),
779 + 'post_excerpt' => apply_filters( 'stockpack_caption', $this->support_caption_translation( $caption ), $image ),
520 780 'post_mime_type' => $type
521 781 );
522 782 $attach_id = wp_insert_attachment( $attachment, $mirror['file'], $parent_id );
523 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 +
524 795 $attach_data = wp_generate_attachment_metadata( $attach_id, $mirror['file'] );
525 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 + }
526 801 update_post_meta( $attach_id, '_wp_attachment_image_alt', $description );
802 + $this->store_attachment_meta($attach_id,$image);
527 803
804 + do_action( 'stockpack_after_attachment_uploaded', $attach_id, $image );
805 +
528 806 return $attach_id;
529 807
530 808 }
531 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 +
532 821 /**
533 822 * @return mixed
534 823 */
535 824 private function get_domain() {
@@ -554,8 +843,43 @@
554 843 return $name[0] . '.' . $name[1];
555 844
556 845 }
557 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 +
558 882 private function mime2ext( $mime ) {
559 883 $mime = str_replace( ';charset=UTF-8', '', $mime );
560 884 $mime_map = [
561 885 'video/3gpp2' => '3g2',
@@ -630,10 +954,10 @@
630 954 'image/jp2' => 'jp2',
631 955 'video/mj2' => 'jp2',
632 956 'image/jpx' => 'jp2',
633 957 'image/jpm' => 'jp2',
634 - 'image/jpeg' => 'jpeg',
635 - 'image/pjpeg' => 'jpeg',
958 + 'image/jpeg' => 'jpg',
959 + 'image/pjpeg' => 'jpg',
636 960 'application/x-javascript' => 'js',
637 961 'application/json' => 'json',
638 962 'text/json' => 'json',
639 963 'application/vnd.google-earth.kml+xml' => 'kml',
@@ -744,8 +1068,10 @@
744 1068 ];
745 1069
746 1070 return isset( $mime_map[ $mime ] ) === true ? $mime_map[ $mime ] : false;
747 1071 }
1072 +
1073 +
748 1074
749 1075 }
750 1076
751 1077 $GLOBALS['stockpack_query'] = StockpackQuery::get_instance();