flickrie 0.7.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![Build Status](https://secure.travis-ci.org/janko-m/flickrie.png)](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
|