flickrie 0.7.3 → 1.0.0
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.
- data/.gitignore +1 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +70 -30
- data/Gemfile +5 -4
- data/README.md +55 -53
- data/Rakefile +6 -9
- data/lib/flickrie/api_methods.rb +16 -3
- data/lib/flickrie/client.rb +11 -40
- data/lib/flickrie/instance.rb +0 -1
- data/lib/flickrie/location.rb +21 -18
- data/lib/flickrie/media.rb +5 -21
- data/lib/flickrie/media_count.rb +4 -0
- data/lib/flickrie/middleware.rb +71 -0
- data/lib/flickrie/oauth.rb +58 -49
- data/lib/flickrie/photo.rb +0 -2
- data/lib/flickrie/set.rb +0 -5
- data/lib/flickrie/upload_client.rb +45 -56
- data/lib/flickrie/user.rb +10 -10
- data/lib/flickrie/version.rb +1 -1
- data/lib/flickrie/video.rb +0 -2
- data/spec/files/photo.bla +0 -0
- data/spec/{api_methods_spec.rb → flickrie/api_methods_spec.rb} +14 -14
- data/spec/{error_spec.rb → flickrie/error_spec.rb} +1 -1
- data/spec/{instance_spec.rb → flickrie/instance_spec.rb} +2 -5
- data/spec/{license_spec.rb → flickrie/license_spec.rb} +1 -1
- data/spec/{location_spec.rb → flickrie/location_spec.rb} +12 -1
- data/spec/{media_count_spec.rb → flickrie/media_count_spec.rb} +7 -3
- data/spec/{media_spec.rb → flickrie/media_spec.rb} +25 -26
- data/spec/flickrie/oauth_spec.rb +25 -0
- data/spec/{photo_spec.rb → flickrie/photo_spec.rb} +1 -1
- data/spec/{set_spec.rb → flickrie/set_spec.rb} +2 -2
- data/spec/flickrie/upload_client_spec.rb +40 -0
- data/spec/flickrie/user_spec.rb +58 -0
- data/spec/{video_spec.rb → flickrie/video_spec.rb} +1 -1
- data/spec/spec_helper.rb +16 -13
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/api_methods/asynchronous_upload.yml +60 -95
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/api_methods/replace.yml +16 -16
- data/spec/{fixtures/vcr_cassettes/api_methods/tags.yml → vcr_cassettes/api_methods/tag_manipulation.yml} +24 -24
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/api_methods/upload_and_delete.yml +21 -21
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/error/a_request_was_made_and_failed.yml +9 -9
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/instance/calling_api_methods.yml +32 -32
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/license/get.yml +4 -4
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media/from_contacts.yml +8 -8
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media/from_set.yml +5 -5
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media/from_user.yml +5 -5
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media/get_context.yml +4 -4
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media/get_exif.yml +8 -8
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media/get_info.yml +18 -18
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media/public_from_user.yml +5 -5
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media/search.yml +5 -5
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/media_count/get.yml +8 -8
- data/spec/vcr_cassettes/o_auth/incorrect_credentials.yml +249 -0
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/photo/get_info.yml +6 -6
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/photo/get_sizes.yml +12 -12
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/photo/search.yml +5 -5
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/set/from_user.yml +16 -16
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/set/get_info.yml +32 -32
- data/spec/vcr_cassettes/upload_client/content_type.yml +117 -0
- data/spec/vcr_cassettes/upload_client/invalid_credentials.yml +208 -0
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/user/find_by_username_or_email.yml +8 -8
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/user/get_info.yml +8 -8
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/video/get_info.yml +4 -4
- data/spec/{fixtures/vcr_cassettes → vcr_cassettes}/video/get_sizes.yml +8 -8
- metadata +105 -99
- data/spec/fixtures/vcr_cassettes/api_methods/tag_manipulation.yml +0 -178
- data/spec/fixtures/vcr_cassettes/error/code.yml +0 -84
- data/spec/fixtures/vcr_cassettes/error/was_raised.yml +0 -84
- data/spec/fixtures/vcr_cassettes/o_auth/incorrect_credentials.yml +0 -167
- data/spec/oauth_spec.rb +0 -22
- data/spec/user_spec.rb +0 -53
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,82 +1,122 @@
|
|
1
1
|
# Flickrie changelog
|
2
2
|
|
3
|
+
## Version 1.0.0
|
4
|
+
|
5
|
+
- Changes that are backwards compatible:
|
6
|
+
|
7
|
+
-- Fixed content type not being passed to the file you're uploading
|
8
|
+
if you specified it directly.
|
9
|
+
|
10
|
+
-- The request will now be retried once more if it timeouts
|
11
|
+
|
12
|
+
-- In authentication:
|
13
|
+
--- you can now call `request_token.authorize_url` instead of `request_token.get_authorization_url`.
|
14
|
+
--- you can now call `request_token.get_access_token(code)` instead of `Flickrie::OAuth.get_access_token(code, request_token)`.
|
15
|
+
--- you also get the infomation about the user who just authenticated,
|
16
|
+
which you can then access with `access_token.user_info`
|
17
|
+
(it's a Hash with keys `:fullname`, `:user_nsid` and `:username`)
|
18
|
+
|
19
|
+
-- When calling `Flickrie.get_photos_counts`, the `Flickrie::MediaCount`
|
20
|
+
now also has attributes `#time_interval` (alias for `#date_range`),
|
21
|
+
`#from` and `#to`.
|
22
|
+
|
23
|
+
- Changes that are **not** backwards compatible:
|
24
|
+
|
25
|
+
-- If you're passing in the content type of the file you're uploading,
|
26
|
+
the parameter is now called `:content_type`, not `:mime_type`.
|
27
|
+
|
28
|
+
-- If there is a problem in obtaining the access token, `Flickrie::Error`
|
29
|
+
is now raised, instead of `Flickrie::OAuth::Error`.
|
30
|
+
|
31
|
+
-- When you're calling `request_token.get_authorization_url`, if you want to
|
32
|
+
specifiy permissions, you now have to pass the `:perms` option,
|
33
|
+
instead of `:permissions`. In this way you can pass any parameter,
|
34
|
+
and it will be appended to the URL (in case Flickr adds a new parameter).
|
35
|
+
|
36
|
+
-- When you have a `Flickrie::User` instance, the
|
37
|
+
`Flickrie::User#time_zone` now returns a struct with `#label` and
|
38
|
+
`#offset` attributes (before it returned a `Hash` with those keys).
|
39
|
+
|
40
|
+
-- When you call `Flickrie.get_media_context`, the result is now a
|
41
|
+
struct with attributes `#count`, `#previous`, `#next`.
|
42
|
+
|
3
43
|
## Version 0.7.3
|
4
44
|
|
5
|
-
-
|
6
|
-
it's important)
|
45
|
+
- Covered "flickr.people.getPhotos" (I released it as a patch because
|
46
|
+
it's important).
|
7
47
|
|
8
48
|
## Version 0.7.2
|
9
49
|
|
10
|
-
-
|
50
|
+
- Specified versions of dependencies and Ruby accurately.
|
11
51
|
|
12
52
|
## Version 0.7.1
|
13
53
|
|
14
|
-
-
|
15
|
-
-
|
54
|
+
- Fixed an oauth bug.
|
55
|
+
- Added `#hash` method to photos, sets etc. which you can call to get the
|
16
56
|
raw data (in Ruby hash). This is useful if I accidentally left something out,
|
17
57
|
or if Flickr added something new that I didn't cover yet, that you can
|
18
58
|
still get to the data. `#[]` reads from the same hash.
|
19
59
|
|
20
60
|
## Version 0.7.0
|
21
61
|
|
22
|
-
-
|
23
|
-
-
|
62
|
+
- Covered `flickr.photos.getFavorites` and `flickr.test.login`.
|
63
|
+
- Bug fixes (especially regarding the `Flickr::Instance`).
|
24
64
|
|
25
65
|
## Version 0.6.1
|
26
66
|
|
27
|
-
- `Flickrie::Media::Ticket` is now called just `Flickrie::Ticket
|
67
|
+
- `Flickrie::Media::Ticket` is now called just `Flickrie::Ticket`.
|
28
68
|
|
29
69
|
## Version 0.6.0
|
30
70
|
|
31
|
-
-
|
71
|
+
- You can access the raw response hash with square brackets, if you notice I
|
32
72
|
didn't cover some part of it with methods. So, for example, after calling
|
33
|
-
`Flickrie.get_photo_info`, you can get the photo ID by calling `photo['id']
|
73
|
+
`Flickrie.get_photo_info`, you can get the photo ID by calling `photo['id']`.
|
34
74
|
|
35
|
-
-
|
75
|
+
- When `Flickrie::Error` is raised, you can now access its `#code`
|
36
76
|
attribute. This makes better error handling, because error code
|
37
|
-
is (supposed to be) unique, unlike the error message
|
77
|
+
is (supposed to be) unique, unlike the error message.
|
38
78
|
|
39
79
|
## Version 0.5.2
|
40
80
|
|
41
|
-
-
|
42
|
-
making Faraday >= 0.8 a dependency before)
|
81
|
+
- The gem now also works with Faraday 0.7 (I apologize for not
|
82
|
+
making Faraday >= 0.8 a dependency before).
|
43
83
|
|
44
84
|
## Version 0.5.1
|
45
85
|
|
46
|
-
-
|
86
|
+
- Fixed a documentation error.
|
47
87
|
|
48
88
|
## Version 0.5.0
|
49
89
|
|
50
|
-
-
|
51
|
-
-
|
90
|
+
- Covered `flickr.photos.getCounts`.
|
91
|
+
- Covered `flickr.photos.getExif`.
|
52
92
|
|
53
93
|
## Version 0.4.1
|
54
94
|
|
55
|
-
-
|
95
|
+
- Handle file uploads for Rails and Sinatra smarter (see [this wiki](https://github.com/janko-m/flickrie/wiki/Some-tips.md), tip #7)
|
56
96
|
|
57
97
|
## Version 0.4.0
|
58
98
|
|
59
|
-
-
|
60
|
-
-
|
61
|
-
-
|
62
|
-
-
|
63
|
-
-
|
99
|
+
- Covered `flickr.photos.getContactsPhotos`.
|
100
|
+
- Covered `flickr.photos.getContactsPublicPhotos`.
|
101
|
+
- Covered `flickr.photos.getContext`.
|
102
|
+
- Implemented uploading photos.
|
103
|
+
- Covered `flickr.photos.upload.checkTickets`.
|
64
104
|
|
65
105
|
## Version 0.3.2
|
66
106
|
|
67
|
-
-
|
107
|
+
- Enabled passing params to `Flickrie::Set#photos`.
|
68
108
|
|
69
109
|
## Version 0.3.1
|
70
110
|
|
71
|
-
-
|
72
|
-
certain API calls
|
111
|
+
- Fixed an error when accessing tags from photos fetched through
|
112
|
+
certain API calls.
|
73
113
|
|
74
114
|
## Version 0.3.0
|
75
115
|
|
76
|
-
-
|
77
|
-
-
|
78
|
-
(see [this wiki](https://github.com/janko-m/flickrie/wiki/Authentication-in-web-applications) for an example)
|
116
|
+
- The proper error is now raised on wrong access tokens.
|
117
|
+
- Implemented a better way of using access tokens, using `Flickrie::Instance.new(access_token, access_secret)`
|
118
|
+
(see [this wiki](https://github.com/janko-m/flickrie/wiki/Authentication-in-web-applications) for an example).
|
79
119
|
|
80
120
|
## Version 0.2.2
|
81
121
|
|
82
|
-
-
|
122
|
+
- Removed `addressable` gem as a dependency.
|
data/Gemfile
CHANGED
@@ -6,7 +6,8 @@ group :test do
|
|
6
6
|
gem "faraday", '0.7.6'
|
7
7
|
end
|
8
8
|
|
9
|
-
# You can run `bundle [install] --without
|
10
|
-
|
11
|
-
gem "debugger"
|
12
|
-
gem "pry"
|
9
|
+
# You can run `bundle [install] --without extras` if you don't want to install them
|
10
|
+
group :extras do
|
11
|
+
gem "debugger"
|
12
|
+
gem "pry"
|
13
|
+
end
|
data/README.md
CHANGED
@@ -1,31 +1,38 @@
|
|
1
|
-
# Flickrie
|
1
|
+
# Flickrie [](http://travis-ci.org/janko-m/flickrie)
|
2
2
|
|
3
3
|
## About
|
4
4
|
|
5
|
-
This gem is a nice wrapper for the Flickr API with an
|
6
|
-
|
7
|
-
The reason why I did this gem is because the
|
8
|
-
well maintained, or they
|
9
|
-
the API
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
5
|
+
This gem is a nice wrapper for the Flickr API with an object-oriented interface.
|
6
|
+
|
7
|
+
The reason why I did this gem is because the existing ones either weren't
|
8
|
+
well maintained, or they weren't object oriented and provided a literal
|
9
|
+
wrapper over the API. That didn't statisfy me, because Flickr API
|
10
|
+
sometimes gives you the same information in different ways. And I want
|
11
|
+
to normalize that. Also, JSON responses can return "time" attributes
|
12
|
+
only in the string format. And I thought it would be nice that, if you're
|
13
|
+
accessing the `updated_at` attribute for example, you actually **get**
|
14
|
+
an instance of `Time`, instead of a string, or even integer. These are
|
15
|
+
just some of the reason I decided to make this gem.
|
16
|
+
|
17
|
+
The method names here aren't called the same as Flickr's API methods
|
18
|
+
(and they can't be), but they follow a pattern which
|
19
|
+
shouldn't be too difficult to predict. Take a look at the ["Currently covered API
|
20
|
+
methods"](https://github.com/janko-m/flickrie#currently-covered-api-methods) section of this readme.
|
21
|
+
|
22
|
+
Also, some attribute names that you get from the response are changed.
|
23
|
+
So, for example, the `last_update` attribute is called `updated_at`,
|
24
|
+
and the `candownload` attribute is called `can_download?`. Because this
|
25
|
+
is a **ruby** wrapper, I wanted to write it in Ruby/Rails fashion. At
|
26
|
+
first you might not approve of this, because then you might not know
|
27
|
+
what the methods name are if you know the name of the key in the
|
28
|
+
response hash. But, on the other hand, Flickr often gives you the same
|
29
|
+
information in different formats, so this also acts as a normalizer. The
|
30
|
+
downsize of this approach is that it may not be up to date when the
|
31
|
+
Flickr API changes, but that's why I have **you** to open a new issue
|
32
|
+
when you notice something isn't working :)
|
33
|
+
|
34
|
+
The gem works on Ruby versions `1.9.2` and `1.9.3`. Also, it follows
|
35
|
+
[Semantic versioning](http://semver.org/).
|
29
36
|
|
30
37
|
## Examples of usage
|
31
38
|
|
@@ -35,16 +42,25 @@ You first need to install the gem.
|
|
35
42
|
[sudo] gem install flickrie
|
36
43
|
```
|
37
44
|
|
45
|
+
Then, if you're using Bundler in your project, put it into your `Gemfile`:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
gem "flickrie"
|
49
|
+
```
|
50
|
+
|
38
51
|
Then in your app you set the API key and shared secret (if you don't have them
|
39
52
|
already, you can apply for them [here](http://www.flickr.com/services/apps/create/apply)).
|
40
53
|
|
41
54
|
```ruby
|
42
55
|
require 'flickrie'
|
56
|
+
|
43
57
|
Flickrie.api_key = "API_KEY"
|
44
58
|
Flickrie.shared_secret = "SHARED_SECRET"
|
45
59
|
```
|
46
60
|
|
47
|
-
|
61
|
+
If your in Rails, it's a good idea to put this into an initializer.
|
62
|
+
|
63
|
+
Now you can search for stuff.
|
48
64
|
|
49
65
|
```ruby
|
50
66
|
set_id = 819234
|
@@ -64,7 +80,7 @@ You can also throw in some parameters to `Flickrie.photos_from_set` to get more
|
|
64
80
|
photos = Flickrie.photos_from_set(819234, :extras => 'owner_name,last_update,tags,views')
|
65
81
|
|
66
82
|
photo = photos.first
|
67
|
-
photo.tags
|
83
|
+
photo.tags.join(' ') # => "cave cold forrest"
|
68
84
|
photo.owner.username # => "jsmith"
|
69
85
|
photo.updated_at # => 2012-04-20 23:29:17 +0200
|
70
86
|
photo.views_count # => 24
|
@@ -86,7 +102,7 @@ photo.owner.real_name # => "John Smith"
|
|
86
102
|
photo.location.country.name # => "United States"
|
87
103
|
```
|
88
104
|
|
89
|
-
If you already have an existing photo, you can also get info like this:
|
105
|
+
If you already have an existing photo (providing it holds its ID), you can also get info like this:
|
90
106
|
|
91
107
|
```ruby
|
92
108
|
photo.description # => nil
|
@@ -133,15 +149,17 @@ Flickrie.api_key = "API_KEY"
|
|
133
149
|
Flickrie.shared_secret = "SHARED_SECRET"
|
134
150
|
|
135
151
|
request_token = Flickrie::OAuth.get_request_token
|
136
|
-
url = request_token.
|
152
|
+
url = request_token.authorize_url
|
137
153
|
puts "Visit this url to authenticate: #{url}"
|
138
154
|
|
139
155
|
print "If you agreed, the code was displayed afterwards. Enter it: "
|
140
156
|
code = gets.strip
|
141
|
-
access_token =
|
157
|
+
access_token = request_token.get_access_token(code)
|
158
|
+
puts "You successfully authenticated!"
|
159
|
+
|
142
160
|
Flickrie.access_token = access_token.token
|
143
161
|
Flickrie.access_secret = access_token.secret
|
144
|
-
|
162
|
+
access_token.user_params # => {:fullname => "John Smith", :user_nsid => "67131352@N03", :username => "jsmith"}
|
145
163
|
```
|
146
164
|
|
147
165
|
When getting the authorization url, you can also call
|
@@ -151,8 +169,11 @@ request_token.get_authorization_url(:permissions => "read")
|
|
151
169
|
to ask only for "read" permissions from the user. Available permissions
|
152
170
|
are "read", "write" and "delete".
|
153
171
|
|
154
|
-
If you want to make authentication in your web application, check out my
|
155
|
-
|
172
|
+
If you want to make authentication in your web application, check out my
|
173
|
+
[flickr_auth](https://github.com/janko-m/flickr_auth) gem.
|
174
|
+
Or, if you want to do it manually, check out
|
175
|
+
[this wiki](https://github.com/janko-m/flickrie/wiki/Authentication-in-web-applications)
|
176
|
+
for instructions.
|
156
177
|
|
157
178
|
## Photo upload
|
158
179
|
|
@@ -165,9 +186,7 @@ photo.title # => "A cow"
|
|
165
186
|
For the list of parameters you can pass in when uploading a photo, see
|
166
187
|
[this page](http://www.flickr.com/services/api/upload.api.html).
|
167
188
|
|
168
|
-
|
169
|
-
- Photo uploads require authentication with "write" permissions.
|
170
|
-
- Path to the photo has to be absolute.
|
189
|
+
Note that photo uploads require authentication with "write" permissions.
|
171
190
|
|
172
191
|
See [this wiki](https://github.com/janko-m/flickrie/wiki/Asynchronous-photo-upload) for an example
|
173
192
|
of an asynchronous photo upload.
|
@@ -214,23 +233,6 @@ default.
|
|
214
233
|
Please, feel free to post any issues that you're having, I will be happy
|
215
234
|
to help. I will also be happy if you let me know about any bugs.
|
216
235
|
|
217
|
-
## How to contribute
|
218
|
-
|
219
|
-
Nothing special, you just fork the project, and send me a pull request.
|
220
|
-
Don't forget to cover the change with tests. If you don't know how to
|
221
|
-
write tests, send the pull requests without them, it's ok.
|
222
|
-
|
223
|
-
An important note: if you want to add a line in the tests which makes a **new** HTTP request,
|
224
|
-
you'll have to get your own API key and access token. You can get the
|
225
|
-
API key and secret [here](http://www.flickr.com/services/apps/create/apply)
|
226
|
-
(assuming you already have a Flickr account), and you can then obtain an access token by using my
|
227
|
-
authentication system (described above). You then have to assign these
|
228
|
-
values to the environment variables `FLICKR_API_KEY`, `FLICKR_SHARED_SECRET`,
|
229
|
-
`FLICKR_ACCESS_TOKEN` and `FLICKR_ACCESS_SECRET`. That's it, you should
|
230
|
-
be able to run the tests normally now.
|
231
|
-
|
232
|
-
Feel free to email me if you have any problems.
|
233
|
-
|
234
236
|
## Cedits
|
235
237
|
|
236
238
|
Special thanks to @**mislav**, my brother, he helped me really a lot
|
data/Rakefile
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
3
|
|
4
|
+
task :default => :spec
|
5
|
+
|
4
6
|
desc "Run the specs (use spec:name to run a single spec)"
|
5
7
|
task :spec do |task, args|
|
6
|
-
system "
|
8
|
+
system "rspec -Ispec"
|
7
9
|
end
|
8
10
|
|
9
11
|
Dir["spec/*_spec.rb"].each do |spec|
|
10
12
|
task_name = File.basename(spec)[/.+(?=_spec\.rb)/]
|
11
13
|
task :"spec:#{task_name}" do
|
12
|
-
system "
|
14
|
+
system "rspec -Ispec #{spec}"
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
@@ -25,18 +27,13 @@ task :console do
|
|
25
27
|
end
|
26
28
|
begin
|
27
29
|
require 'pry'
|
28
|
-
system "
|
30
|
+
system "pry --require 'flickrie' --require './credentials'"
|
29
31
|
rescue LoadError
|
30
|
-
system "
|
32
|
+
system "irb -r 'flickrie' -r './credentials'"
|
31
33
|
end
|
32
34
|
FileUtils.remove_file "credentials.rb"
|
33
35
|
end
|
34
36
|
|
35
|
-
task :rdoc do
|
36
|
-
FileUtils.rm_rf "doc"
|
37
|
-
system "rdoc lib/"
|
38
|
-
end
|
39
|
-
|
40
37
|
# copied from Rails
|
41
38
|
begin
|
42
39
|
require 'rails/source_annotation_extractor'
|
data/lib/flickrie/api_methods.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'flickrie/middleware'
|
1
2
|
require 'flickrie/client'
|
2
3
|
require 'flickrie/upload_client'
|
3
4
|
require 'flickrie/oauth'
|
@@ -20,7 +21,6 @@ module Flickrie
|
|
20
21
|
# photo.title # => "Me and Jessica"
|
21
22
|
#
|
22
23
|
# If the <tt>:async => 1</tt> option is passed, returns the ticket ID.
|
23
|
-
#
|
24
24
|
def upload(media, params = {})
|
25
25
|
response = upload_client.upload(media, params)
|
26
26
|
if params[:async] == 1
|
@@ -39,7 +39,6 @@ module Flickrie
|
|
39
39
|
# photo.title # => "Me and Jessica"
|
40
40
|
#
|
41
41
|
# If the <tt>:async => 1</tt> option is passed, returns the ticket ID.
|
42
|
-
#
|
43
42
|
def replace(media, media_id, params = {})
|
44
43
|
response = upload_client.replace(media, media_id, params)
|
45
44
|
if params[:async] == 1
|
@@ -131,6 +130,12 @@ module Flickrie
|
|
131
130
|
select { |media| media.is_a?(Photo) }
|
132
131
|
end
|
133
132
|
|
133
|
+
# ==== Example
|
134
|
+
#
|
135
|
+
# context = Flickrie.get_photo_context(37124234)
|
136
|
+
# context.count # => 23
|
137
|
+
# context.previous # => #<Photo: id=2433240, ...>
|
138
|
+
# context.next # => #<Video: id=1282404, ...>
|
134
139
|
def get_media_context(media_id, params = {})
|
135
140
|
response = client.get_media_context(media_id, params)
|
136
141
|
Media.from_context(response.body)
|
@@ -138,6 +143,7 @@ module Flickrie
|
|
138
143
|
alias get_photo_context get_media_context
|
139
144
|
alias get_video_context get_media_context
|
140
145
|
|
146
|
+
# Returns instances of Flickrie::MediaCount
|
141
147
|
def get_media_counts(params = {})
|
142
148
|
response = client.get_media_counts \
|
143
149
|
MediaCount.ensure_utc(params)
|
@@ -147,19 +153,23 @@ module Flickrie
|
|
147
153
|
alias get_photos_counts get_media_counts
|
148
154
|
alias get_videos_counts get_media_counts
|
149
155
|
|
156
|
+
# See Flickrie::Media#exif for details
|
150
157
|
def get_photo_exif(photo_id, params = {})
|
151
158
|
response = client.get_media_exif(photo_id, params)
|
152
159
|
Photo.from_exif(response.body['photo'])
|
153
160
|
end
|
161
|
+
# See Flickrie::Media#exif for details
|
154
162
|
def get_video_exif(video_id, params = {})
|
155
163
|
response = client.get_media_exif(video_id, params)
|
156
164
|
Video.from_exif(response.body['photo'])
|
157
165
|
end
|
158
166
|
|
167
|
+
# Returns instances of Flickrie::User
|
159
168
|
def get_photo_favorites(photo_id, params = {})
|
160
169
|
response = client.get_media_favorites(photo_id, params)
|
161
170
|
Photo.new(response.body['photo'])
|
162
171
|
end
|
172
|
+
# Returns instances of Flickrie::User
|
163
173
|
def get_video_favorites(video_id, params = {})
|
164
174
|
response = client.get_media_favorites(video_id, params)
|
165
175
|
Video.new(response.body['photo'])
|
@@ -169,14 +179,15 @@ module Flickrie
|
|
169
179
|
response = client.get_media_info(media_id, params)
|
170
180
|
Media.from_info(response.body['photo'])
|
171
181
|
end
|
172
|
-
|
173
182
|
alias get_photo_info get_media_info
|
174
183
|
alias get_video_info get_media_info
|
175
184
|
|
185
|
+
# Returns an instance of Flickrie::Photo
|
176
186
|
def get_photo_sizes(photo_id, params = {})
|
177
187
|
response = client.get_media_sizes(photo_id, params)
|
178
188
|
Photo.from_sizes(response.body['sizes'])
|
179
189
|
end
|
190
|
+
# Returns an instance of Flickrie::Video
|
180
191
|
def get_video_sizes(video_id, params = {})
|
181
192
|
response = client.get_media_sizes(video_id, params)
|
182
193
|
Video.from_sizes(response.body['sizes'])
|
@@ -244,6 +255,8 @@ module Flickrie
|
|
244
255
|
|
245
256
|
#--
|
246
257
|
# test
|
258
|
+
#++
|
259
|
+
# Returns an instance of Flickrie::User
|
247
260
|
def test_login(params = {})
|
248
261
|
response = client.test_login(params)
|
249
262
|
User.from_test(response.body['user'])
|
data/lib/flickrie/client.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
require 'faraday_middleware'
|
2
2
|
|
3
3
|
module Flickrie
|
4
|
-
|
5
|
-
|
6
|
-
:timeout => 6
|
7
|
-
}.freeze
|
4
|
+
OPEN_TIMEOUT = 4
|
5
|
+
TIMEOUT = 6
|
8
6
|
|
9
7
|
class << self
|
10
8
|
def self.attr_accessor_with_client_reset(*attributes) # :nodoc:
|
@@ -25,24 +23,24 @@ module Flickrie
|
|
25
23
|
#
|
26
24
|
# Flickrie.client.get "flickr.photos.licenses.getInfo"
|
27
25
|
# Flickrie.client.post "flickr.photos.licenses.setLicense", :photo_id => 1241497, :license_id => 2
|
28
|
-
#
|
29
26
|
def client
|
30
27
|
@client ||= new_client
|
31
28
|
end
|
32
29
|
|
33
30
|
def new_client(access_token_hash = {}) # :nodoc:
|
34
|
-
Client.new(params) do |
|
35
|
-
|
31
|
+
Client.new(params) do |b|
|
32
|
+
b.use Middleware::Retry
|
33
|
+
b.use FaradayMiddleware::OAuth,
|
36
34
|
:consumer_key => api_key,
|
37
35
|
:consumer_secret => shared_secret,
|
38
36
|
:token => access_token_hash[:token] || access_token,
|
39
37
|
:token_secret => access_token_hash[:secret] || access_secret
|
40
38
|
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
b.use Middleware::StatusCheck
|
40
|
+
b.use FaradayMiddleware::ParseJson
|
41
|
+
b.use Middleware::OAuthCheck
|
44
42
|
|
45
|
-
|
43
|
+
b.adapter :net_http
|
46
44
|
end
|
47
45
|
end
|
48
46
|
|
@@ -57,40 +55,13 @@ module Flickrie
|
|
57
55
|
:api_key => api_key
|
58
56
|
},
|
59
57
|
:request => {
|
60
|
-
:open_timeout => open_timeout ||
|
61
|
-
:timeout => timeout ||
|
58
|
+
:open_timeout => open_timeout || OPEN_TIMEOUT,
|
59
|
+
:timeout => timeout || TIMEOUT
|
62
60
|
}
|
63
61
|
}
|
64
62
|
end
|
65
63
|
end
|
66
64
|
|
67
|
-
class Error < StandardError
|
68
|
-
attr_reader :code
|
69
|
-
|
70
|
-
def initialize(message, code = nil)
|
71
|
-
super(message)
|
72
|
-
@code = code.to_i
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
class StatusCheck < Faraday::Response::Middleware # :nodoc:
|
77
|
-
def on_complete(env)
|
78
|
-
if env[:body]['stat'] != 'ok'
|
79
|
-
raise Error.new(env[:body]['message'], env[:body]['code']),
|
80
|
-
env[:body]['message']
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
class OAuthStatusCheck < Faraday::Response::Middleware # :nodoc:
|
86
|
-
def on_complete(env)
|
87
|
-
if env[:status] != 200
|
88
|
-
message = env[:body][/(?<=oauth_problem=)[^&]+/]
|
89
|
-
raise Error, message.gsub('_', ' ').capitalize
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
65
|
class Client < Faraday::Connection # :nodoc:
|
95
66
|
def get(method, params = {})
|
96
67
|
super() do |req|
|
data/lib/flickrie/instance.rb
CHANGED
data/lib/flickrie/location.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
module Flickrie
|
2
2
|
class Location
|
3
|
-
|
3
|
+
def latitude() @info['latitude'] end
|
4
|
+
def longitude() @info['longitude'] end
|
5
|
+
def accuracy() @info['accuracy'] end
|
6
|
+
def context() Integer(@info['context']) rescue nil end
|
4
7
|
|
5
|
-
def neighbourhood()
|
6
|
-
def locality()
|
7
|
-
def county()
|
8
|
-
def region()
|
9
|
-
def country()
|
8
|
+
def neighbourhood() new_area('neighbourhood') end
|
9
|
+
def locality() new_area('locality') end
|
10
|
+
def county() new_area('county') end
|
11
|
+
def region() new_area('region') end
|
12
|
+
def country() new_area('country') end
|
13
|
+
|
14
|
+
def place_id() @info['place_id'] end
|
15
|
+
def woeid() @info['woeid'] end
|
10
16
|
|
11
17
|
def [](key) @info[key] end
|
12
18
|
def hash() @info end
|
@@ -15,21 +21,18 @@ module Flickrie
|
|
15
21
|
|
16
22
|
def initialize(info = {})
|
17
23
|
raise ArgumentError if info.nil?
|
18
|
-
|
19
24
|
@info = info
|
20
|
-
|
21
|
-
%w[latitude longitude accuracy place_id woeid].each do |attribute|
|
22
|
-
instance_variable_set "@#{attribute}", @info[attribute]
|
23
|
-
end
|
24
|
-
@context = Integer(@info['context']) rescue nil
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
if @info[
|
29
|
-
Struct.new(:name, :place_id, :woeid)
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
def new_area(area_name)
|
28
|
+
if @info[area_name]
|
29
|
+
area_class = Class.new(Struct.new(:name, :place_id, :woeid)) do
|
30
|
+
def to_s
|
31
|
+
name
|
32
|
+
end
|
33
|
+
end
|
34
|
+
info = @info[area_name]
|
35
|
+
area_class.new(info['_content'], info['place_id'], info['woeid'])
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|