shutterstock-v2 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +27 -0
- data/.rspec +3 -0
- data/.rubocop.yml +6 -0
- data/.travis.yml +6 -0
- data/Dockerfile +17 -0
- data/Gemfile +3 -0
- data/Guardfile +9 -0
- data/README.md +377 -0
- data/Rakefile +19 -0
- data/lib/client/auth.rb +48 -0
- data/lib/client/categories.rb +11 -0
- data/lib/client/category.rb +16 -0
- data/lib/client/client.rb +72 -0
- data/lib/client/collection.rb +151 -0
- data/lib/client/collections.rb +16 -0
- data/lib/client/configuration.rb +20 -0
- data/lib/client/contributor.rb +15 -0
- data/lib/client/driver.rb +38 -0
- data/lib/client/error.rb +20 -0
- data/lib/client/image.rb +139 -0
- data/lib/client/image_assets.rb +56 -0
- data/lib/client/image_size_details.rb +26 -0
- data/lib/client/images.rb +27 -0
- data/lib/client/license.rb +67 -0
- data/lib/client/licenses.rb +23 -0
- data/lib/client/model.rb +15 -0
- data/lib/client/models.rb +11 -0
- data/lib/client/request.rb +41 -0
- data/lib/client/subscription.rb +35 -0
- data/lib/client/subscription_allotment.rb +19 -0
- data/lib/client/subscription_license_format.rb +16 -0
- data/lib/client/subscription_license_formats.rb +12 -0
- data/lib/client/subscription_price.rb +13 -0
- data/lib/client/subscriptions.rb +37 -0
- data/lib/client/thumbnail.rb +17 -0
- data/lib/client/user.rb +68 -0
- data/lib/client/version.rb +3 -0
- data/lib/shutterstock-v2.rb +31 -0
- data/shutterstock-v2.gemspec +30 -0
- data/spec/cassettes/Shutterstock_Auth_get_access_token/returns_hash_with_access_token.yml +86 -0
- data/spec/cassettes/Shutterstock_Auth_get_authorize_url/returns_URL_to_redirect_user_to_passing_redirect_url_an.yml +48 -0
- data/spec/cassettes/Shutterstock_Categories/parses_params_correctly.yml +53 -0
- data/spec/cassettes/Shutterstock_Categories/returns_all_cats_for_an_image.yml +53 -0
- data/spec/cassettes/Shutterstock_Collection/add_image_adds_image_using_Image_new.yml +48 -0
- data/spec/cassettes/Shutterstock_Collection/add_image_adds_image_using_id.yml +48 -0
- data/spec/cassettes/Shutterstock_Collection/add_image_error_raises_error_if_collection_does_not_exist.yml +52 -0
- data/spec/cassettes/Shutterstock_Collection/create_creates_a_collection.yml +52 -0
- data/spec/cassettes/Shutterstock_Collection/destroy_destroys_a_collection.yml +93 -0
- data/spec/cassettes/Shutterstock_Collection/find_adds_an_image.yml +97 -0
- data/spec/cassettes/Shutterstock_Collection/find_converts_list_to_images.yml +101 -0
- data/spec/cassettes/Shutterstock_Collection/find_finds_a_collection_given_an_id.yml +52 -0
- data/spec/cassettes/Shutterstock_Collection/find_raises_error_for_invalid_collection_id.yml +50 -0
- data/spec/cassettes/Shutterstock_Collection/find_removes_an_image.yml +95 -0
- data/spec/cassettes/Shutterstock_Collection/list_returns_all_collections_for_the_current_user.yml +53 -0
- data/spec/cassettes/Shutterstock_Collection/remove_image_removes_image_using_Image_new.yml +46 -0
- data/spec/cassettes/Shutterstock_Collection/remove_image_removes_image_using_id.yml +46 -0
- data/spec/cassettes/Shutterstock_Collection/update_changes_the_name_of_a_collection.yml +97 -0
- data/spec/cassettes/Shutterstock_Collections/returns_all_collections_for_current_user.yml +53 -0
- data/spec/cassettes/Shutterstock_Image/fill_fills_all_details_of_current_image.yml +109 -0
- data/spec/cassettes/Shutterstock_Image/fills_all_details_of_current_image.yml +109 -0
- data/spec/cassettes/Shutterstock_Image/find_places_image_data_into_correct_fields.yml +56 -0
- data/spec/cassettes/Shutterstock_Image/find_places_more_image_data_into_correct_fields.yml +53 -0
- data/spec/cassettes/Shutterstock_Image/find_returns_an_Image_object.yml +56 -0
- data/spec/cassettes/Shutterstock_Image/finds_similar_images_given_an_image.yml +125 -0
- data/spec/cassettes/Shutterstock_Image/returns_an_Image_object.yml +56 -0
- data/spec/cassettes/Shutterstock_Image/returns_similar_images.yml +72 -0
- data/spec/cassettes/Shutterstock_Image/search_searches_for_images_based_on_searchterm.yml +73 -0
- data/spec/cassettes/Shutterstock_Image/search_searches_using_more_than_one_parameter.yml +77 -0
- data/spec/cassettes/Shutterstock_Image/searches_for_images_based_on_searchterm.yml +73 -0
- data/spec/cassettes/Shutterstock_Image/searches_using_more_than_one_parameter.yml +77 -0
- data/spec/cassettes/Shutterstock_Image/similar_finds_similar_images_given_an_image.yml +125 -0
- data/spec/cassettes/Shutterstock_Image/similar_returns_similar_images.yml +72 -0
- data/spec/cassettes/Shutterstock_ImageAssets/find_calculates_fields_correctly.yml +53 -0
- data/spec/cassettes/Shutterstock_ImageAssets/find_places_image_data_into_correct_fields.yml +53 -0
- data/spec/cassettes/Shutterstock_Images/fill_fills_details_of_all_images_in_list_all_images_now_have_keywords.yml +1144 -0
- data/spec/cassettes/Shutterstock_Images/returns_similar_images.yml +126 -0
- data/spec/cassettes/Shutterstock_License/license_editorial_acknowledgement_returns_error_if_requesting_an_image.yml +53 -0
- data/spec/cassettes/Shutterstock_License/license_editorial_acknowledgement_returns_licenced_image_if_ed_ack_is_.yml +52 -0
- data/spec/cassettes/Shutterstock_License/license_license_from_image_object_sends_editorial_acknowledgement_when.yml +160 -0
- data/spec/cassettes/Shutterstock_License/license_license_from_image_object_using_found_subscription.yml +108 -0
- data/spec/cassettes/Shutterstock_License/license_license_from_image_object_vector_image.yml +108 -0
- data/spec/cassettes/Shutterstock_License/license_multiple_licenses_multiple_images.yml +52 -0
- data/spec/cassettes/Shutterstock_License/license_multiple_licenses_multiple_images_from_Image_new.yml +52 -0
- data/spec/cassettes/Shutterstock_License/license_multiple_returns_error_in_Licenses_when_incorrect_image_used.yml +53 -0
- data/spec/cassettes/Shutterstock_License/license_single_licencing_same_image_twice_does_not_give_error.yml +101 -0
- data/spec/cassettes/Shutterstock_License/license_single_license_fails_when_subscription_doesn_t_allow.yml +49 -0
- data/spec/cassettes/Shutterstock_License/license_single_licenses_single_image.yml +52 -0
- data/spec/cassettes/Shutterstock_License/license_single_licenses_single_image_from_Image_new.yml +52 -0
- data/spec/cassettes/Shutterstock_License/license_single_licenses_single_image_from_hash.yml +52 -0
- data/spec/cassettes/Shutterstock_License/license_single_licenses_single_image_with_smaller_size.yml +52 -0
- data/spec/cassettes/Shutterstock_License/license_single_licenses_vector_image.yml +52 -0
- data/spec/cassettes/Shutterstock_License/license_single_licensing_same_image_twice_does_not_give_error.yml +101 -0
- data/spec/cassettes/Shutterstock_License/license_single_returns_error_when_incorrect_image_used.yml +103 -0
- data/spec/cassettes/Shutterstock_License/license_single_returns_error_when_incorrect_subscription_used.yml +53 -0
- data/spec/cassettes/Shutterstock_Models/parses_params_correctly.yml +53 -0
- data/spec/cassettes/Shutterstock_Models/returns_all_models_for_an_image.yml +53 -0
- data/spec/cassettes/Shutterstock_Subscription/allows_image_size_download_correctly_finds_if_image_size_is_possi.yml +59 -0
- data/spec/cassettes/Shutterstock_Subscription/new_parses_info_on_user_correctly.yml +59 -0
- data/spec/cassettes/Shutterstock_Subscription/new_returns_a_subscription_for_current_user.yml +59 -0
- data/spec/cassettes/Shutterstock_SubscriptionLicenseFormat/new_parses_info_correctly.yml +59 -0
- data/spec/cassettes/Shutterstock_SubscriptionLicenseFormat/new_returns_a_subscription_license_format_for_curren.yml +59 -0
- data/spec/cassettes/Shutterstock_Subscriptions/subscriptions_active_expired_total_subscriptions.yml +59 -0
- data/spec/cassettes/Shutterstock_Subscriptions/subscriptions_active_returns_only_active_subscriptions.yml +59 -0
- data/spec/cassettes/Shutterstock_Subscriptions/subscriptions_downloads_left_only_subscriptions_with_downloads_l.yml +59 -0
- data/spec/cassettes/Shutterstock_Subscriptions/subscriptions_expired_returns_only_expired_subscriptions.yml +59 -0
- data/spec/cassettes/Shutterstock_Subscriptions/subscriptions_find_subscription_for_image_size_finds_subs_to_use.yml +59 -0
- data/spec/cassettes/Shutterstock_Subscriptions/subscriptions_returns_all_subscriptions_for_current_user.yml +59 -0
- data/spec/cassettes/Shutterstock_User/find_parses_info_on_user_correctly.yml +52 -0
- data/spec/cassettes/Shutterstock_User/find_returns_object_for_current_user.yml +52 -0
- data/spec/client/auth_spec.rb +36 -0
- data/spec/client/categories_spec.rb +26 -0
- data/spec/client/category_spec.rb +16 -0
- data/spec/client/client_spec.rb +32 -0
- data/spec/client/collection_spec.rb +159 -0
- data/spec/client/collections_spec.rb +18 -0
- data/spec/client/configuration_spec.rb +10 -0
- data/spec/client/contributor_spec.rb +14 -0
- data/spec/client/driver_spec.rb +20 -0
- data/spec/client/image_assets_spec.rb +51 -0
- data/spec/client/image_size_details_spec.rb +33 -0
- data/spec/client/image_spec.rb +102 -0
- data/spec/client/images_spec.rb +31 -0
- data/spec/client/license_spec.rb +234 -0
- data/spec/client/model_spec.rb +14 -0
- data/spec/client/models_spec.rb +23 -0
- data/spec/client/request_spec.rb +79 -0
- data/spec/client/subscription_allotment_spec.rb +25 -0
- data/spec/client/subscription_license_format_spec.rb +29 -0
- data/spec/client/subscription_price_spec.rb +17 -0
- data/spec/client/subscription_spec.rb +60 -0
- data/spec/client/subscriptions_spec.rb +54 -0
- data/spec/client/thumbnail_spec.rb +21 -0
- data/spec/client/user_spec.rb +37 -0
- data/spec/spec_helper.rb +88 -0
- metadata +467 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: e4872bf6fbbe740553693206c9deed1348c5c7eb
|
|
4
|
+
data.tar.gz: c8f43a8f5a5c1bb05fe20c6f724be8ad81a7428f
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: ba33e6cc67b0b3929c6e57d527be97d485a965d7a7617162e7099431066719d3fad7dbad736ae18f411845eb4669a5d28467a80c3c1329469da7919281e13ae8
|
|
7
|
+
data.tar.gz: d38bc5675ca6223227f98685efe12cfb17366f26037e1aceecb5d2ed78c4a74563d4a20b72666127ac9c91ec5e8bc7f198228cd29ffccb4799d9d91d66029b7c
|
data/.gitignore
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
*.gem
|
|
2
|
+
*.rbc
|
|
3
|
+
.bundle
|
|
4
|
+
.config
|
|
5
|
+
coverage
|
|
6
|
+
InstalledFiles
|
|
7
|
+
lib/bundler/man
|
|
8
|
+
pkg
|
|
9
|
+
rdoc
|
|
10
|
+
spec/reports
|
|
11
|
+
test/tmp
|
|
12
|
+
test/version_tmp
|
|
13
|
+
tmp
|
|
14
|
+
|
|
15
|
+
Gemfile.lock
|
|
16
|
+
|
|
17
|
+
# YARD artifacts
|
|
18
|
+
.yardoc
|
|
19
|
+
_yardoc
|
|
20
|
+
doc/
|
|
21
|
+
vendor
|
|
22
|
+
*.swp
|
|
23
|
+
*.swo
|
|
24
|
+
|
|
25
|
+
.env
|
|
26
|
+
auth_sequence.txt
|
|
27
|
+
run-docker.sh
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
data/Dockerfile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
FROM ruby:2.4
|
|
2
|
+
MAINTAINER dp@vivitec.com.au
|
|
3
|
+
|
|
4
|
+
RUN apt-get update && apt-get install -y \
|
|
5
|
+
build-essential
|
|
6
|
+
|
|
7
|
+
RUN mkdir -p /app
|
|
8
|
+
WORKDIR /app
|
|
9
|
+
|
|
10
|
+
RUN mkdir -p /app/lib/client
|
|
11
|
+
COPY Gemfile Gemfile.lock shutterstock.gemspec ./
|
|
12
|
+
COPY lib/client/version.rb ./lib/client
|
|
13
|
+
RUN gem install bundler && bundle install --jobs 20 --retry 5
|
|
14
|
+
|
|
15
|
+
ENV RAKE_ENV development
|
|
16
|
+
|
|
17
|
+
CMD ["bundle", "exec", "rake", "test"]
|
data/Gemfile
ADDED
data/Guardfile
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# A sample Guardfile
|
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
|
3
|
+
|
|
4
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
|
8
|
+
end
|
|
9
|
+
|
data/README.md
ADDED
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
|
|
3
|
+
This client provides an easy way to interact with [version 2 of the Shutterstock, Inc. API](http://api.shutterstock.com) which gives you access to millions of photos, illustrations and footage clips. You will need a [Client ID and Client Secret from Shutterstock](https://developers.shutterstock.com/applications) to use this client.
|
|
4
|
+
|
|
5
|
+
The API operations are done within the context of a specific user/account. Below are some examples of how to use the API client.
|
|
6
|
+
|
|
7
|
+
**Currently, this API only supports Images, not videos or music.**
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Add this line to your application's Gemfile:
|
|
12
|
+
|
|
13
|
+
gem 'shutterstock-v2'
|
|
14
|
+
|
|
15
|
+
And then execute:
|
|
16
|
+
|
|
17
|
+
$ bundle
|
|
18
|
+
|
|
19
|
+
Or install it yourself as:
|
|
20
|
+
|
|
21
|
+
$ gem install shutterstock-v2
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
First, see the Authentication section to generate a client_id, client_secret and access_token
|
|
26
|
+
|
|
27
|
+
```ruby
|
|
28
|
+
require 'shutterstock-v2'
|
|
29
|
+
|
|
30
|
+
Shutterstock::Client.instance.configure do |config|
|
|
31
|
+
config.client_id = "xxx"
|
|
32
|
+
config.client_secret = "xxx"
|
|
33
|
+
config.access_token = "xxx"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
images = Shutterstock::Image.search("blue rose")
|
|
37
|
+
images.total_count
|
|
38
|
+
# => 170416
|
|
39
|
+
images.count # Only returns first page of results
|
|
40
|
+
# => 20
|
|
41
|
+
|
|
42
|
+
image = images.first
|
|
43
|
+
image.id
|
|
44
|
+
# => 353732165
|
|
45
|
+
image.description
|
|
46
|
+
# => "close-up blue rose isolated on white background macro"
|
|
47
|
+
|
|
48
|
+
# License image for download, finding appropriate license from user's subscriptions
|
|
49
|
+
license = image.license
|
|
50
|
+
|
|
51
|
+
if !license.error
|
|
52
|
+
`wget #{license.url}`
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Create a collection
|
|
56
|
+
collection = Shutterstock::Collection.create("blue rose")
|
|
57
|
+
# Add first page of results from our search to the collection
|
|
58
|
+
collection.add_image(images)
|
|
59
|
+
# Delete the collection
|
|
60
|
+
collection.destroy
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
## Configuration
|
|
66
|
+
|
|
67
|
+
Configuration is through a call to the `Shutterstock::Client` singleton. All subsequent calls will use these configuration options.
|
|
68
|
+
|
|
69
|
+
You can receive a [Client ID and Client Secret from Shutterstock](https://developers.shutterstock.com/applications). A non-expiring access_token can be generated through API calls. See the Authentication section below.
|
|
70
|
+
|
|
71
|
+
```ruby
|
|
72
|
+
require 'shutterstock-v2'
|
|
73
|
+
|
|
74
|
+
Shutterstock::Client.instance.configure do |config|
|
|
75
|
+
config.client_id = "xxx"
|
|
76
|
+
config.client_secret = "xxx"
|
|
77
|
+
config.access_token = "xxx"
|
|
78
|
+
end
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# Image
|
|
83
|
+
|
|
84
|
+
```ruby
|
|
85
|
+
image = Shutterstock::Image.find(118139110)
|
|
86
|
+
# => #<Shutterstock::Image>
|
|
87
|
+
image.assets
|
|
88
|
+
# => #<Shutterstock::ImageAssets>
|
|
89
|
+
image.assets.preview.url
|
|
90
|
+
# => "https://image.shutterstock.com/display_pic_with_logo/1306729/118139110/stock-photo-adorable-labrador-puppy-playing-with-a-chew-toy-on-white-backdrop-118139110.jpg
|
|
91
|
+
image.assets.huge.height
|
|
92
|
+
# => 3090
|
|
93
|
+
|
|
94
|
+
image.keywords
|
|
95
|
+
# => ["animal", "animal themes", "backgrounds", "cute", "dog", ...]
|
|
96
|
+
|
|
97
|
+
image.description
|
|
98
|
+
# => "Adorable Labrador Puppy Playing with a Chew Toy on White Backdrop"
|
|
99
|
+
|
|
100
|
+
image.adult?
|
|
101
|
+
# => false
|
|
102
|
+
|
|
103
|
+
# Requires editorial consent before licenseing
|
|
104
|
+
image.editorial?
|
|
105
|
+
# => false
|
|
106
|
+
|
|
107
|
+
image.similar
|
|
108
|
+
# => #<Shutterstock::Images>, an array of #<Shutterstock::Image>
|
|
109
|
+
# Currently only returns first page of results
|
|
110
|
+
|
|
111
|
+
image.similar.total_count # total count of similar images
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Retrieving all image data
|
|
115
|
+
|
|
116
|
+
Some queries don't return full image data. Use `fill` to retrieve all data for a `Shutterstock::Image`
|
|
117
|
+
|
|
118
|
+
```ruby
|
|
119
|
+
# collection.items only returns image id's
|
|
120
|
+
first_collection_of_user = Shutterstock::Collection.list.first
|
|
121
|
+
image = first_collection_of_user.items.first
|
|
122
|
+
|
|
123
|
+
# Description isn't downloaded by default
|
|
124
|
+
image.description
|
|
125
|
+
# => nil
|
|
126
|
+
|
|
127
|
+
image.fill
|
|
128
|
+
|
|
129
|
+
image.description
|
|
130
|
+
# => "Rose Garden"
|
|
131
|
+
image.assets.preview.url
|
|
132
|
+
# => "http://...."
|
|
133
|
+
|
|
134
|
+
# .fill returns self, to help with chaining
|
|
135
|
+
image.fill.description
|
|
136
|
+
|
|
137
|
+
# .fill can also be used on a image list
|
|
138
|
+
images = Shutterstock::Collection.list.fill
|
|
139
|
+
images.first.description
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Searching for Images
|
|
143
|
+
|
|
144
|
+
```ruby
|
|
145
|
+
purple_cats = Shutterstock::Image.search("purple cat")
|
|
146
|
+
purple_cats.first.id
|
|
147
|
+
# => 431931730
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Shutterstock has a strong searching capability. Pass a hash to utilize [all search parameters available](https://developers.shutterstock.com/api/v2/images/search).
|
|
151
|
+
|
|
152
|
+
```ruby
|
|
153
|
+
# one older japanese male teenager with a garden with a model release in landscape format
|
|
154
|
+
images = Shutterstock::Image.search({
|
|
155
|
+
query: 'garden',
|
|
156
|
+
people_number: 1,
|
|
157
|
+
people_ethnicity: 'japanese',
|
|
158
|
+
people_gender: 'male',
|
|
159
|
+
people_age: 'teenagers',
|
|
160
|
+
people_model_released: true,
|
|
161
|
+
orientation: 'horizontal'})
|
|
162
|
+
|
|
163
|
+
images.first.assets.preview.url
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+

|
|
167
|
+
|
|
168
|
+
## Image Licencing
|
|
169
|
+
|
|
170
|
+
To license an image for use, call `license` on a `Shutterstock::Image`. You'll receive a `Shutterstock::License` object back with any errors, the allotment from your plan, and the download url. `license` will find a valid subscription for the image size, and use that to purchase the image. Optionally specify the size (small, medium, huge, vector) and format (jpg, eps).
|
|
171
|
+
|
|
172
|
+
If an image requires editorial approval, `license` requests it.
|
|
173
|
+
|
|
174
|
+
```ruby
|
|
175
|
+
licensed = Image.find(553180399).license
|
|
176
|
+
licensed.allotment_charge # 1 if not previously licensed, otherwise 0
|
|
177
|
+
licensed.url
|
|
178
|
+
# => "https://download.shutterstock.com/gatekeeper/abc/original.jpg"
|
|
179
|
+
|
|
180
|
+
# License the smallest asset of the image. Supports: small, medium, huge, vector. Default: huge.
|
|
181
|
+
licensed = Image.find(553180399).license(size: 'small')
|
|
182
|
+
|
|
183
|
+
# License the vector image
|
|
184
|
+
licensed = Image.find(553956103).license(size: 'vector', format: 'eps')
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
You can choose a specific subscription, or license multiple images through `Shutterstock::License`. See Subscriptions below.
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
# Collections
|
|
191
|
+
|
|
192
|
+
```ruby
|
|
193
|
+
collection = Shutterstock::Collection.find(21722255) # get a collection
|
|
194
|
+
collection.items # array of Shutterstock::Images
|
|
195
|
+
|
|
196
|
+
# metadata
|
|
197
|
+
collection.name # name of collection
|
|
198
|
+
collection.cover_item # Shutterstock::Image of cover image
|
|
199
|
+
|
|
200
|
+
## Create Collection
|
|
201
|
+
new_collection = Shutterstock::Collection.create("mynewcollection")
|
|
202
|
+
|
|
203
|
+
## Update Collection
|
|
204
|
+
new_collection.update(name: "updatename")
|
|
205
|
+
|
|
206
|
+
## Destroy Collection
|
|
207
|
+
new_collection.destroy
|
|
208
|
+
|
|
209
|
+
## Add Image to Collection
|
|
210
|
+
collection.add_image(987654321)
|
|
211
|
+
# or use any Shutterstock::Image object
|
|
212
|
+
collection.add_image(Image.find(12345))
|
|
213
|
+
# Can add multiple images
|
|
214
|
+
collection.add_image([1234, 2345, 3456])
|
|
215
|
+
|
|
216
|
+
## Remove image from Collection
|
|
217
|
+
collection.remove_image(987654321)
|
|
218
|
+
|
|
219
|
+
## Show all collections for current user (linked to access_token)
|
|
220
|
+
result = Shutterstock::Collection.list
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
If you don't have a `Shutterstock::Collection` object handy, call the class with a collection ID
|
|
225
|
+
|
|
226
|
+
```ruby
|
|
227
|
+
new_collection = Shutterstock::Collection.create("mynewcollection")
|
|
228
|
+
collection_id = new_collection.id
|
|
229
|
+
Shutterstock::Collection.update(id: collection_id, name: "updatename")
|
|
230
|
+
Shutterstock::Collection.destroy(id: collection_id)
|
|
231
|
+
Shutterstock::Collection.add_image(id: collection_id, image_id: 987654321)
|
|
232
|
+
Shutterstock::Collection.remove_image({id: collection_id, image_id: 987654321})
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
# Subscriptions
|
|
236
|
+
|
|
237
|
+
```ruby
|
|
238
|
+
# Find active (not expired) subscriptions for current user
|
|
239
|
+
subscriptions = Shutterstock::User.subscriptions.active
|
|
240
|
+
sub = subscriptions.first
|
|
241
|
+
|
|
242
|
+
sub.description
|
|
243
|
+
# => "Monthly Subscription"
|
|
244
|
+
sub.allotment.downloads_limit
|
|
245
|
+
# => 350
|
|
246
|
+
sub.allotment.downloads_left
|
|
247
|
+
# => 314
|
|
248
|
+
sub.has_downloads_left?
|
|
249
|
+
# => true
|
|
250
|
+
|
|
251
|
+
# Find a subscription for a specific image size
|
|
252
|
+
# Searches active subscriptions with downloads left
|
|
253
|
+
sub_id = Shutterstock::User.subscriptions.find_subscription_for_image_size('small').id
|
|
254
|
+
# => "s9999999"
|
|
255
|
+
|
|
256
|
+
# Images can be licensed using a subscription id
|
|
257
|
+
Shutterstock::License.license(subscription_id: sub_id, image_id: 1234)
|
|
258
|
+
Shutterstock::License.license(subscription_id: sub_id, image_id: Shutterstock::Image.find(1234))
|
|
259
|
+
|
|
260
|
+
# Optionally choose the size, format, or acknowledge the image will be used for editorial purposes
|
|
261
|
+
Shutterstock::License.license(subscription_id: sub_id, image_id: 1234, format: 'jpg', size: 'huge', editorial_acknowledgement: true)
|
|
262
|
+
|
|
263
|
+
# To specify metadata with the license request, use a hash
|
|
264
|
+
license_request = { image_id: 1234, metadata: { job: "job1", purchase_order: 'purchase order 1'}}
|
|
265
|
+
Shutterstock::License.license(subscription_id: sub_id, image_id: license_request)
|
|
266
|
+
|
|
267
|
+
# License multiple images by sending an array of image_ids, Shutterstock::Image objects, or hashes to license_multiple
|
|
268
|
+
licenses = Shutterstock::License.license_multiple(subscription_id: sub_id, image_id: [1234, 2345, 3456])
|
|
269
|
+
if !licenses.errors
|
|
270
|
+
`wget #{licenses.first.url}`
|
|
271
|
+
end
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
# Authentication
|
|
276
|
+
|
|
277
|
+
To use this library, first [register an application at Shutterstock](https://developers.shutterstock.com/applications).
|
|
278
|
+
|
|
279
|
+
An access_token is needed. If your integration uses only one user account, you can follow the [single user integration](https://developers.shutterstock.com/guides/authentication#single-user-integration) directions to find the access_token.
|
|
280
|
+
|
|
281
|
+
Specify a `scope` to limit the queries that can be run by this token.
|
|
282
|
+
|
|
283
|
+
## Manually retrieve an access_token
|
|
284
|
+
|
|
285
|
+
```ruby
|
|
286
|
+
require 'shutterstock-v2'
|
|
287
|
+
|
|
288
|
+
puts "Retrieves access_token from Shutterstock API"
|
|
289
|
+
puts "First, create an application from this page:"
|
|
290
|
+
puts "https://developers.shutterstock.com/applications"
|
|
291
|
+
puts
|
|
292
|
+
puts "Enter Client ID"
|
|
293
|
+
client_id = gets.strip
|
|
294
|
+
puts
|
|
295
|
+
puts "Enter Client Secret"
|
|
296
|
+
client_secret = gets.strip
|
|
297
|
+
|
|
298
|
+
# Create configuration
|
|
299
|
+
Shutterstock::Client.instance.configure do |config|
|
|
300
|
+
config.client_id = client_id
|
|
301
|
+
config.client_secret = client_secret
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
puts "Requesting auth from Shutterstock..."
|
|
305
|
+
url = Shutterstock::Auth.get_authorize_url(redirect_uri: 'http://localhost',
|
|
306
|
+
state: 'my_state',
|
|
307
|
+
scope: 'licenses.create licenses.view purchases.view collections.view collections.edit')
|
|
308
|
+
|
|
309
|
+
puts
|
|
310
|
+
puts "Open this url in your process to complete the authication process :"
|
|
311
|
+
puts url
|
|
312
|
+
puts
|
|
313
|
+
puts "Authorize with your Shutterstock username/password."
|
|
314
|
+
puts
|
|
315
|
+
puts "You will be redirected to a localhost URL. Find the code= parameter in the URI"
|
|
316
|
+
puts "For example: http://localhost/?code=Dc4nSMazdKkFtk7AyBkSG3&state=my_state"
|
|
317
|
+
puts "Code is Dc4nSMazdKkFtk7AyBkSG3"
|
|
318
|
+
puts
|
|
319
|
+
puts "Enter the code= parameter here:"
|
|
320
|
+
code = gets.strip
|
|
321
|
+
|
|
322
|
+
begin
|
|
323
|
+
result = Shutterstock::Auth.get_access_token(code: code)
|
|
324
|
+
puts "You are now authenticated."
|
|
325
|
+
puts
|
|
326
|
+
puts "access_token is : #{result["access_token"]}"
|
|
327
|
+
puts "Use this in the config section:"
|
|
328
|
+
|
|
329
|
+
puts "Shutterstock::Client.instance.configure do |config|"
|
|
330
|
+
puts " config.client_id = '#{client_id}'"
|
|
331
|
+
puts " config.client_secret = '#{client_secret}'"
|
|
332
|
+
puts " config.access_token = '#{result["access_token"]}'"
|
|
333
|
+
puts "end"
|
|
334
|
+
puts
|
|
335
|
+
rescue Shutterstock::FailedResponse => e
|
|
336
|
+
puts "Authentication failed : #{e.msg}"
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
# Tests
|
|
343
|
+
|
|
344
|
+
To run the tests using mocked responses, use
|
|
345
|
+
```ruby
|
|
346
|
+
rspec
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
To run the tests using making real API requests, use
|
|
350
|
+
```ruby
|
|
351
|
+
VCR_OFF=1 SSTK_CLIENT_ID=<clientid> SSTK_CLIENT_SECRET=<secret> SSTK_ACCESS_TOKEN=<token> rspec
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
Note: some tests will fail because they rely on new IDs supplied when the mocks were created.
|
|
355
|
+
|
|
356
|
+
When adding new test, uncomment options[:record] = :new_episodes line in `spec/spec-helper.rb`. And delete existing yml file
|
|
357
|
+
|
|
358
|
+
## Automation
|
|
359
|
+
|
|
360
|
+
If you would like to automatically run tests when files are chaged, run `bundle exec guard`.
|
|
361
|
+
This will monitor `lib` and `spec` and will run the appropriate tests. After a test runs, hit `ENTER` to re-run all tests.
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
# Based on v1 code
|
|
365
|
+
|
|
366
|
+
The structure of this API code was based on the [Shutterstock API Version 1](https://github.com/shutterstock/ruby-shutterstock-api).
|
|
367
|
+
|
|
368
|
+
Major changes:
|
|
369
|
+
- Using version 2 of the Shutterstock API
|
|
370
|
+
- switched to Faraday for http requests
|
|
371
|
+
- used rspec 3 expect format
|
|
372
|
+
- added objects to support Image class
|
|
373
|
+
- added subscriptions and purchasing
|
|
374
|
+
|
|
375
|
+
Limitations:
|
|
376
|
+
|
|
377
|
+
- Currently limited to first page of results
|