flickr.py
author Dmitriy Morozov <morozov@cs.duke.edu>
Sat, 29 Mar 2008 07:06:33 -0400
changeset 1 0683f22a97d5
parent 0 544081ddbb13
child 3 f8daad0248d8
permissions -rw-r--r--
All the basic functionality is in place

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_s.jpg' % \
                (self.xml['farm'], self.xml['server'], self.xml['primary'], self.xml['secret'])
    
    def filename(self):
        return '%s_%s_s.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 id(self):
        return self.xml['id']

    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.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.id())
        self.tags = []
        try:
            self.tags = [t['raw'] for t in self.info.photo[0].tags[0].tag]
        except:
            pass

    def getTags(self):
        if not self.info: self.get_info()
        return self.tags

    def addTag(self, tag):
        if tag == '': return
        flickr.photos_addTags(photo_id = self.id(), tags = '"%s"' % tag)
        self.tags = self.tags + [tag]

    def rotate(self):
        res = flickr.photos_transform_rotate(photo_id = self.id(), degrees = 90)
        self.update(res)

    def is_public(self):
        if not self.info: self.get_info()
        if self.info.photo[0].visibility[0]['ispublic'] == '1': return True
        return False

    def toggle_public(self):
        if not self.info: self.get_info()
        if self.is_public(): set_public = '0'
        else: set_public = '1'
        res = flickr.photos_setPerms(photo_id = self.id(), is_public = set_public,
                                     is_friend = self.info.photo[0].visibility[0]['isfriend'], 
                                     is_family = self.info.photo[0].visibility[0]['isfamily'], 
                                     perm_comment = self.info.photo[0].permissions[0]['permcomment'], 
                                     perm_addmeta = self.info.photo[0].permissions[0]['permaddmeta'])
        self.update(res)

    def update(self, res):
        self.xml['secret'] = res.photoid[0]['secret']
        self.xml['originalsecret'] = res.photoid[0]['originalsecret']
        self.get_info()

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()