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/lib/flickrie/media.rb
CHANGED
@@ -24,28 +24,22 @@ module Flickrie
|
|
24
24
|
# photo.exif.get('X-Resolution', :data => 'raw') # => '180'
|
25
25
|
# photo.exif.get('X-Resolution', :data => 'clean') # => '180 dpi'
|
26
26
|
# photo.exif.get('X-Resolution') # => '180 dpi'
|
27
|
-
#
|
28
27
|
def exif() Exif.new(@info['exif']) rescue nil end
|
29
28
|
|
30
29
|
def views_count() Integer(@info['views']) rescue nil end
|
31
30
|
def comments_count() Integer(@info['comments_count']) rescue nil end
|
32
31
|
|
33
32
|
# Returns an instance of Flickrie::Location
|
34
|
-
#
|
35
33
|
def location() Location.new(@info['location']) rescue nil end
|
36
34
|
# Returns an instance of Flickrie::Media::Visibility
|
37
|
-
#
|
38
35
|
def geo_permissions() Visibility.new(@info['geoperms']) rescue nil end
|
39
36
|
|
40
37
|
# Returns an array of Flickrie::Media::Tag
|
41
|
-
#
|
42
38
|
def tags() @info['tags'].map { |info| Tag.new(info) } rescue nil end
|
43
39
|
# Returns an array of Flickrie::Media::Tag
|
44
|
-
#
|
45
40
|
def machine_tags() tags.select { |tag| tag.machine_tag? } rescue nil end
|
46
41
|
|
47
42
|
# Returns an instance of Flickrie::License
|
48
|
-
#
|
49
43
|
def license() License.new(@info['license']) rescue nil end
|
50
44
|
|
51
45
|
def posted_at() Time.at(Integer(@info['dates']['posted'])) rescue nil end
|
@@ -55,7 +49,6 @@ module Flickrie
|
|
55
49
|
def taken_at_granularity() Integer(@info['dates']['takengranularity']) rescue nil end
|
56
50
|
|
57
51
|
# Returns an instance of Flickrie::User
|
58
|
-
#
|
59
52
|
def owner() User.new(@info['owner']) rescue nil end
|
60
53
|
|
61
54
|
def safety_level() Integer(@info['safety_level']) rescue nil end
|
@@ -75,7 +68,6 @@ module Flickrie
|
|
75
68
|
end
|
76
69
|
|
77
70
|
# Returns an instance of Flickrie::Media::Visibility
|
78
|
-
#
|
79
71
|
def visibility() Visibility.new(@info['visibility']) rescue nil end
|
80
72
|
|
81
73
|
def primary?() Integer(@info['isprimary']) == 1 rescue nil end
|
@@ -98,11 +90,9 @@ module Flickrie
|
|
98
90
|
def faved?() Integer(@info['is_faved']) == 1 rescue nil end
|
99
91
|
|
100
92
|
# Returns an array of Flickrie::Media::Note
|
101
|
-
#
|
102
93
|
def notes() @info['notes']['note'].map { |hash| Note.new(hash) } rescue nil end
|
103
94
|
|
104
95
|
# Returns an array of Flickrie::User
|
105
|
-
#
|
106
96
|
def favorites() @info['person'].map { |info| User.new(info) } rescue nil end
|
107
97
|
|
108
98
|
def [](key) @info[key] end
|
@@ -221,17 +211,11 @@ module Flickrie
|
|
221
211
|
end
|
222
212
|
|
223
213
|
def from_context(hash)
|
224
|
-
|
225
|
-
|
226
|
-
['
|
227
|
-
|
228
|
-
|
229
|
-
else
|
230
|
-
hash[media] = nil
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
hash
|
214
|
+
count = hash['count']['_content'].to_i
|
215
|
+
previous_photo = new(hash['prevphoto']) rescue nil
|
216
|
+
next_photo = new(hash['nextphoto']) rescue nil
|
217
|
+
Struct.new(:count, :previous, :next).new \
|
218
|
+
count, previous_photo, next_photo
|
235
219
|
end
|
236
220
|
|
237
221
|
def from_exif(info)
|
data/lib/flickrie/media_count.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware/response_middleware'
|
3
|
+
|
4
|
+
module Flickrie
|
5
|
+
class Error < StandardError
|
6
|
+
attr_reader :code
|
7
|
+
|
8
|
+
def initialize(message, code = nil)
|
9
|
+
super(message)
|
10
|
+
@code = code.to_i
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Internal
|
15
|
+
module Middleware # :nodoc:
|
16
|
+
class StatusCheck < Faraday::Response::Middleware
|
17
|
+
def on_complete(env)
|
18
|
+
if env[:body]['stat'] != 'ok'
|
19
|
+
raise Error.new(env[:body]['message'], env[:body]['code'])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class UploadStatusCheck < Faraday::Response::Middleware
|
25
|
+
def on_complete(env)
|
26
|
+
if env[:body]['rsp']['stat'] != 'ok'
|
27
|
+
error = env[:body]['rsp']['err']
|
28
|
+
raise Error.new(error['msg'], error['code'])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class OAuthCheck < Faraday::Response::Middleware
|
34
|
+
def on_complete(env)
|
35
|
+
if env[:status] != 200
|
36
|
+
message = env[:body][/(?<=oauth_problem=)[^&]+/]
|
37
|
+
pretty_message = message.gsub('_', ' ').capitalize
|
38
|
+
raise Error.new(pretty_message)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Retry < Faraday::Middleware
|
44
|
+
def initialize(app, retries = 2)
|
45
|
+
@retries = retries
|
46
|
+
super(app)
|
47
|
+
end
|
48
|
+
|
49
|
+
def call(env)
|
50
|
+
retries = @retries
|
51
|
+
begin
|
52
|
+
@app.call(env)
|
53
|
+
rescue Faraday::Error::TimeoutError
|
54
|
+
if retries > 0
|
55
|
+
retries -= 1
|
56
|
+
retry
|
57
|
+
end
|
58
|
+
raise
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class ParseOAuthParams < FaradayMiddleware::ResponseMiddleware
|
64
|
+
define_parser do |body|
|
65
|
+
CGI.parse(body).inject({}) do |hash, (key, value)|
|
66
|
+
hash.update(key.to_sym => value.first)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/flickrie/oauth.rb
CHANGED
@@ -1,92 +1,101 @@
|
|
1
1
|
require 'faraday_middleware'
|
2
|
-
require 'faraday_middleware/response_middleware'
|
3
2
|
|
4
3
|
module Flickrie
|
5
4
|
module OAuth
|
6
5
|
URL = 'http://www.flickr.com/services/oauth'.freeze
|
7
6
|
NO_CALLBACK = 'oob'.freeze
|
8
7
|
|
9
|
-
|
10
|
-
def self.new_connection(additional_oauth_params = {})
|
11
|
-
Faraday.new(URL) do |conn|
|
12
|
-
conn.use FaradayMiddleware::OAuth, {
|
13
|
-
:consumer_key => Flickrie.api_key,
|
14
|
-
:consumer_secret => Flickrie.shared_secret
|
15
|
-
}.merge(additional_oauth_params)
|
8
|
+
private
|
16
9
|
|
17
|
-
|
18
|
-
|
10
|
+
def self.new_connection(request_token = nil) # :nodoc:
|
11
|
+
Faraday.new(params) do |b|
|
12
|
+
b.use Middleware::Retry
|
13
|
+
b.use FaradayMiddleware::OAuth,
|
14
|
+
:consumer_key => Flickrie.api_key,
|
15
|
+
:consumer_secret => Flickrie.shared_secret,
|
16
|
+
:token => request_token.to_a.first,
|
17
|
+
:token_secret => request_token.to_a.last
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
end
|
19
|
+
b.use Middleware::ParseOAuthParams
|
20
|
+
b.use Middleware::OAuthCheck
|
23
21
|
|
24
|
-
|
25
|
-
def on_complete(env)
|
26
|
-
if env[:status] != 200
|
27
|
-
raise Error, env[:body]['oauth_problem'].gsub('_', ' ').capitalize
|
22
|
+
b.adapter :net_http
|
28
23
|
end
|
29
24
|
end
|
30
|
-
end
|
31
25
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
26
|
+
def self.params
|
27
|
+
{
|
28
|
+
:url => URL,
|
29
|
+
:request => {
|
30
|
+
:open_timeout => Flickrie.open_timeout || OPEN_TIMEOUT,
|
31
|
+
:timeout => Flickrie.timeout || TIMEOUT
|
32
|
+
}
|
33
|
+
}
|
40
34
|
end
|
41
|
-
end
|
42
35
|
|
43
|
-
|
36
|
+
public
|
37
|
+
|
44
38
|
def self.get_request_token(options = {})
|
45
39
|
connection = new_connection
|
46
|
-
|
47
40
|
response = connection.get "request_token" do |req|
|
48
41
|
req.params[:oauth_callback] = options[:callback_url] || NO_CALLBACK
|
49
42
|
end
|
50
43
|
|
51
|
-
RequestToken.
|
44
|
+
RequestToken.new(response.body)
|
52
45
|
end
|
53
46
|
|
54
47
|
def self.get_access_token(verifier, request_token)
|
55
|
-
connection = new_connection
|
56
|
-
:token => request_token.token,
|
57
|
-
:token_secret => request_token.secret
|
58
|
-
|
48
|
+
connection = new_connection(request_token)
|
59
49
|
response = connection.get "access_token" do |req|
|
60
50
|
req.params[:oauth_verifier] = verifier
|
61
51
|
end
|
62
52
|
|
63
|
-
AccessToken.
|
53
|
+
AccessToken.new(response.body)
|
64
54
|
end
|
65
55
|
|
66
|
-
module Token
|
67
|
-
|
68
|
-
|
56
|
+
module Token
|
57
|
+
attr_reader :token, :secret
|
58
|
+
|
59
|
+
def initialize(info)
|
60
|
+
@token = info[:oauth_token]
|
61
|
+
@secret = info[:oauth_token_secret]
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_a
|
65
|
+
[token, secret]
|
69
66
|
end
|
70
67
|
end
|
71
68
|
|
72
|
-
class RequestToken
|
73
|
-
|
69
|
+
class RequestToken
|
70
|
+
include Token
|
74
71
|
|
75
|
-
def get_authorization_url(
|
72
|
+
def get_authorization_url(params = {})
|
76
73
|
require 'uri'
|
77
74
|
url = URI.parse(URL)
|
78
|
-
url.path +=
|
79
|
-
|
80
|
-
|
81
|
-
:perms => options[:permissions] || options[:perms]
|
82
|
-
}
|
83
|
-
url.query = params.map { |k, v| "#{k}=#{v}" }.join('&')
|
75
|
+
url.path += '/authorize'
|
76
|
+
query_params = {:oauth_token => token}.merge(params)
|
77
|
+
url.query = query_params.map { |k,v| "#{k}=#{v}" }.join('&')
|
84
78
|
url.to_s
|
85
79
|
end
|
80
|
+
alias authorize_url get_authorization_url
|
81
|
+
|
82
|
+
def get_access_token(verifier)
|
83
|
+
OAuth.get_access_token(verifier, self)
|
84
|
+
end
|
86
85
|
end
|
87
86
|
|
88
|
-
class AccessToken
|
89
|
-
|
87
|
+
class AccessToken
|
88
|
+
include Token
|
89
|
+
|
90
|
+
attr_reader :user_info
|
91
|
+
|
92
|
+
def initialize(info)
|
93
|
+
super
|
94
|
+
@user_info = info.tap do |info|
|
95
|
+
info.delete(:oauth_token)
|
96
|
+
info.delete(:oauth_token_secret)
|
97
|
+
end
|
98
|
+
end
|
90
99
|
end
|
91
100
|
end
|
92
101
|
end
|
data/lib/flickrie/photo.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Flickrie
|
2
2
|
# See Flickrie::Media for the other methods.
|
3
|
-
#
|
4
3
|
class Photo
|
5
4
|
include Media
|
6
5
|
|
@@ -66,7 +65,6 @@ module Flickrie
|
|
66
65
|
def rotation() Integer(@info['rotation']) rescue nil end
|
67
66
|
|
68
67
|
# Same as calling <tt>Flickrie.get_photo_sizes(photo.id)</tt>
|
69
|
-
#
|
70
68
|
def get_sizes(params = {}, info = nil)
|
71
69
|
info ||= Flickrie.client.get_media_sizes(id, params).body['sizes']
|
72
70
|
@info['usage'] ||= {}
|
data/lib/flickrie/set.rb
CHANGED
@@ -20,17 +20,13 @@ module Flickrie
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# Returns an instance of Flickrie::User
|
23
|
-
#
|
24
23
|
def owner() User.new('nsid' => @info['owner']) if @info['owner'] end
|
25
24
|
|
26
25
|
# Same as calling <tt>Flickrie.photos_from_set(set.id)</tt>
|
27
|
-
#
|
28
26
|
def photos(params = {}) Flickrie.photos_from_set(id, params) end
|
29
27
|
# Same as calling <tt>Flickrie.videos_from_set(set.id)</tt>
|
30
|
-
#
|
31
28
|
def videos(params = {}) Flickrie.videos_from_set(id, params) end
|
32
29
|
# Same as calling <tt>Flickrie.media_from_set(set.id)</tt>
|
33
|
-
#
|
34
30
|
def media(params = {}) Flickrie.media_from_set(id, params) end
|
35
31
|
|
36
32
|
def can_comment?() Integer(@info['can_comment']) == 1 rescue nil end
|
@@ -51,7 +47,6 @@ module Flickrie
|
|
51
47
|
def hash() @info end
|
52
48
|
|
53
49
|
# Same as calling <tt>Flickrie.get_set_info(set.id)</tt>
|
54
|
-
#
|
55
50
|
def get_info(info = nil)
|
56
51
|
info ||= Flickrie.client.get_set_info(id).body['photoset']
|
57
52
|
@info.update(info)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'faraday_middleware'
|
2
|
+
|
1
3
|
module Flickrie
|
2
4
|
class << self
|
3
5
|
# :nodoc:
|
@@ -6,19 +8,20 @@ module Flickrie
|
|
6
8
|
end
|
7
9
|
|
8
10
|
def new_upload_client(access_token_hash = {})
|
9
|
-
UploadClient.new(upload_params) do |
|
10
|
-
|
11
|
+
UploadClient.new(upload_params) do |b|
|
12
|
+
b.use Middleware::Retry
|
13
|
+
b.use FaradayMiddleware::OAuth,
|
11
14
|
:consumer_key => api_key,
|
12
15
|
:consumer_secret => shared_secret,
|
13
16
|
:token => access_token_hash[:token] || access_token,
|
14
17
|
:token_secret => access_token_hash[:secret] || access_secret
|
15
|
-
|
18
|
+
b.request :multipart
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
b.use Middleware::UploadStatusCheck
|
21
|
+
b.use FaradayMiddleware::ParseXml
|
22
|
+
b.use Middleware::OAuthCheck
|
20
23
|
|
21
|
-
|
24
|
+
b.adapter :net_http
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
@@ -28,40 +31,35 @@ module Flickrie
|
|
28
31
|
{
|
29
32
|
:url => 'http://api.flickr.com/services',
|
30
33
|
:request => {
|
31
|
-
:open_timeout => open_timeout ||
|
34
|
+
:open_timeout => open_timeout || OPEN_TIMEOUT
|
32
35
|
}
|
33
36
|
}
|
34
37
|
end
|
35
38
|
end
|
36
39
|
|
37
|
-
class UploadStatusCheck < Faraday::Response::Middleware # :nodoc:
|
38
|
-
def on_complete(env)
|
39
|
-
if env[:body]['rsp']['stat'] != 'ok'
|
40
|
-
error = env[:body]['rsp']['err']
|
41
|
-
raise Error.new(error['msg'], error['code']),
|
42
|
-
error['msg']
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
40
|
class UploadClient < Faraday::Connection # :nodoc:
|
48
41
|
def upload(media, params = {})
|
49
|
-
|
50
|
-
|
51
|
-
post "upload", {
|
52
|
-
:
|
42
|
+
file = get_file(media, params[:content_type])
|
43
|
+
title = file.original_filename.match(/\.\w{3,4}$/).pre_match
|
44
|
+
post "upload", {
|
45
|
+
:photo => file,
|
46
|
+
:title => title
|
47
|
+
}.merge(params)
|
53
48
|
end
|
54
49
|
|
55
50
|
def replace(media, media_id, params = {})
|
56
|
-
|
57
|
-
|
58
|
-
post "replace", {
|
59
|
-
:
|
51
|
+
file = get_file(media, params[:content_type])
|
52
|
+
title = file.original_filename.match(/\.\w{3,4}$/).pre_match
|
53
|
+
post "replace", {
|
54
|
+
:photo => file,
|
55
|
+
:photo_id => media_id,
|
56
|
+
:title => title
|
57
|
+
}.merge(params)
|
60
58
|
end
|
61
59
|
|
62
60
|
private
|
63
61
|
|
64
|
-
|
62
|
+
CONTENT_TYPES = {
|
65
63
|
%w[.jpg .jpeg .jpe .jif .jfif .jfi] => 'image/jpeg',
|
66
64
|
%w[.gif] => 'image/gif',
|
67
65
|
%w[.png] => 'image/png',
|
@@ -80,40 +78,31 @@ module Flickrie
|
|
80
78
|
%w[.avi] => 'video/avi'
|
81
79
|
}.freeze
|
82
80
|
|
83
|
-
def get_file(object,
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
81
|
+
def get_file(object, content_type = nil)
|
82
|
+
file, content_type, file_path =
|
83
|
+
case object.class.name
|
84
|
+
when "String"
|
85
|
+
# file path
|
86
|
+
[File.open(object), content_type || determine_content_type(object), object]
|
87
|
+
when "ActionDispatch::Http::UploadedFile"
|
88
|
+
# file from Rails
|
89
|
+
[object, object.content_type, object.tempfile]
|
90
|
+
when "Hash"
|
91
|
+
# file from Sinatra
|
92
|
+
[object[:tempfile], object[:type], object[:tempfile].path]
|
93
|
+
else
|
94
|
+
raise Error, "Invalid file format"
|
95
|
+
end
|
94
96
|
|
95
|
-
Faraday::UploadIO.new(
|
97
|
+
Faraday::UploadIO.new(file, content_type, file_path)
|
96
98
|
end
|
97
99
|
|
98
|
-
def
|
99
|
-
extension = file_path[/\.\w
|
100
|
-
|
100
|
+
def determine_content_type(file_path)
|
101
|
+
extension = file_path[/\.\w+$/]
|
102
|
+
content_type = CONTENT_TYPES.find { |k,v| k.include?(extension) }.last
|
101
103
|
|
102
104
|
rescue NoMethodError
|
103
|
-
raise Error, "Don't know
|
104
|
-
end
|
105
|
-
|
106
|
-
def get_title(object)
|
107
|
-
filename =
|
108
|
-
if object.class.name == "String" # file path
|
109
|
-
File.basename(object)
|
110
|
-
elsif object.class.name == "ActionDispatch::Http::UploadedFile" # Rails
|
111
|
-
object.original_filename
|
112
|
-
elsif object.class.name == "Hash" # Sinatra
|
113
|
-
object[:filename]
|
114
|
-
end
|
115
|
-
|
116
|
-
filename.match(/\.\w{3,4}$/).pre_match
|
105
|
+
raise Error, "Don't know the content type for this extension (#{extension})"
|
117
106
|
end
|
118
107
|
end
|
119
108
|
end
|
data/lib/flickrie/user.rb
CHANGED
@@ -7,11 +7,7 @@ module Flickrie
|
|
7
7
|
def username() @info['username'] end
|
8
8
|
def real_name() @info['realname'] end
|
9
9
|
def location() @info['location'] end
|
10
|
-
def time_zone() @info['timezone'] end
|
11
10
|
def description() @info['description'] end
|
12
|
-
def profile_url() @info['profileurl'] end
|
13
|
-
def mobile_url() @info['mobileurl'] end
|
14
|
-
def photos_url() @info['photosurl'] end
|
15
11
|
def path_alias() @info['path_alias'] end
|
16
12
|
def icon_server() @info['iconserver'] end
|
17
13
|
def icon_farm() @info['iconfarm'] end
|
@@ -26,21 +22,26 @@ module Flickrie
|
|
26
22
|
end
|
27
23
|
end
|
28
24
|
|
25
|
+
# ==== Example
|
26
|
+
#
|
27
|
+
# user.time_zone.offset # => "+01:00"
|
28
|
+
# user.time_zone.label # => "Sarajevo, Skopje, Warsaw, Zagreb"
|
29
|
+
def time_zone() Struct.new(:label, :offset).new(*@info['timezone'].values) rescue nil end
|
30
|
+
|
31
|
+
def photos_url() @info['photosurl'] || "http://www.flickr.com/photos/#{nsid || id}" end
|
32
|
+
def profile_url() @info['profileurl'] || "http://www.flickr.com/people/#{nsid || id}" end
|
33
|
+
def mobile_url() @info['mobileurl'] end
|
34
|
+
|
29
35
|
def first_taken() DateTime.parse(@info['photos']['firstdatetaken']).to_time rescue nil end
|
30
36
|
def first_uploaded() Time.at(Integer(@info['photos']['firstdate'])) rescue nil end
|
31
37
|
|
32
38
|
def favorited_at() Time.at(Integer(@info['favedate'])) rescue nil end
|
33
39
|
|
34
|
-
def favorited_at
|
35
|
-
Time.at(@info['favedate'].to_i)
|
36
|
-
end
|
37
|
-
|
38
40
|
def media_count() Integer(@info['photos']['count']) rescue nil end
|
39
41
|
alias photos_count media_count
|
40
42
|
alias videos_count media_count
|
41
43
|
|
42
44
|
# The same as calling <tt>Flickrie.public_photos_from_user(user.nsid)</tt>
|
43
|
-
#
|
44
45
|
def public_photos() Flickrie.public_photos_from_user(nsid || id) end
|
45
46
|
|
46
47
|
def pro?() Integer(@info['ispro']) == 1 rescue nil end
|
@@ -49,7 +50,6 @@ module Flickrie
|
|
49
50
|
def hash() @info end
|
50
51
|
|
51
52
|
# The same as calling <tt>Flickrie.get_user_info(user.nsid)</tt>
|
52
|
-
#
|
53
53
|
def get_info(params = {}, info = nil)
|
54
54
|
info ||= Flickrie.client.get_user_info(nsid || id, params).body['person']
|
55
55
|
@info.update(info)
|
data/lib/flickrie/version.rb
CHANGED
data/lib/flickrie/video.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Flickrie
|
2
2
|
# See Flickrie::Media for the other methods.
|
3
|
-
#
|
4
3
|
class Video
|
5
4
|
include Media
|
6
5
|
|
@@ -18,7 +17,6 @@ module Flickrie
|
|
18
17
|
def mobile_download_url() @video['mobile_download_url'] end
|
19
18
|
|
20
19
|
# This fetches the #source_url, #download_url and the #mobile_download_url
|
21
|
-
#
|
22
20
|
def get_sizes(params = {}, info = nil)
|
23
21
|
info ||= Flickrie.client.get_media_sizes(id, params).body['sizes']
|
24
22
|
@info['usage'] ||= {}
|
Binary file
|
@@ -1,42 +1,42 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Flickrie::ApiMethods do
|
4
4
|
it "should upload and delete correctly", :vcr, :cassette => "upload and delete" do
|
5
|
-
media_id =
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
media_id = Flickrie.upload(PHOTO_PATH)
|
6
|
+
Flickrie.public_media_from_user(USER_NSID).map(&:id).should include(media_id)
|
7
|
+
Flickrie.delete_media(media_id)
|
8
|
+
Flickrie.public_media_from_user(USER_NSID).map(&:id).should_not include(media_id)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should upload asynchronously correctly", :vcr, :cassette => "asynchronous upload" do
|
12
|
-
ticket_id =
|
12
|
+
ticket_id = Flickrie.upload(PHOTO_PATH, :async => 1)
|
13
13
|
begin
|
14
|
-
ticket =
|
14
|
+
ticket = Flickrie.check_upload_tickets([ticket_id]).first
|
15
15
|
end until ticket.complete?
|
16
16
|
photo_id = ticket.photo_id
|
17
17
|
Flickrie.get_photo_info(photo_id).id.should eq(photo_id)
|
18
|
-
|
18
|
+
Flickrie.delete_photo(photo_id)
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should replace correctly", :vcr, :cassette => "replace" do
|
22
22
|
begin
|
23
|
-
id =
|
24
|
-
|
23
|
+
id = Flickrie.upload(PHOTO_PATH)
|
24
|
+
Flickrie.replace(PHOTO_PATH, id)
|
25
25
|
rescue => exception
|
26
26
|
exception.code.should eq(1) # Not a pro account
|
27
27
|
ensure
|
28
|
-
|
28
|
+
Flickrie.delete_media(id)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should manipulate tags correctly", :vcr, :cassette => "tag manipulation" do
|
33
|
-
media =
|
33
|
+
media = Flickrie.get_media_info(PHOTO_ID)
|
34
34
|
tags_before_change = media.tags.join(' ')
|
35
|
-
|
35
|
+
Flickrie.add_media_tags(PHOTO_ID, "janko")
|
36
36
|
media.get_info
|
37
37
|
media.tags.join(' ').should eq([tags_before_change, "janko"].join(' '))
|
38
38
|
tag_id = media.tags.find { |tag| tag.content == "janko" }.id
|
39
|
-
|
39
|
+
Flickrie.remove_media_tag(tag_id)
|
40
40
|
media.get_info
|
41
41
|
media.tags.join(' ').should eq(tags_before_change)
|
42
42
|
end
|
@@ -1,19 +1,16 @@
|
|
1
|
-
|
2
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
3
|
describe Flickrie::Instance do
|
5
4
|
it "should be able to call API methods", :vcr, :cassette => "calling api methods" do
|
6
5
|
# this is to see if the client and upload_client were reset
|
7
6
|
Flickrie.get_photo_info(PHOTO_ID)
|
8
|
-
Flickrie.access_token = ENV['FLICKR_ACCESS_TOKEN']
|
9
|
-
Flickrie.access_secret = ENV['FLICKR_ACCESS_SECRET']
|
10
7
|
id = Flickrie.upload(PHOTO_PATH)
|
11
8
|
Flickrie.delete_photo(id)
|
12
9
|
Flickrie.access_token = Flickrie.access_secret = nil
|
13
10
|
|
14
11
|
instance = Flickrie::Instance.new(ENV['FLICKR_ACCESS_TOKEN'], ENV['FLICKR_ACCESS_SECRET'])
|
15
12
|
user = instance.test_login
|
16
|
-
user.username.should eq(
|
13
|
+
user.username.should eq(USER_USERNAME)
|
17
14
|
id = instance.upload(PHOTO_PATH)
|
18
15
|
instance.delete_photo(id)
|
19
16
|
end
|