benschwarz-flickr-wrapper 0.1.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/README +7 -0
- data/flickr-wrapper.gemspec +15 -0
- data/lib/flickr-wrapper/base.rb +30 -0
- data/lib/flickr-wrapper/machine_tag.rb +24 -0
- data/lib/flickr-wrapper/photo.rb +52 -0
- data/lib/flickr-wrapper/photoset.rb +78 -0
- data/lib/flickr-wrapper/tag.rb +13 -0
- data/lib/flickr-wrapper/user.rb +40 -0
- data/lib/flickr-wrapper.rb +11 -0
- metadata +69 -0
data/README
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
A grassroots readonly flickr wrapper - Strictly for convenience
|
2
|
+
Not a full API, no groups, no community, who needs friends anyway?
|
3
|
+
|
4
|
+
If you want a full API, use the `flickr` gem hosted on Rubyforge, its
|
5
|
+
old but it was nailed with its 1.0 release.
|
6
|
+
|
7
|
+
Check the specs for usage
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "flickr-wrapper"
|
3
|
+
s.version = "0.1.0"
|
4
|
+
s.date = "2008-05-10"
|
5
|
+
s.summary = "A grassroots wrapper for flickr"
|
6
|
+
s.email = "ben@germanforblack.com"
|
7
|
+
s.homepage = "http://github.com/benschwarz/flickr-wrapper"
|
8
|
+
s.description = "A grassroots wrapper around flickr - Strictly for convenience"
|
9
|
+
s.authors = ["Ben Schwarz"]
|
10
|
+
s.files = ["README", "flickr-wrapper.gemspec", "lib/flickr-wrapper.rb", "lib/flickr-wrapper/base.rb", "lib/flickr-wrapper/machine_tag.rb", "lib/flickr-wrapper/photo.rb", "lib/flickr-wrapper/photoset.rb", "lib/flickr-wrapper/tag.rb", "lib/flickr-wrapper/user.rb"]
|
11
|
+
s.require_path = "lib"
|
12
|
+
|
13
|
+
# Deps
|
14
|
+
s.add_dependency("flickr-rest", ">= 0.0.1")
|
15
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Flickr::Base
|
2
|
+
attr_reader :user_id
|
3
|
+
|
4
|
+
def initialize(user_id)
|
5
|
+
@user_id = user_id
|
6
|
+
end
|
7
|
+
|
8
|
+
# Add some convenience class methods, lovley and general; sets, photos, tags and machine tags
|
9
|
+
|
10
|
+
# List all photo sets
|
11
|
+
def sets
|
12
|
+
Flickr::PhotoSet.list(self.user_id)
|
13
|
+
end
|
14
|
+
|
15
|
+
# This is a cheat, we're just going to search with no params.
|
16
|
+
# Maximum amount of photos flickr will let me return is 500
|
17
|
+
def photos
|
18
|
+
Flickr::Photo.list(self.user_id)
|
19
|
+
end
|
20
|
+
|
21
|
+
# List all tags
|
22
|
+
def tags
|
23
|
+
Flickr::Tag.list(self.user_id)
|
24
|
+
end
|
25
|
+
|
26
|
+
# List all machine tags
|
27
|
+
def machine_tags
|
28
|
+
Flickr::MachineTag.list(self.user_id)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Flickr::MachineTag < Flickr::Base #:nodoc
|
2
|
+
class Invalid < StandardError; end;
|
3
|
+
|
4
|
+
include Validatable
|
5
|
+
validates_presence_of :namespace, :predicate, :value
|
6
|
+
|
7
|
+
attr_accessor :namespace, :predicate, :value
|
8
|
+
|
9
|
+
def initialize(namespace, predicate, value)
|
10
|
+
@namespace, @predicate, @value = namespace, predicate, value
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.list(user_id)
|
14
|
+
(Flickr::Query.new(user_id).execute('flickr.tags.getListUser')/:tag).map {|tag| self.from_s tag.inner_text.to_s }.compact
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_s(string)
|
18
|
+
new($1, $2, $3) if string =~ /(.*)\:(.*)\=(.*)/
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
"#{namespace}:#{predicate}=#{value}"
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class Flickr::Photo < Flickr::Base
|
2
|
+
class Size < Struct.new :width, :height, :source, :url; end
|
3
|
+
|
4
|
+
attr_accessor :id, :title, :description, :tags, :machine_tags, :taken, :posted, :caller
|
5
|
+
|
6
|
+
def initialize(id, title, description)
|
7
|
+
@id, @title, @description = id, title, description
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.list(user_id)
|
11
|
+
search(user_id)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Find will grab all sizes of images, process the tags and standard attributes of a photo
|
15
|
+
def self.find(user_id, id)
|
16
|
+
photo_call = Flickr::Query.new(user_id).execute('flickr.photos.getInfo', :photo_id => id)
|
17
|
+
|
18
|
+
# Set basic attributes
|
19
|
+
photo = self.new(id, *%w(title description).map {|a| (photo_call/a).inner_text })
|
20
|
+
photo.taken = Time.parse(photo_call.at(:dates)['taken'])
|
21
|
+
photo.posted = Time.at(photo_call.at(:dates)['posted'].to_i)
|
22
|
+
|
23
|
+
# Set tags for photo
|
24
|
+
photo.tags = (photo_call/"tag[@machine_tag=0]").map{|tag| Flickr::Tag.new tag['raw'] }
|
25
|
+
photo.machine_tags = (photo_call/"tag[@machine_tag=1]").map{|tag| Flickr::MachineTag.from_s tag['raw'] }
|
26
|
+
|
27
|
+
return photo
|
28
|
+
end
|
29
|
+
|
30
|
+
# Find a collection of photos by text
|
31
|
+
# Search options should be hashes with string values or arrays for multiple values
|
32
|
+
def self.search(user_id, search_options={})
|
33
|
+
parse(user_id, Flickr::Query.new(user_id).execute('flickr.photos.search', search_options))
|
34
|
+
end
|
35
|
+
|
36
|
+
def sizes
|
37
|
+
hash = {}
|
38
|
+
(Flickr::Query.new(user_id).execute('flickr.photos.getSizes', :photo_id => id)/:size).each do |size|
|
39
|
+
hash[size['label'].downcase.to_sym] = Size.new(*%w(width height source url).map{|a| size[a]})
|
40
|
+
end
|
41
|
+
hash
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
# Parse applies Hpricot to the photos and maps them to a Photo class instance
|
46
|
+
def self.parse(user_id, collection)
|
47
|
+
photos = (collection/:photo)
|
48
|
+
photos.empty? ? [] : photos.map do |photo|
|
49
|
+
self.find(user_id, photo[:id])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
class Flickr::PhotoSet < Flickr::Base
|
2
|
+
attr_accessor :id, :title, :description, :photo_count
|
3
|
+
|
4
|
+
def initialize id, title, description, photo_count
|
5
|
+
@id, @title, @description, @photo_count = id, title, description, photo_count
|
6
|
+
end
|
7
|
+
|
8
|
+
# Class methods require scope of the user, it is to be sent into the method
|
9
|
+
def self.list user_id
|
10
|
+
query = Flickr::Query.new user_id
|
11
|
+
parse(query.execute('flickr.photosets.getList'))
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get information regarding set by searching with the set's ID
|
15
|
+
def self.find user_id, id
|
16
|
+
# Keep scope of the user that made the call
|
17
|
+
@user_id = user_id
|
18
|
+
|
19
|
+
query = Flickr::Query.new(@user_id).execute('flickr.photosets.getInfo', :photoset_id => id)
|
20
|
+
# Find should return a single entity
|
21
|
+
parse(query).first
|
22
|
+
end
|
23
|
+
|
24
|
+
# Get the photos within a set
|
25
|
+
# Queries:
|
26
|
+
# > photosets.getPhotos (1 call)
|
27
|
+
# > Photo.find ID (n calls)
|
28
|
+
def photos
|
29
|
+
(Flickr::Query.new(user_id).execute('flickr.photosets.getPhotos', :photoset_id => id)/:photo).map do |photo|
|
30
|
+
Flickr::Photo.find user_id, photo[:id]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Return a list of tags for the set
|
35
|
+
# Queries:
|
36
|
+
# > photosets.getPhotos (1 call)
|
37
|
+
# > Photo.find ID (n calls)
|
38
|
+
def tags
|
39
|
+
tags = []
|
40
|
+
photos.each do |photo|
|
41
|
+
photo.tags.each do |tag|
|
42
|
+
tags << tag.value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
tags.uniq
|
46
|
+
end
|
47
|
+
|
48
|
+
# Return a list of machine_tags for the set
|
49
|
+
# Queries:
|
50
|
+
# > photosets.getPhotos (1 call)
|
51
|
+
# > Photo.find ID (n calls)
|
52
|
+
def machine_tags
|
53
|
+
tags = []
|
54
|
+
photos.each do |photo|
|
55
|
+
photo.machine_tags.each do |tag|
|
56
|
+
tags << tag
|
57
|
+
end
|
58
|
+
end
|
59
|
+
tags.uniq
|
60
|
+
end
|
61
|
+
|
62
|
+
# Search for photosets that have similar tags
|
63
|
+
def similar
|
64
|
+
sets = []
|
65
|
+
Flickr::PhotoSet.list(user_id).each do |set|
|
66
|
+
sets << set unless (self.tags & set.tags).empty? or set == self
|
67
|
+
end
|
68
|
+
sets.uniq
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
def self.parse collection
|
73
|
+
photosets = (collection/:photoset)
|
74
|
+
photosets.empty? ? [] : photosets.map do |set|
|
75
|
+
new(set[:id], (set/:title).inner_text, (set/:description).inner_text, set[:photos])
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Flickr::Tag < Flickr::Base
|
2
|
+
attr_accessor :value
|
3
|
+
|
4
|
+
def initialize(tag)
|
5
|
+
@value = tag
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.list(user_id)
|
9
|
+
(Flickr::Query.new(user_id).execute('flickr.tags.getListUser')/:tag).map { |tag|
|
10
|
+
self.new(tag.inner_text.to_s) if tag.inner_text.to_s =~ /^([a-zA-Z0-9_-]+)$/
|
11
|
+
}.compact
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class Flickr::User < Flickr::Base
|
2
|
+
attr_accessor :username, :nsid
|
3
|
+
|
4
|
+
def initialize username, nsid
|
5
|
+
@username, @nsid = username, nsid
|
6
|
+
end
|
7
|
+
|
8
|
+
#
|
9
|
+
# ==== Class methods
|
10
|
+
#
|
11
|
+
|
12
|
+
def self.find_by_email email
|
13
|
+
result = Flickr::Query.new('').execute('flickr.people.findByEmail', :find_email => email)
|
14
|
+
return Flickr::User.new(result.at(:username).inner_text, result.at(:user)['nsid'])
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# ==== Instance methods
|
19
|
+
#
|
20
|
+
|
21
|
+
def realname
|
22
|
+
get_info.at(:realname).inner_text
|
23
|
+
end
|
24
|
+
|
25
|
+
# The psyical location string as entered in flickr
|
26
|
+
def location
|
27
|
+
get_info.at(:location).inner_text || "Unknown"
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# ==== Private methods
|
32
|
+
#
|
33
|
+
|
34
|
+
private
|
35
|
+
# Get info for the user, once and once only
|
36
|
+
def get_info
|
37
|
+
@info = Flickr::Query.new(@nsid).execute('flickr.people.getInfo', :user_id => nsid) unless @info
|
38
|
+
@info
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Dependencies
|
2
|
+
require 'rubygems'
|
3
|
+
require 'flickr-rest'
|
4
|
+
require 'time'
|
5
|
+
require 'validatable'
|
6
|
+
|
7
|
+
# Namespace junkie
|
8
|
+
module Flickr; end
|
9
|
+
|
10
|
+
# Classes
|
11
|
+
%w(base photoset photo tag machine_tag user).each {|r| require File.join(File.dirname(__FILE__), 'flickr-wrapper', r)}
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: benschwarz-flickr-wrapper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ben Schwarz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-05-10 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: flickr-rest
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.0.1
|
23
|
+
version:
|
24
|
+
description: A grassroots wrapper around flickr - Strictly for convenience
|
25
|
+
email: ben@germanforblack.com
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
|
+
files:
|
33
|
+
- README
|
34
|
+
- flickr-wrapper.gemspec
|
35
|
+
- lib/flickr-wrapper.rb
|
36
|
+
- lib/flickr-wrapper/base.rb
|
37
|
+
- lib/flickr-wrapper/machine_tag.rb
|
38
|
+
- lib/flickr-wrapper/photo.rb
|
39
|
+
- lib/flickr-wrapper/photoset.rb
|
40
|
+
- lib/flickr-wrapper/tag.rb
|
41
|
+
- lib/flickr-wrapper/user.rb
|
42
|
+
has_rdoc: false
|
43
|
+
homepage: http://github.com/benschwarz/flickr-wrapper
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
version:
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.0.1
|
65
|
+
signing_key:
|
66
|
+
specification_version: 2
|
67
|
+
summary: A grassroots wrapper for flickr
|
68
|
+
test_files: []
|
69
|
+
|