flickr.py
author Dmitriy Morozov <morozov@cs.duke.edu>
Sat, 29 Mar 2008 05:23:36 -0400
changeset 0 544081ddbb13
child 1 0683f22a97d5
permissions -rw-r--r--
Initial commit

import flickrapi
import os, urllib2

api_key =    'b323b13ee741f5c97bc8b94d2ad388fa'
api_secret = '363b542a1a14fffa'

flickr = flickrapi.FlickrAPI(api_key, api_secret)

def authenticate(message):
    (token, frob) = flickr.get_token_part_one(perms = 'write')
    if not token: message('Please authorize this program in the browser, and then continue')
    flickr.get_token_part_two((token,frob))

# Get photosets (list their IDs, names, and URLs)
def photosets(user = None):
    sets = flickr.photosets_getList(user = user)
    return [Set(s) for s in sets.photosets[0].photoset]

# Get photos from the first set
def photos(id):
    pics = flickr.photosets_getPhotos(photoset_id = id)
    return [Photo(p) for p in pics.photoset[0].photo]

# Get all tags
def tags():
    rawtags = flickr.tags_getListUserRaw()
    tags = {}
    for t in rawtags.who[0].tags[0].tag:
        tags[t['clean']] = t.raw[0].text
    return tags
    
def get_photo(working_path, url, filename, force):
    path = os.path.join(working_path, filename)
    if not os.path.exists(path) or force:
        i = urllib2.urlopen(url)
        o = file(path, 'wb')
        o.write(i.read())
        o.close()
    return path

class Set:
    def __init__(self, xml):
        self.xml = xml

    def url(self):
        return 'http://farm%s.static.flickr.com/%s/%s_%s_t.jpg' % \
                (self.xml['farm'], self.xml['server'], self.xml['primary'], self.xml['secret'])
    
    def filename(self):
        return '%s_%s_t.jpg' % (self.xml['primary'], self.xml['secret'])

    def id(self):
        return self.xml['id']

    def name(self):
        return self.xml.title[0].text

    def get_photo(self, working_path):
        return get_photo(working_path, self.url(), self.filename(), False)


class Photo:
    def __init__(self, xml):
        self.xml = xml
        self.info = None

    def url(self, size = 't'):
        return 'http://farm%s.static.flickr.com/%s/%s' % \
               (self.xml['farm'], self.xml['server'], self.filename(size))
    
    def filename(self, size = ''):
        if size != '': size = '_' + size
        return '%s_%s%s.jpg' % (self.xml['id'], self.xml['secret'], size)

    def get(self, working_path, size, force = False):
        return get_photo(working_path, self.url(size), self.filename(size), force)

    def get_info(self):
        self.info = flickr.photos_getInfo(photo_id = self.xml['id'])

    def tags(self):
        if not self.info: self.get_info()
        if not self.info.photo[0].tags[0].xml: return []
        return [t['raw'] for t in self.info.photo[0].tags[0].tag]

    def rotate(self):
        res = flickr.photos_transform_rotate(photo_id = self.xml['id'], degrees = 90)
        self.xml['secret'] = res.photoid[0]['secret']
        self.xml['originalsecret'] = res.photoid[0]['originalsecret']


if __name__ == "__main__":
    authenticate(raw_input)
    sets = photosets()
    for s in sets: print "%s: %s" % (s.name(), s.url())
    pics = photos(sets[0])
    for p in pics: 
        print p.url()