flickr-objects 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +167 -0
- data/lib/flickr/api/flickr.rb +40 -0
- data/lib/flickr/api/media.rb +63 -0
- data/lib/flickr/api/person.rb +70 -0
- data/lib/flickr/api/photo.rb +11 -0
- data/lib/flickr/api/set.rb +70 -0
- data/lib/flickr/api/video.rb +11 -0
- data/lib/flickr/api.rb +50 -0
- data/lib/flickr/api_caller.rb +95 -0
- data/lib/flickr/client/methods_client.rb +22 -0
- data/lib/flickr/client/middleware/retry.rb +38 -0
- data/lib/flickr/client/middleware.rb +42 -0
- data/lib/flickr/client/upload_client.rb +75 -0
- data/lib/flickr/client.rb +57 -0
- data/lib/flickr/configuration.rb +23 -0
- data/lib/flickr/helpers/base_58.rb +15 -0
- data/lib/flickr/helpers/boolean.rb +4 -0
- data/lib/flickr/helpers/core_ext.rb +5 -0
- data/lib/flickr/helpers/inheritable_attr_accessor.rb +18 -0
- data/lib/flickr/object/attribute/converter.rb +49 -0
- data/lib/flickr/object/attribute/finder.rb +32 -0
- data/lib/flickr/object/attribute.rb +45 -0
- data/lib/flickr/object.rb +39 -0
- data/lib/flickr/objects/attribute_values/collection.rb +10 -0
- data/lib/flickr/objects/attribute_values/location.rb +14 -0
- data/lib/flickr/objects/attribute_values/media.rb +70 -0
- data/lib/flickr/objects/attribute_values/note.rb +11 -0
- data/lib/flickr/objects/attribute_values/permissions.rb +12 -0
- data/lib/flickr/objects/attribute_values/person.rb +23 -0
- data/lib/flickr/objects/attribute_values/photo.rb +19 -0
- data/lib/flickr/objects/attribute_values/set.rb +21 -0
- data/lib/flickr/objects/attribute_values/tag.rb +9 -0
- data/lib/flickr/objects/attribute_values/upload_ticket.rb +11 -0
- data/lib/flickr/objects/attribute_values/video.rb +27 -0
- data/lib/flickr/objects/attribute_values/visibility.rb +10 -0
- data/lib/flickr/objects/collection.rb +58 -0
- data/lib/flickr/objects/location.rb +26 -0
- data/lib/flickr/objects/media.rb +74 -0
- data/lib/flickr/objects/note.rb +14 -0
- data/lib/flickr/objects/permissions.rb +14 -0
- data/lib/flickr/objects/person.rb +42 -0
- data/lib/flickr/objects/photo.rb +48 -0
- data/lib/flickr/objects/set.rb +33 -0
- data/lib/flickr/objects/tag.rb +17 -0
- data/lib/flickr/objects/upload_ticket.rb +18 -0
- data/lib/flickr/objects/video.rb +24 -0
- data/lib/flickr/objects/visibility.rb +12 -0
- data/lib/flickr/objects.rb +28 -0
- data/lib/flickr/version.rb +3 -0
- data/lib/flickr-objects.rb +2 -0
- data/lib/flickr.rb +21 -0
- metadata +212 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
class Flickr
|
2
|
+
class UploadClient < Client
|
3
|
+
def initialize(access_token)
|
4
|
+
super(access_token) do |builder|
|
5
|
+
builder.use Faraday::Request::Multipart
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def upload(media, params = {})
|
10
|
+
file = get_file(media)
|
11
|
+
response = post "upload", {photo: file}.merge(params)
|
12
|
+
response.body
|
13
|
+
end
|
14
|
+
|
15
|
+
def replace(media, id, params = {})
|
16
|
+
file = get_file(media)
|
17
|
+
response = post "replace", {photo: file, photo_id: id}.merge(params)
|
18
|
+
response.body
|
19
|
+
end
|
20
|
+
|
21
|
+
def parser
|
22
|
+
FaradayMiddleware::ParseXml
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def get_file(object)
|
28
|
+
file, content_type, file_path =
|
29
|
+
case object.class.name
|
30
|
+
when "String"
|
31
|
+
[File.open(object), determine_content_type(object), object]
|
32
|
+
when "File"
|
33
|
+
[object, determine_content_type(object.path), object.path]
|
34
|
+
when "ActionDispatch::Http::UploadedFile"
|
35
|
+
[object, object.content_type, object.tempfile]
|
36
|
+
when "Hash" && defined?(Sinatra)
|
37
|
+
[object[:tempfile], object[:type], object[:tempfile].path]
|
38
|
+
else
|
39
|
+
raise Error, "invalid file format"
|
40
|
+
end
|
41
|
+
|
42
|
+
Faraday::UploadIO.new(file, content_type, file_path)
|
43
|
+
end
|
44
|
+
|
45
|
+
def determine_content_type(path)
|
46
|
+
extension = File.extname(path)
|
47
|
+
array = CONTENT_TYPES.keys.find { |array| array.include?(extension) }
|
48
|
+
|
49
|
+
if array
|
50
|
+
CONTENT_TYPES[array]
|
51
|
+
else
|
52
|
+
raise Error, "content type for #{extension} is not known"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
CONTENT_TYPES = {
|
57
|
+
%w[.jpg .jpeg .jpe .jif .jfif .jfi] => 'image/jpeg',
|
58
|
+
%w[.gif] => 'image/gif',
|
59
|
+
%w[.png] => 'image/png',
|
60
|
+
%w[.svg .svgz] => 'image/svg+xml',
|
61
|
+
%w[.tiff .tif] => 'image/tiff',
|
62
|
+
%w[.ico] => 'image/vnd.microsoft.icon',
|
63
|
+
|
64
|
+
%w[.mpg .mpeg .m1v .m1a .m2a .mpa .mpv] => 'video/mpeg',
|
65
|
+
%w[.mp4 .m4a .m4p .m4b .m4r .m4v] => 'video/mp4',
|
66
|
+
%w[.ogv .oga .ogx .ogg .spx] => 'video/ogg',
|
67
|
+
%w[.mov .qt] => 'video/quicktime',
|
68
|
+
%w[.webm] => 'video/webm',
|
69
|
+
%w[.mkv .mk3d .mka .mks] => 'video/x-matroska',
|
70
|
+
%w[.wmv] => 'video/x-ms-wmv',
|
71
|
+
%w[.flv .f4v .f4p .f4a .f4b] => 'video/x-flv',
|
72
|
+
%w[.avi] => 'video/avi'
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "faraday"
|
2
|
+
require "faraday_middleware"
|
3
|
+
require "flickr/client/middleware"
|
4
|
+
|
5
|
+
class Flickr
|
6
|
+
class Client < Faraday::Connection
|
7
|
+
DEFAULTS = {
|
8
|
+
open_timeout: 3,
|
9
|
+
timeout: 4
|
10
|
+
}
|
11
|
+
|
12
|
+
def initialize(access_token)
|
13
|
+
api_key, shared_secret = Flickr.configuration.fetch(:api_key, :shared_secret)
|
14
|
+
|
15
|
+
open_timeout = Flickr.configuration.open_timeout || DEFAULTS[:open_timeout]
|
16
|
+
timeout = Flickr.configuration.timeout || DEFAULTS[:timeout]
|
17
|
+
|
18
|
+
url = Flickr.configuration.secure ? "https://secure.flickr.com/services" : "http://api.flickr.com/services"
|
19
|
+
proxy = Flickr.configuration.proxy
|
20
|
+
|
21
|
+
params = {
|
22
|
+
url: url,
|
23
|
+
params: {
|
24
|
+
format: "json",
|
25
|
+
nojsoncallback: 1,
|
26
|
+
api_key: api_key
|
27
|
+
},
|
28
|
+
request: {
|
29
|
+
open_timeout: open_timeout,
|
30
|
+
timeout: timeout
|
31
|
+
},
|
32
|
+
proxy: proxy
|
33
|
+
}
|
34
|
+
|
35
|
+
super(params) do |builder|
|
36
|
+
# Request
|
37
|
+
builder.use Middleware::Retry
|
38
|
+
builder.use FaradayMiddleware::OAuth,
|
39
|
+
consumer_key: api_key,
|
40
|
+
consumer_secret: shared_secret,
|
41
|
+
token: access_token.first,
|
42
|
+
token_secret: access_token.last
|
43
|
+
yield builder if block_given?
|
44
|
+
|
45
|
+
# Response
|
46
|
+
builder.use Middleware::CheckStatus
|
47
|
+
builder.use self.parser
|
48
|
+
builder.use Middleware::CheckOAuth
|
49
|
+
|
50
|
+
builder.adapter :net_http
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
require "flickr/client/methods_client"
|
57
|
+
require "flickr/client/upload_client"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :api_key
|
4
|
+
attr_accessor :shared_secret
|
5
|
+
|
6
|
+
attr_accessor :access_token_key
|
7
|
+
attr_accessor :access_token_secret
|
8
|
+
|
9
|
+
attr_accessor :open_timeout
|
10
|
+
attr_accessor :timeout
|
11
|
+
|
12
|
+
attr_accessor :secure
|
13
|
+
attr_accessor :proxy
|
14
|
+
|
15
|
+
def fetch(*attributes)
|
16
|
+
attributes.map { |attribute| send(attribute) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def access_token
|
20
|
+
[access_token_key, access_token_secret]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Flickr
|
2
|
+
module Base58
|
3
|
+
ALPHABET = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'.chars.to_a.freeze
|
4
|
+
|
5
|
+
def to_base58(value)
|
6
|
+
value = Integer(value)
|
7
|
+
begin
|
8
|
+
value, remainder = value.divmod(58)
|
9
|
+
result = ALPHABET[remainder] + (result || '')
|
10
|
+
end while value > 0
|
11
|
+
|
12
|
+
result
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Flickr
|
2
|
+
module InheritableAttrAccessor
|
3
|
+
def inheritable_attr_accessor(*names)
|
4
|
+
names.each do |name|
|
5
|
+
attr_reader name
|
6
|
+
|
7
|
+
define_method("#{name}=") do |value|
|
8
|
+
instance_variable_set("@#{name}", value)
|
9
|
+
if respond_to?(:children)
|
10
|
+
children.each do |child|
|
11
|
+
child.send("#{name}=", send(name))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "date"
|
2
|
+
require "flickr/helpers/boolean"
|
3
|
+
|
4
|
+
class Flickr
|
5
|
+
class Object
|
6
|
+
class Attribute::Converter
|
7
|
+
def initialize(instance)
|
8
|
+
@instance = instance
|
9
|
+
end
|
10
|
+
|
11
|
+
def convert(value, type)
|
12
|
+
return value if value.nil?
|
13
|
+
|
14
|
+
if type.is_a?(Array)
|
15
|
+
return value.map {|item| convert(item, type.first) }
|
16
|
+
elsif Object.children.include?(type)
|
17
|
+
return type.new(value, @instance.client)
|
18
|
+
else
|
19
|
+
try_each(CONVERTERS[type]) do |converter|
|
20
|
+
return converter.call(value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
value
|
25
|
+
end
|
26
|
+
|
27
|
+
CONVERTERS = {
|
28
|
+
::Object => [->(value) { value }],
|
29
|
+
String => [->(value) { String(value) }],
|
30
|
+
Time => [->(value) { Time.at(Integer(value)) }, ->(value) { DateTime.parse(value).to_time }],
|
31
|
+
Boolean => [->(value) { Integer(value) == 1 }],
|
32
|
+
Integer => [->(value) { Integer(value) }],
|
33
|
+
Float => [->(value) { Float(value) }],
|
34
|
+
Hash => [->(value) { value }],
|
35
|
+
}
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def try_each(enum, &block)
|
40
|
+
enum.each do |element|
|
41
|
+
begin
|
42
|
+
yield element
|
43
|
+
rescue
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Object
|
3
|
+
class Attribute::Finder
|
4
|
+
def initialize(instance)
|
5
|
+
@instance = instance
|
6
|
+
end
|
7
|
+
|
8
|
+
def find(attribute, *args)
|
9
|
+
attribute_values = @instance.class.attribute_values[attribute] || []
|
10
|
+
attribute_values << ->{ @hash.fetch(attribute.to_s) }
|
11
|
+
|
12
|
+
try_each(attribute_values) do |attribute_value|
|
13
|
+
result = @instance.instance_exec(*args, &attribute_value)
|
14
|
+
return result unless result.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def try_each(enum, &block)
|
23
|
+
enum.each do |element|
|
24
|
+
begin
|
25
|
+
yield element
|
26
|
+
rescue
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "flickr/helpers/inheritable_attr_accessor"
|
2
|
+
|
3
|
+
class Flickr
|
4
|
+
class Object
|
5
|
+
module Attribute
|
6
|
+
def self.extended(base)
|
7
|
+
base.send(:include, InstanceMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
def attributes
|
11
|
+
@attributes ||= []
|
12
|
+
end
|
13
|
+
|
14
|
+
def attribute(name, type = ::Object, options = {})
|
15
|
+
attributes << name
|
16
|
+
children.each { |child| child.attributes << name } if respond_to?(:children)
|
17
|
+
|
18
|
+
define_method(name) do |*args|
|
19
|
+
value = attribute_finder.find(name, *args)
|
20
|
+
attribute_converter.convert(value, type)
|
21
|
+
end
|
22
|
+
|
23
|
+
Array(options[:aliases]).each do |alias_name|
|
24
|
+
alias_method alias_name, name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module InstanceMethods
|
29
|
+
def attribute_finder
|
30
|
+
Finder.new(self)
|
31
|
+
end
|
32
|
+
|
33
|
+
def attribute_converter
|
34
|
+
Converter.new(self)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
extend InheritableAttrAccessor
|
39
|
+
inheritable_attr_accessor :attribute_values
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
require_relative "attribute/finder"
|
45
|
+
require_relative "attribute/converter"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "flickr/object/attribute"
|
2
|
+
require "flickr/api_caller"
|
3
|
+
|
4
|
+
class Flickr
|
5
|
+
class Object
|
6
|
+
def self.children
|
7
|
+
@children ||= []
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.inherited(child)
|
11
|
+
child.send(:extend, Attribute)
|
12
|
+
child.send(:include, ApiCaller)
|
13
|
+
|
14
|
+
children << child
|
15
|
+
Object.children << child if self != Object
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.find(id)
|
19
|
+
new({"id" => id}, client)
|
20
|
+
end
|
21
|
+
|
22
|
+
def inspect
|
23
|
+
attribute_values = {}
|
24
|
+
self.class.attributes.each do |name|
|
25
|
+
attribute_values[name] = send(name) unless send(name).nil?
|
26
|
+
end
|
27
|
+
class_name = self.class.name
|
28
|
+
id = "0x%x" % (object_id << 1)
|
29
|
+
"#<#{class_name}:#{id} #{attribute_values.map { |k, v| "#{k}=#{v.inspect}" }.join(" ")}>"
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def initialize(hash, client)
|
35
|
+
@hash = hash || {}
|
36
|
+
@client = client
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Collection < Object
|
3
|
+
self.attribute_values = {
|
4
|
+
current_page: [->{ @hash["page"] }],
|
5
|
+
per_page: [->{ @hash["per_page"] }, ->{ @hash["perpage"] }],
|
6
|
+
total_entries: [->{ @hash["total"] }],
|
7
|
+
total_pages: [->{ @hash["pages"] }],
|
8
|
+
}
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Media < Object
|
3
|
+
self.attribute_values = {
|
4
|
+
uploaded_at: [->{ @hash["dateuploaded"] }, ->{ @hash["dateupload"] }],
|
5
|
+
favorite?: [->{ @hash["isfavorite"] }],
|
6
|
+
posted_at: [->{ @hash["dates"]["posted"] }],
|
7
|
+
taken_at: [->{ @hash["dates"]["taken"] }, ->{ @hash["datetaken"] }],
|
8
|
+
taken_at_granularity: [->{ @hash["dates"]["takengranularity"] }, ->{ @hash["datetakengranularity"] }],
|
9
|
+
updated_at: [->{ @hash["dates"]["lastupdate"] }, ->{ @hash["lastupdate"] }],
|
10
|
+
views_count: [->{ @hash["views"] }],
|
11
|
+
public_editability: [->{ @hash["publiceditability"] }],
|
12
|
+
comments_count: [->{ @hash["comments"]["_content"] }],
|
13
|
+
has_people?: [->{ @hash["people"]["haspeople"] }],
|
14
|
+
notes: [->{ @hash["notes"]["note"] }],
|
15
|
+
tags: [
|
16
|
+
->{ @hash["tags"]["tag"].map { |h| h.merge("photo_id" => @hash["id"]) } },
|
17
|
+
->{
|
18
|
+
[
|
19
|
+
*@hash["tags"].split(" ").map {|content| {"_content" => content, "machine_tag" => 0} },
|
20
|
+
*@hash["machine_tags"].split(" ").map {|content| {"_content" => content, "machine_tag" => 1} }
|
21
|
+
]
|
22
|
+
}
|
23
|
+
],
|
24
|
+
visibility: [->{ @hash["visibility"] }, ->{ @hash.slice("ispublic", "isfriend", "isfamily") if @hash["ispublic"] }],
|
25
|
+
title: [->{ @hash["title"]["_content"] }],
|
26
|
+
description: [->{ @hash["description"]["_content"] }],
|
27
|
+
owner: [
|
28
|
+
->{
|
29
|
+
if @hash["owner"].is_a?(String)
|
30
|
+
{
|
31
|
+
"id" => @hash["owner"],
|
32
|
+
"username" => @hash["ownername"],
|
33
|
+
"iconserver" => @hash["iconserver"],
|
34
|
+
"iconfarm" => @hash["iconfarm"],
|
35
|
+
}
|
36
|
+
end
|
37
|
+
}
|
38
|
+
],
|
39
|
+
path_alias: [->{ @hash["pathalias"] }],
|
40
|
+
location_visibility: [
|
41
|
+
->{ @hash["geoperms"] },
|
42
|
+
->{
|
43
|
+
{
|
44
|
+
"isfamily" => @hash.fetch("geo_is_family"),
|
45
|
+
"isfriend" => @hash.fetch("geo_is_friend"),
|
46
|
+
"iscontact" => @hash.fetch("geo_is_contact"),
|
47
|
+
"ispublic" => @hash.fetch("geo_is_public")
|
48
|
+
}
|
49
|
+
}
|
50
|
+
],
|
51
|
+
location: [->{ @hash.slice("latitude", "longitude", "accuracy", "context", "place_id", "woeid") if @hash["latitude"] }],
|
52
|
+
largest_size: [->{ SIZES.key(SIZES.values.reverse.find { |abbr| @hash["url_#{abbr}"] }) }],
|
53
|
+
}
|
54
|
+
|
55
|
+
OTHER_SIZES = {
|
56
|
+
"Square 75" => "Square",
|
57
|
+
"Thumbnail" => "Thumbnail",
|
58
|
+
"Square 150" => "Large Square",
|
59
|
+
"Small 240" => "Small",
|
60
|
+
"Small 320" => "Small 320",
|
61
|
+
"Medium 500" => "Medium",
|
62
|
+
"Medium 640" => "Medium 640",
|
63
|
+
"Medium 800" => "Medium 800",
|
64
|
+
"Large 1024" => "Large",
|
65
|
+
"Large 1600" => "Large 1600",
|
66
|
+
"Large 2048" => "Large 2048",
|
67
|
+
"Original" => "Original"
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Note < Object
|
3
|
+
self.attribute_values = {
|
4
|
+
author: [->{ {"id" => @hash.fetch("author"), "username" => @hash["authorname"]} }],
|
5
|
+
coordinates: [->{ [@hash.fetch("x"), @hash.fetch("y")] }],
|
6
|
+
width: [->{ @hash["w"] }],
|
7
|
+
height: [->{ @hash["h"] }],
|
8
|
+
content: [->{ @hash["_content"] }],
|
9
|
+
}
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Permissions < Object
|
3
|
+
self.attribute_values = {
|
4
|
+
can_comment?: [->{ @hash["cancomment"] }, ->{ @hash["can_comment"] }],
|
5
|
+
can_add_meta?: [->{ @hash["canaddmeta"] }],
|
6
|
+
can_download?: [->{ @hash["candownload"] }],
|
7
|
+
can_blog?: [->{ @hash["canblog"] }],
|
8
|
+
can_print?: [->{ @hash["canprint"] }],
|
9
|
+
can_share?: [->{ @hash["canshare"] }],
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Person < Object
|
3
|
+
self.attribute_values = {
|
4
|
+
id: [->{ @hash["nsid"] }],
|
5
|
+
nsid: [->{ id }],
|
6
|
+
username: [->{ @hash["username"]["_content"] }],
|
7
|
+
real_name: [->{ @hash["realname"] }, ->{ @hash["realname"]["_content"] }],
|
8
|
+
icon_server: [->{ @hash["iconserver"] }],
|
9
|
+
icon_farm: [->{ @hash["iconfarm"] }],
|
10
|
+
has_pro_account?: [->{ @hash["ispro"] }],
|
11
|
+
location: [->{ @hash["location"]["_content"] }],
|
12
|
+
time_zone: [->{ @hash["timezone"] }],
|
13
|
+
description: [->{ @hash["description"]["_content"] }],
|
14
|
+
photos_url: [->{ @hash["photosurl"]["_content"] }],
|
15
|
+
profile_url: [->{ @hash["profileurl"]["_content"] }],
|
16
|
+
mobile_url: [->{ @hash["mobileurl"]["_content"] }],
|
17
|
+
first_photo_taken: [->{ @hash["photos"]["firstdatetaken"]["_content"] }],
|
18
|
+
first_photo_uploaded: [->{ @hash["photos"]["firstdate"]["_content"] }],
|
19
|
+
photos_count: [->{ @hash["photos"]["count"]["_content"] }],
|
20
|
+
photo_views_count: [->{ @hash["photos"]["views"]["_content"] }],
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Photo < Media
|
3
|
+
self.attribute_values = attribute_values.merge(
|
4
|
+
rotation: [->{ @hash["rotation"] }],
|
5
|
+
source_url: [
|
6
|
+
->{ @hash["url_#{SIZES[size]}"] },
|
7
|
+
->{ @hash["size"].find { |hash| hash["label"] == OTHER_SIZES[size] }["source"] }
|
8
|
+
],
|
9
|
+
height: [
|
10
|
+
->{ @hash["height_#{SIZES[size]}"] },
|
11
|
+
->{ @hash["size"].find { |hash| hash["label"] == OTHER_SIZES[size] }["height"] }
|
12
|
+
],
|
13
|
+
width: [
|
14
|
+
->{ @hash["width_#{SIZES[size]}"] },
|
15
|
+
->{ @hash["size"].find { |hash| hash["label"] == OTHER_SIZES[size] }["width"] }
|
16
|
+
],
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Set < Object
|
3
|
+
self.attribute_values = {
|
4
|
+
owner: [-> { {"id" => @hash.fetch("owner"), "username" => @hash["username"]} }],
|
5
|
+
url: [-> { "http://www.flickr.com/photos/#{owner.id}/sets/#{id}/" }],
|
6
|
+
media_count: [-> { @hash["photos"] }],
|
7
|
+
views_count: [-> { @hash["count_views"] }],
|
8
|
+
comments_count: [-> { @hash["count_comments"] }],
|
9
|
+
photos_count: [-> { @hash["count_photos"] }, -> { @hash["photos"] }],
|
10
|
+
videos_count: [-> { @hash["count_videos"] }, -> { @hash["videos"] }],
|
11
|
+
title: [-> { @hash["title"]["_content"] }],
|
12
|
+
description: [-> { @hash["description"]["_content"] }],
|
13
|
+
permissions: [-> { @hash.slice("can_comment") }],
|
14
|
+
created_at: [-> { @hash["date_create"] }],
|
15
|
+
updated_at: [-> { @hash["date_update"] }],
|
16
|
+
primary_media: [-> { {"id" => @hash.fetch("primary")} }],
|
17
|
+
primary_photo: [-> { {"id" => @hash.fetch("primary")} }],
|
18
|
+
primary_video: [-> { {"id" => @hash.fetch("primary")} }],
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Flickr
|
2
|
+
class UploadTicket < Object
|
3
|
+
self.attribute_values = {
|
4
|
+
status: [->{ @hash["complete"] }],
|
5
|
+
invalid?: [->{ @hash["invalid"] || 0 }],
|
6
|
+
media: [->{ {"id" => @hash.fetch("photoid")} }],
|
7
|
+
photo: [->{ {"id" => @hash.fetch("photoid")} }],
|
8
|
+
video: [->{ {"id" => @hash.fetch("photoid")} }],
|
9
|
+
}
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Flickr
|
2
|
+
class Video < Media
|
3
|
+
self.attribute_values = attribute_values.merge(
|
4
|
+
ready?: [->{ @hash["video"]["ready"] }],
|
5
|
+
failed?: [->{ @hash["video"]["failed"] }],
|
6
|
+
pending?: [->{ @hash["video"]["pending"] }],
|
7
|
+
duration: [->{ @hash["video"]["duration"] }],
|
8
|
+
width: [->{ @hash["video"]["width"] }],
|
9
|
+
height: [->{ @hash["video"]["height"] }],
|
10
|
+
thumbnail_url: [
|
11
|
+
->(size){ @hash["url_#{SIZES[size]}"] },
|
12
|
+
->(size){ @hash["size"].find { |hash| hash["label"] == OTHER_SIZES[size] }["source"] }
|
13
|
+
],
|
14
|
+
thumbnail_width: [
|
15
|
+
->(size){ @hash["width_#{SIZES[size]}"] },
|
16
|
+
->(size){ @hash["size"].find { |hash| hash["label"] == OTHER_SIZES[size] }["width"] }
|
17
|
+
],
|
18
|
+
thumbnail_height: [
|
19
|
+
->(size){ @hash["height_#{SIZES[size]}"] },
|
20
|
+
->(size){ @hash["size"].find { |hash| hash["label"] == OTHER_SIZES[size] }["height"] }
|
21
|
+
],
|
22
|
+
source_url: [->{ @hash["size"].find { |hash| hash["label"] == "Video Player" }["source"] }],
|
23
|
+
download_url: [->{ @hash["size"].find { |hash| hash["label"] == "Site MP4" }["source"] }],
|
24
|
+
mobile_download_url: [->{ @hash["size"].find { |hash| hash["label"] == "Mobile MP4" }["source"] }],
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|