Net::Flickrをインストールしたら、flickr.photos.getInfoメソッドが実装されてなかったので良い機会なので実装してみた。

flickr apiをrubyで使う – replore的日記がとても参考になった。

FlickrAPIは普通にRESTなので、REXMLで取得してparseする。

今回自分で実装したのはgeotagまわりのため。FlickrのAPIの仕様でtagは小数点やハイフンが消されるので、その元の値を取るのにgetInfoメソッドが必要になる。Tagオブジェクトのrawからアクセスできるようにした。

使い方はphoto_idをコンストラクタに渡す。

info = PhotoInfo.new(photo_id)

info.tags.each{ |tag|

puts tag.raw

}

flickr-photos-getInfo.rb

require’open-uri’

require’rexml/document’

require’cgi’

FLICKR_API_KEY=’your-api-key’

defflickr_call(method_name,arg_map={}.freeze)

args=arg_map.collect{|k,v|CGI.escape(k)<<'='<
url=”http://www.flickr.com/services/rest/?api_key=%s&method=%s&%s”%

[FLICKR_API_KEY,method_name,args]

doc=REXML::Document.new(open(url).read)

end

classPhotoInfo

@xml_doc

definitialize(photo_id)

@xml_doc=flickr_call(‘flickr.photos.getInfo’,’photo_id’=>photo_id)

end

deftags

tag_list=Array.new

REXML::XPath.each(@xml_doc,’//tag’){|tag|

tag_list<
‘id’=>REXML::XPath.first(tag,’attribute::id’),

‘author’=>REXML::XPath.first(tag,’attribute::author’),

‘raw’=>REXML::XPath.first(tag,’attribute::raw’),

‘tag’=>tag.text

)

}

returntag_list

end

end

classTag

definitialize(args)

@id=args[‘id’]

@author=args[‘author’]

@raw=args[‘raw’]

@tag=args[‘tag’]

end



defid

@id

end



defauthor

@author.to_s

end



defraw

@raw.to_s

end



deftag

@tag.to_s

end



defis_machine

if@tag=~/.+:.+=.+/

returntrue

else

returnfalse

end

end



defis_geo

if@tag=~/geo:.+=.+/

returntrue

else

returnfalse

end



end

end