rflickr 2006.02.01
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/GETTING-STARTED +40 -0
- data/lib/flickr.rb +19 -0
- data/lib/flickr/auth.rb +76 -0
- data/lib/flickr/base.rb +793 -0
- data/lib/flickr/blogs.rb +30 -0
- data/lib/flickr/contacts.rb +48 -0
- data/lib/flickr/favorites.rb +59 -0
- data/lib/flickr/groups.rb +82 -0
- data/lib/flickr/interestingness.rb +19 -0
- data/lib/flickr/licenses.rb +23 -0
- data/lib/flickr/notes.rb +24 -0
- data/lib/flickr/people.rb +79 -0
- data/lib/flickr/photos.rb +285 -0
- data/lib/flickr/photosets.rb +104 -0
- data/lib/flickr/pools.rb +70 -0
- data/lib/flickr/reflection.rb +89 -0
- data/lib/flickr/tags.rb +59 -0
- data/lib/flickr/test.rb +19 -0
- data/lib/flickr/transform.rb +9 -0
- data/lib/flickr/upload.rb +205 -0
- data/lib/flickr/urls.rb +49 -0
- data/sample/album_test.rb +30 -0
- data/sample/comics-reorder.rb +16 -0
- data/sample/loadr.rb +80 -0
- data/sample/relatedness.rb +65 -0
- data/sample/setdumpr.rb +46 -0
- metadata +73 -0
data/lib/flickr/urls.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'flickr/base'
|
2
|
+
|
3
|
+
class Flickr::Urls < Flickr::APIBase
|
4
|
+
def getGroup(group)
|
5
|
+
group = group.nsid if group.class == Flickr::Group
|
6
|
+
res = @flickr.call_method('flickr.urls.getGroup',
|
7
|
+
'group_id' => group)
|
8
|
+
return res.elements['/group'].attributes['url']
|
9
|
+
end
|
10
|
+
|
11
|
+
def getUserPhotos(user)
|
12
|
+
user = user.nsid if user.respond_to?(:nsid)
|
13
|
+
args = {}
|
14
|
+
args['user_id'] = user if user
|
15
|
+
res = @flickr.call_method('flickr.urls.getUserPhotos',args)
|
16
|
+
return res.elements['/user'].attributes['url']
|
17
|
+
end
|
18
|
+
|
19
|
+
def getUserProfile(user)
|
20
|
+
user = user.nsid if user.respond_to?(:nsid)
|
21
|
+
args = {}
|
22
|
+
args['user_id'] = user if user
|
23
|
+
res = @flickr.call_method('flickr.urls.getUserProfile',args)
|
24
|
+
return res.elements['/user'].attributes['url']
|
25
|
+
end
|
26
|
+
|
27
|
+
def lookupGroup(url)
|
28
|
+
res = @flickr.call_method('flickr.urls.lookupGroup','url'=>url)
|
29
|
+
els = res.elements
|
30
|
+
nsid = els['/group'].attributes['id']
|
31
|
+
|
32
|
+
g = @flickr.group_cache_lookup(nsid) ||
|
33
|
+
Flickr::Group.new(@flickr,nsid,
|
34
|
+
els['/group/groupname'].text)
|
35
|
+
@flickr.group_cache_store(g)
|
36
|
+
return g
|
37
|
+
end
|
38
|
+
|
39
|
+
def lookupUser(url)
|
40
|
+
res = @flickr.call_method('flickr.urls.lookupUser','url'=>url)
|
41
|
+
els = res.elements
|
42
|
+
nsid = els['/user'].attributes['id']
|
43
|
+
p = @flickr.person_cache_lookup(nsid) ||
|
44
|
+
Flickr::Person.new(@flickr,nsid,
|
45
|
+
els['/user/username'].text)
|
46
|
+
@flickr.person_cache_store(p)
|
47
|
+
return p
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
t0 = Time.now
|
4
|
+
require 'flickr'
|
5
|
+
|
6
|
+
t1 = Time.now
|
7
|
+
|
8
|
+
flickr = Flickr.new('MY_TOKEN')
|
9
|
+
|
10
|
+
setname = ARGV.shift
|
11
|
+
|
12
|
+
sets = flickr.photosets.getList
|
13
|
+
t2 = Time.now
|
14
|
+
set = sets.find{|s| s.title == setname} # May be nil, we handle that later.
|
15
|
+
set &&= set.fetch
|
16
|
+
t3 = Time.now
|
17
|
+
set.each do |photo|
|
18
|
+
str =<<EOF
|
19
|
+
<a href="#{photo.url}"><img src="#{photo.url('s')}" alt="#{photo.title}"></a>
|
20
|
+
EOF
|
21
|
+
print str.strip+' '
|
22
|
+
end
|
23
|
+
t4 = Time.now
|
24
|
+
|
25
|
+
puts "\n\n\n"
|
26
|
+
puts "Library load: #{t1-t0} seconds"
|
27
|
+
puts "photosets.getList: #{t2-t1} seconds"
|
28
|
+
puts "Set fetching: #{t3-t2} seconds"
|
29
|
+
puts "Formatting: #{t4-t3} seconds"
|
30
|
+
puts "TOTAL: #{t4-t0} seconds"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'flickr'
|
4
|
+
|
5
|
+
flickr = Flickr.new('MY_TOKEN')
|
6
|
+
|
7
|
+
sets = flickr.photosets.getList
|
8
|
+
|
9
|
+
# Get the sets that AREN'T comics and put them at the start.
|
10
|
+
flickr.photosets.orderSets(sets.find_all { |set| !(set.title =~ /^Comics /) })
|
11
|
+
|
12
|
+
# Get the latest comic set and make its photos invisible (I assume
|
13
|
+
# that since this runs daily, we only need to do the latest
|
14
|
+
# set...otherwise find_all.each would do the trick.
|
15
|
+
set = sets.find { |set| set.title =~ /^Comics / }
|
16
|
+
set.fetch.each { |p| flickr.photos.setPerms(p,false,false,false,0,0) }
|
data/sample/loadr.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'flickr'
|
4
|
+
|
5
|
+
def filename_to_title(filename)
|
6
|
+
arr = filename.split(File::SEPARATOR).last.split('.')
|
7
|
+
arr.pop
|
8
|
+
my_title = arr.join('.')
|
9
|
+
end
|
10
|
+
|
11
|
+
flickr = Flickr.new('MY_TOKEN')
|
12
|
+
#flickr.debug = true
|
13
|
+
|
14
|
+
setname = ARGV.shift
|
15
|
+
description = ARGV.shift
|
16
|
+
|
17
|
+
sets = flickr.photosets.getList
|
18
|
+
set = sets.find{|s| s.title == setname} # May be nil, we handle that later.
|
19
|
+
set &&= set.fetch
|
20
|
+
|
21
|
+
# These are photos we may have already uploaded but may or may not have
|
22
|
+
# added to this set. A content-based signature would be better. MD5?
|
23
|
+
tot = flickr.photos.getNotInSet(nil,1).total
|
24
|
+
pg = 1
|
25
|
+
nis = []
|
26
|
+
while (tot > 0)
|
27
|
+
nis += flickr.photos.getNotInSet(nil,500,pg)
|
28
|
+
pg += 1
|
29
|
+
tot -= 500
|
30
|
+
end
|
31
|
+
eligible = (set ? set.fetch : []) + nis
|
32
|
+
to_upload = []
|
33
|
+
uploaded = []
|
34
|
+
ARGV.each do |filename|
|
35
|
+
my_title = filename_to_title(filename)
|
36
|
+
photo = eligible.find{|photo| photo.title==my_title}
|
37
|
+
photo ? uploaded << photo : to_upload << filename
|
38
|
+
end
|
39
|
+
|
40
|
+
##uploaded += to_upload.map do |fname|
|
41
|
+
## $stderr.puts "Uploading #{fname}..."
|
42
|
+
## flickr.photos.getInfo(flickr.photos.upload.upload_file(fname))
|
43
|
+
##end
|
44
|
+
|
45
|
+
tix = to_upload.map do |fname|
|
46
|
+
$stderr.puts "Uploading #{fname}..."
|
47
|
+
flickr.photos.upload.upload_file_async(fname)
|
48
|
+
end
|
49
|
+
|
50
|
+
tix = flickr.photos.upload.checkTickets(tix)
|
51
|
+
while(tix.find_all{|t| t.complete==:incomplete }.length > 0)
|
52
|
+
sleep 2
|
53
|
+
puts "Checking on the following tickets: "+
|
54
|
+
tix.map{|t| "#{t.id} (#{t.complete})"}.join(', ')
|
55
|
+
tix = flickr.photos.upload.checkTickets(tix)
|
56
|
+
end
|
57
|
+
|
58
|
+
failed = tix.find_all{|t| t.complete == :failed}
|
59
|
+
failed.each { |f| $stderr.puts "Failed to upload #{to_upload[tix.index(f)]}." }
|
60
|
+
0.upto(tix.length - 1) { |n| puts "#{to_upload[n]}\t#{tix[n].photoid}" }
|
61
|
+
|
62
|
+
uploaded += tix.find_all{|t| t.complete == :completed}.map do |ticket|
|
63
|
+
flickr.photos.getInfo(ticket.photoid)
|
64
|
+
end
|
65
|
+
uploaded.each do |photo|
|
66
|
+
if set
|
67
|
+
set << photo unless set.find{|ph| ph.id == photo.id}
|
68
|
+
else
|
69
|
+
set = flickr.photosets.create(setname,photo,description)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Refresh the list
|
74
|
+
set = set.fetch
|
75
|
+
ARGV.each do |filename|
|
76
|
+
my_title = filename_to_title(filename)
|
77
|
+
photo = uploaded.find{|ph| ph.title == my_title}
|
78
|
+
puts "PIC=#{filename}\t#{photo.id}\t#{photo.url}" if photo
|
79
|
+
end
|
80
|
+
puts "SET=#{set.url}"
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'flickr'
|
4
|
+
|
5
|
+
class Flickr::Relatedness
|
6
|
+
attr_reader :photos
|
7
|
+
|
8
|
+
def initialize(photo)
|
9
|
+
@photo = photo
|
10
|
+
@threads = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def calc_relatedness
|
14
|
+
@threads.each { |th| th.kill }
|
15
|
+
@threads = []
|
16
|
+
@photos = {}
|
17
|
+
walk_tree(0,@photo)
|
18
|
+
thread_join
|
19
|
+
@photos = @photos.sort{|a,b| b[1]<=>a[1]}.map{|a|
|
20
|
+
Flickr::Photo.new(@photo.flickr,a[0]) }
|
21
|
+
return self
|
22
|
+
end
|
23
|
+
|
24
|
+
def [](i,j=nil)
|
25
|
+
return j ? @photos[i,j] : @photos[i]
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def thread_dead_collect
|
31
|
+
threads = @threads.dup
|
32
|
+
threads.each { |th| @threads.delete(th) unless th.alive? }
|
33
|
+
end
|
34
|
+
|
35
|
+
def thread_join(max = 0)
|
36
|
+
threads = @threads.dup
|
37
|
+
threads.each do |th|
|
38
|
+
@threads.delete(th)
|
39
|
+
th.join
|
40
|
+
break if @threads.length <= max
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def walk_tree(depth,photo)
|
45
|
+
photo.contexts.each do |ctx|
|
46
|
+
# thread_join(10) if @threads.length >= 20
|
47
|
+
p = proc {
|
48
|
+
$stderr.puts "#{ctx.title} (#{ctx.class})"
|
49
|
+
set = ctx.fetch
|
50
|
+
set.each do |ph|
|
51
|
+
walk_tree(depth-1,ph) if depth > 0
|
52
|
+
@photos[ph.id] ||= 0
|
53
|
+
@photos[ph.id] += 1
|
54
|
+
end
|
55
|
+
}
|
56
|
+
thread_dead_collect
|
57
|
+
if @threads.length >= 20
|
58
|
+
p.call
|
59
|
+
else
|
60
|
+
th = Thread.new { p.call }
|
61
|
+
@threads << th
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/sample/setdumpr.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Dump a Ruby marshalled file of all photos by set (and not in set)
|
3
|
+
|
4
|
+
require 'flickr'
|
5
|
+
|
6
|
+
flickr = Flickr.new('MY_TOKEN')
|
7
|
+
allsets = flickr.photosets.getList
|
8
|
+
|
9
|
+
filename = ARGV.shift or raise Exception.new('Need output filename')
|
10
|
+
|
11
|
+
# This really won't hack it if you have more than 500, but then you're
|
12
|
+
# probably not using this. I am.
|
13
|
+
notinsets = flickr.photos.getNotInSet(nil,500)
|
14
|
+
|
15
|
+
# Stripped down analog of the Flickr::Photo class
|
16
|
+
PhotoInfo = Struct.new('PhotoInfo',:title,:id,:secret,:server)
|
17
|
+
|
18
|
+
sethash = {}
|
19
|
+
allsets.each do |set|
|
20
|
+
set = flickr.photosets.getInfo(set)
|
21
|
+
photohash = {}
|
22
|
+
seturl = "http://www.flickr.com/photos/#{set.owner}/sets/#{set.id}"
|
23
|
+
sethash[set.title] = [seturl,photohash]
|
24
|
+
flickr.photosets.getPhotos(set).each do |photo|
|
25
|
+
phi = PhotoInfo.new
|
26
|
+
phi.title = photo.title
|
27
|
+
phi.secret = photo.secret
|
28
|
+
phi.server = photo.server
|
29
|
+
phi.id = photo.id
|
30
|
+
photohash[phi.title] = phi
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
photohash = {}
|
35
|
+
sethash[nil] = photohash
|
36
|
+
notinsets.each do |photo|
|
37
|
+
phi = PhotoInfo.new
|
38
|
+
phi.title = photo.title
|
39
|
+
phi.secret = photo.secret
|
40
|
+
phi.server = photo.server
|
41
|
+
phi.id = photo.id
|
42
|
+
photohash[phi.title] = phi
|
43
|
+
end
|
44
|
+
|
45
|
+
#$stderr.puts sethash.inspect
|
46
|
+
File.open(filename,'w') { |f| Marshal.dump(sethash,f) }
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11
|
3
|
+
specification_version: 1
|
4
|
+
name: rflickr
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 2006.02.01
|
7
|
+
date: 2006-02-02 00:00:00 -05:00
|
8
|
+
summary: Ruby interface to the Flickr API
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: tschroed@zweknu.org
|
12
|
+
homepage: http://rubyforge.org/projects/rflickr/
|
13
|
+
rubyforge_project: rflickr
|
14
|
+
description: rflickr is a Ruby implementation of the Flickr API. It includes a faithful reproduction of the published API as well as method encapsulation to provide more useful object mappings. rflickr features result caching to improve performance.
|
15
|
+
autorequire: rake
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: false
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
-
|
22
|
+
- ">"
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.0.0
|
25
|
+
version:
|
26
|
+
platform: ruby
|
27
|
+
signing_key:
|
28
|
+
cert_chain:
|
29
|
+
authors: []
|
30
|
+
files:
|
31
|
+
- lib/flickr.rb
|
32
|
+
- lib/flickr/auth.rb
|
33
|
+
- lib/flickr/blogs.rb
|
34
|
+
- lib/flickr/contacts.rb
|
35
|
+
- lib/flickr/favorites.rb
|
36
|
+
- lib/flickr/groups.rb
|
37
|
+
- lib/flickr/licenses.rb
|
38
|
+
- lib/flickr/notes.rb
|
39
|
+
- lib/flickr/people.rb
|
40
|
+
- lib/flickr/photos.rb
|
41
|
+
- lib/flickr/photosets.rb
|
42
|
+
- lib/flickr/pools.rb
|
43
|
+
- lib/flickr/reflection.rb
|
44
|
+
- lib/flickr/tags.rb
|
45
|
+
- lib/flickr/test.rb
|
46
|
+
- lib/flickr/transform.rb
|
47
|
+
- lib/flickr/upload.rb
|
48
|
+
- lib/flickr/urls.rb
|
49
|
+
- lib/flickr/base.rb
|
50
|
+
- lib/flickr/interestingness.rb
|
51
|
+
- sample/album_test.rb
|
52
|
+
- sample/comics-reorder.rb
|
53
|
+
- sample/loadr.rb
|
54
|
+
- sample/relatedness.rb
|
55
|
+
- sample/setdumpr.rb
|
56
|
+
- GETTING-STARTED
|
57
|
+
test_files: []
|
58
|
+
rdoc_options: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
executables: []
|
61
|
+
extensions: []
|
62
|
+
requirements: []
|
63
|
+
dependencies:
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: mime-types
|
66
|
+
version_requirement:
|
67
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
68
|
+
requirements:
|
69
|
+
-
|
70
|
+
- ">"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 0.0.0
|
73
|
+
version:
|