Skip to content

Instantly share code, notes, and snippets.

@jacobo
Created July 21, 2014 17:20
Show Gist options
  • Save jacobo/61ebfe11e5792393d1ba to your computer and use it in GitHub Desktop.
Save jacobo/61ebfe11e5792393d1ba to your computer and use it in GitHub Desktop.
flickring
require 'flickraw'
FlickRaw.api_key= "SECRET"
FlickRaw.shared_secret="SECRET"
def reauth
token = flickr.get_request_token
auth_url = flickr.get_authorize_url(token['oauth_token'], :perms => 'write')
puts auth_url
verify = gets #"123-123-123"
begin
flickr.get_access_token(token['oauth_token'], token['oauth_token_secret'], verify)
login = flickr.test.login
puts "You are now authenticated as #{login.username} with token #{flickr.access_token} and secret #{flickr.access_secret}"
rescue FlickRaw::FailedResponse => e
puts "Authentication failed : #{e.msg}"
end
end
def accumulate(&block)
fetched = []
page = 1
continues = 2
while continues > 0
this_fetch = block.call(page)
next_set = this_fetch.to_a.map{|x| x["id"]} - fetched
puts next_set.size
page += 1
if next_set.size > 0
fetched += next_set
else
continues -= 1
end
end
fetched
end
def gettagged(tag)
accumulate do |page|
flickr.photos.search(user_id: "birdswell", page: page, per_page: 500, tags: tag)
end
end
def getall
accumulate do |page|
flickr.photos.search(user_id: "birdswell", page: page, per_page: 500)
end
end
def getset(photoset_id)
accumulate do |page|
flickr.photosets.getPhotos(photoset_id: photoset_id, page: page, per_page: 500)["photo"]
end
end
def getmachinetagged(tag)
accumulate do |page|
flickr.photos.search(user_id: "birdswell", page: page, per_page: 500, machine_tags: tag)
end
end
def refresh
allphotos = getall.map{|x| x["id"]}.shuffle
puts "allphotos #{allphotos.size}"
setphotos = getset("72157645356290658").map{|x| x["id"]}
puts "setphotos #{setphotos.size}"
excludephotos = gettagged("noappletv").map{|x| x["id"]}
puts "excludephotos #{excludephotos.size}"
toadd = (allphotos - setphotos) - excludephotos
puts "toadd #{toadd.size}"
toremove = setphotos & excludephotos
puts "toremove #{toremove.size}"
toadd.each do |photo|
flickr.photosets.addPhoto(photo_id: photo, photoset_id: "72157645356290658")
end
toremove.each do |photo|
flickr.photosets.removePhoto(photoset_id: "72157645356290658", photo_id: photo)
end
flickr.photosets.reorderPhotos(photoset_id: "72157645356290658", photo_ids: (setphotos + toadd).shuffle.join(","))
end
def upload_with_retry(path)
photo = nil
begin
photo = flickr.upload_photo path
rescue => e
puts e.inspect
sleep 2
retry
end
if photo
md5 = `md5 -q #{path}`.strip
puts "tag #{photo} - #{md5}"
flickr.photos.addTags(photo_id: photo, tags: "hasmd5,hash:md5=#{md5}")
end
photo
end
def tagall
allphotos = getall; allphotos.size
taggedphotos = gettagged("hasmd5"); taggedphotos.size
untaggedphotos = allphotos - taggedphotos; untaggedphotos.size
puts "untaggedphotos #{untaggedphotos.size}"
work_q = Queue.new
untaggedphotos.each{|x| work_q.push x }
workers = (0...4).map do
Thread.new do
begin
while photo = work_q.pop(true)
current_tags = flickr.photos.getInfo(photo_id: photo)["tags"]
if current_tags.detect{|t| t["raw"][0,9] == "hash:md5="}
unless current_tags.detect{|t| t["raw"] == "hasmd5"}
flickr.photos.addTags(photo_id: photo, tags: "hasmd5")
end
else
size = flickr.photos.getSizes(photo_id: photo).detect{|s| s["label"] == "Original"}
source_url = size["source"]
md5 = `curl #{source_url} | md5`.strip
puts "tag #{photo} - #{md5}"
flickr.photos.addTags(photo_id: photo, tags: "hasmd5,hash:md5=#{md5}")
end
end
rescue ThreadError
end
end
end
workers.map(&:join)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment