Joseph Jude

Accessing Flickr Photos with Python

2008.06.29 / code / django /

Working python code to access flickr photos from python

Flickr lists few python libraries to access its API. Of these, I choose Beej's Python Flickr API. Probably the reason being it had extensive documentation (and it appeared first!).

Choosing the library was only one part. I had to spend most of the time (almost the whole of today) reading through the Flickr API. Once you understand the API, it becomes easy.

My requirement for S-I-P is pretty simple. Given a photo id, I need photo details (title, description), EXIF details and size details (thumbnail, original). To access Flickr API, you need to apply for a API Key.

Here is the simple program to access Flickr Info given a photo id. Most of it should be self explanatory. For more details, read through Flickr API documentation.

I'm still, relatively, a newbie in Python and Django. So if you think there could be a better way to do this, feel free to leave a comment.

def get_photo_info(api_key, photo_id): f = flickrapi.FlickrAPI(api_key)

title =[0].title[0].text
desc =[0].description[0].text
#url =[0].urls[0].url[0].text
tags = ' '.join(["%s" % (tag.text) for tag in[0].tags[0].tag])

exif = f.photos_getExif(photo_id=photo_id)
model =[0].exif[1].raw[0].text
date_taken =[0].exif[2].raw[0].text
exposure =[0].exif[4].raw[0].text
aperture =[0].exif[5].clean[0].text
exposure_prg =[0].exif[6].clean[0].text
iso =[0].exif[7].raw[0].text
exif_details = dict(model=model, date_taken=date_taken, exposure=exposure, aperture=aperture, exposure_prg = exposure_prg, iso=iso)

#getSize gets both size (thumbnails etc) and corresponding urls
sizes = f.photos_getSizes(photo_id=photo_id, format='json')
#there should be a better way to do the below
#flickr returns jsonflickrapi(....) as string
#i am retriving the values
sizes = simplejson.loads(sizes[14:-1])['sizes']['size']
for size in sizes:
    if size.has_key('label'):
        if size['label'] == 'Square':
            thumb_url    = size['url']
            thumb_height = size['height']
            thumb_width  = size['width']
            thumb_source = size['source']
        if size['label'] == 'Large':
            photo_url    = size['url']
            photo_height = size['height']
            photo_width  = size['width']
            photo_source = size['source']

thumb_details = dict(url=thumb_url, height=thumb_height, width = thumb_width, source=thumb_source)
photo_details = dict(url=photo_url, height = photo_height, width = photo_width, source=photo_source)

return dict(title=title, desc=desc, tags = tags, exif=exif_details, thumb=thumb_details, photo=photo_details)

Related Links:

Flickr API

API for getting Photo Information

API for getting Photo EXIF

API for getting Photo Sizes

Flickr JSON response

Thanks for reading. Would you please let others know by sharing in Twitter?