#!/usr/bin/env python #test comment import sys from flickrapi import FlickrAPI # Autenticazione flickrAPIKey = "ea9b8730af07cd76f6dc4fde27744b74" # API key flickrSecret = "45dfeeb5abec1ff9" # shared "secret" gruppo='91264405@N00' # crea una istanza di FlickrAPI fapi = FlickrAPI(flickrAPIKey, flickrSecret) # ottieni un token valido token = fapi.getToken(browser="firefox", perms="write") rsp = fapi.auth_checkToken(api_key=flickrAPIKey, auth_token=token) fapi.testFailure(rsp) #grabba tutte le foto con il group id specificato rsp = fapi.groups_pools_getPhotos(auth_token=token,api_key=flickrAPIKey,group_id=gruppo) fapi.testFailure(rsp) for a in rsp.photos[0].photo: rsp = fapi.groups_pools_remove(api_key=flickrAPIKey,photo_id=a['id'],auth_token=token,group_id=gruppo) fapi.testFailure(rsp,exit=0)
class Shell(cmdln.Cmdln): r"""ci2 -- the new Code Intel, a tool for working with source code usage: ${name} SUBCOMMAND [ARGS...] ${name} help SUBCOMMAND ${option_list} ${command_list} ${help_list} """ name = "batchr" #XXX There is a bug in cmdln.py alignment when using this. Leave it off # until that is fixed. #helpindent = ' '*4 def _setup(self, opts): # flickr auth information: self.flickrAPIKey = os.environ['FLICKR_BATCHR_KEY'] self.flickrSecret = os.environ['FLICKR_BATCHR_SECRET'] try: gui = opts.gui except AttributeError: # really wish I could just test "gui" in opts gui = False self.progress = progressBar("Flickr Shell", indeterminate=True, gui=gui) self.progress.update("Logging In...") # make a new FlickrAPI instance self.fapi = FlickrAPI(self.flickrAPIKey, self.flickrSecret) # do the whole whatever-it-takes to get a valid token: self.token = self.fapi.getToken(browser="Firefox") def do_listsets(self, subcmd, opts, *args): """List set ids and set titles (with substring title matches)""" self._setup(opts) kw = dict(api_key=self.flickrAPIKey, auth_token=self.token) rsp = self.fapi.photosets_getList(**kw) self.fapi.testFailure(rsp) sets = rsp.photosets[0].photoset for set in sets: title = set.title[0].elementText match = True if args: match = False for word in args: if word.lower() in title.lower(): match = True break if match: print set['id']+':', title, '('+set['photos']+ " photos)" self.progress.finish() @cmdln.option("-b", "--base", dest="base", default="./photos", help="the directory we want to download to") @cmdln.option("-F", "--format", dest="format", help="the file layout format to use within the base directory (default is %(year)s/%(month_name)s/%(size)s/%(id)s.jpg", default="%(year)s/%(month_name)s/%(size)s/%(id)s.jpg") @cmdln.option("-f", "--force", action="store_true", help="force downloads even if files with same name already exist") @cmdln.option("-y", "--year", dest="year", type='int', help="the year we want backed up") @cmdln.option("-m", "--month", dest="month", type='int', help="the month we want backed up") @cmdln.option("-s", "--size", dest="size", default='-', nargs=1, help="the size we want downloaded: one of: s t m b - o") @cmdln.option("-t", "--test", action="store_true", help="Just get the URLs (don't download images) -- implies -l") @cmdln.option("--tags", help="Tags (separatead by commas)") @cmdln.option("-S", "--set", help="Set id (use listsets command to get them)") @cmdln.option("-l", "--list", action="store_true", help="List URLs being downloaded instead of using progress bar") @cmdln.option("--gui", action="store_true", help="use Cocoa progress bar on OS X") def do_download(self, subcmd, opts): """Download images based on search criteria (dates, tags, sets) ${cmd_usage} ${cmd_option_list} Any errors will be printed. Returns the number of errors (i.e. exit value is 0 if there are no consistency problems). """ urls = self._search(opts) self.progress.reset("Getting Photo Info") count = 0 downloadeds = 0 bad_ones = [] try: try: for (id, url, original_url, date_taken) in urls: year, month, day = parse_date_taken(date_taken) month_name = calendar.month_name[month] size = pretty_size[opts.size] filename = opts.format % locals() filename = join(opts.base, filename) extra_info = " (%s %s %s) " % (day, month_name, year) self.progress.update("Phase 2: Downloading: %d/%d " % (count+1, len(urls)), (count+1)/float(len(urls)), after_args=(extra_info,)) if opts.test: print "Would download (test):", url, "to", filename continue if not os.path.exists(filename): if opts.list: print "Downloading:", url tmpfile = os.path.join(opts.base, 'tempfile.jpg') try: os.makedirs(os.path.dirname(filename)) except OSError: pass f, headers = urllib.urlretrieve(url, tmpfile) if (headers['Content-Length'] == 2900 and headers['Content-Type'] == 'image/gif'): # first try the original size url = original_url print "GETTING ORIGINAL", url f, headers = urllib.urlretrieve(url, tmpfile) if (headers['Content-Length'] == 2900 and headers['Content-Type'] == 'image/gif'): # something's wrong print "SOMETHING's BAD", url os.unlink(tmpfile) bad_ones.append(url) else: # it's a good one. os.rename(tmpfile, filename) # set the ctime/mtime, just for fun! datetakentime = time.mktime(strptime(date_taken, "%Y-%m-%d %H:%M:%S")) os.utime(filename, (datetakentime, datetakentime)) downloadeds += 1 elif opts.list: print "Skipping (cached):", url count += 1 except KeyboardInterrupt: raise finally: if not opts.list: self.progress.update() print "Processed %d images" % count print "Downloaded %d images" % downloadeds if bad_ones: print "Some images could not be downloaded:" print '\n\t'.join(bad_ones) def _search(self, opts): base = opts.base if not os.path.exists(opts.base): print "Make sure the base directory: %s exists first" % opts.base sys.exit(2) if opts.test: opts.list = True global rsp # for debugging runs invoked with -i self._setup(opts) kw = dict(api_key=self.flickrAPIKey, auth_token=self.token, extras="date_taken", sort="date-taken-asc", per_page="500") if opts.set: kw.update(photoset_id=opts.set) search = "Getting photos in set (%s)" % opts.set self.progress.update(search) print search + ': ', sys.stdout.flush() photo_accessor = self.fapi.photosets_getPhotos rsp = photo_accessor(**kw) self.fapi.testFailure(rsp) payload = rsp.photoset[0] else: # time and/or tag-based searches if opts.month: year = opts.year or time.localtime(time.time())[0] monthStart = datetime.date(year, opts.month, 1) monthEnd = monthStart + datetime.timedelta(days=35) min_date = monthStart.isoformat() max_date = monthEnd.isoformat() else: startyear = opts.year or 1900 endyear = opts.year or time.localtime(time.time())[0]+1 monthStart = datetime.date(startyear, 1, 1) monthEnd = datetime.date(endyear+1, 1, 1) min_date = monthStart.isoformat() max_date = monthEnd.isoformat() print min_date, max_date if opts.year: if opts.month: search = "Searching for photos taken in %s %s" % (calendar.month_name[opts.month], opts.year) else: search = "Searching for photos taken in %s" % opts.year else: search = "Searching for photos (all dates)" if opts.tags: search += " tagged: " + opts.tags kw.update(user_id="me", min_taken_date=min_date, max_taken_date=max_date) if opts.tags: kw['tags'] = opts.tags self.progress.update(search) print search + ': ', sys.stdout.flush() photo_accessor = self.fapi.photos_search rsp = photo_accessor(**kw) self.fapi.testFailure(rsp) payload = rsp.photos[0] self.progress.finish() pages = payload['pages'] if pages == '0': print "no photos found" return [] num_photos = int(payload['total']) print "found %d photos (getting data)" % num_photos urls = extract_urls(payload.photo, opts.size) self.progress.reset('Flickr Download') for page in range(2, int(pages)+1): kw['page'] = str(page) rsp = photo_accessor(**kw) self.fapi.testFailure(rsp) if opts.set: payload = rsp.photoset[0] else: payload = rsp.photos[0] urls.extend(extract_urls(payload.photo, opts.size)) self.progress.update("Phase 1: Getting info about batch %d of %d " % (page, int(pages)), page/float(pages)) print return urls
import sys from flickrapi import FlickrAPI import wx # Autenticazione flickrAPIKey = "ea9b8730af07cd76f6dc4fde27744b74" # API key flickrSecret = "45dfeeb5abec1ff9" # shared "secret" # crea una istanza di FlickrAPI fapi = FlickrAPI(flickrAPIKey, flickrSecret) # ottieni un token valido if sys.platform == 'win32': token = fapi.getToken(browser="C:\\Progra~1\\Intern~1\\iexplore.exe", perms="write") else: token = fapi.getToken(browser="firefox", perms="write") rsp = fapi.auth_checkToken(api_key=flickrAPIKey, auth_token=token) fapi.noExitTestFailure(rsp) user_id = rsp.auth[0].user[0]['nsid'] #################sux def create(parent): return Frame1(parent) [wxID_FRAME1, wxID_FRAME1CHOICE1, wxID_FRAME1CHOICE2, wxID_FRAME1INTESTAZIONE, wxID_FRAME1OKBUTTON, wxID_FRAME1STATUSBAR1, ] = [wx.NewId() for _init_ctrls in range(6)]
class Shell(cmdln.Cmdln): r"""ci2 -- the new Code Intel, a tool for working with source code usage: ${name} SUBCOMMAND [ARGS...] ${name} help SUBCOMMAND ${option_list} ${command_list} ${help_list} """ name = "batchr" #XXX There is a bug in cmdln.py alignment when using this. Leave it off # until that is fixed. #helpindent = ' '*4 def _setup(self, opts): # flickr auth information: self.flickrAPIKey = os.environ['FLICKR_BATCHR_KEY'] self.flickrSecret = os.environ['FLICKR_BATCHR_SECRET'] try: gui = opts.gui except AttributeError: # really wish I could just test "gui" in opts gui = False self.progress = progressBar("Flickr Shell", indeterminate=True, gui=gui) self.progress.update("Logging In...") # make a new FlickrAPI instance self.fapi = FlickrAPI(self.flickrAPIKey, self.flickrSecret) # do the whole whatever-it-takes to get a valid token: self.token = self.fapi.getToken(browser="Firefox") def do_listsets(self, subcmd, opts, *args): """List set ids and set titles (with substring title matches)""" self._setup(opts) kw = dict(api_key=self.flickrAPIKey, auth_token=self.token) rsp = self.fapi.photosets_getList(**kw) self.fapi.testFailure(rsp) sets = rsp.photosets[0].photoset for set in sets: title = set.title[0].elementText match = True if args: match = False for word in args: if word.lower() in title.lower(): match = True break if match: print set['id'] + ':', title, '(' + set['photos'] + " photos)" self.progress.finish() @cmdln.option("-b", "--base", dest="base", default="./photos", help="the directory we want to download to") @cmdln.option( "-F", "--format", dest="format", help= "the file layout format to use within the base directory (default is %(year)s/%(month_name)s/%(size)s/%(id)s.jpg", default="%(year)s/%(month_name)s/%(size)s/%(id)s.jpg") @cmdln.option( "-f", "--force", action="store_true", help="force downloads even if files with same name already exist") @cmdln.option("-y", "--year", dest="year", type='int', help="the year we want backed up") @cmdln.option("-m", "--month", dest="month", type='int', help="the month we want backed up") @cmdln.option("-s", "--size", dest="size", default='-', nargs=1, help="the size we want downloaded: one of: s t m b - o") @cmdln.option( "-t", "--test", action="store_true", help="Just get the URLs (don't download images) -- implies -l") @cmdln.option("--tags", help="Tags (separatead by commas)") @cmdln.option("-S", "--set", help="Set id (use listsets command to get them)") @cmdln.option( "-l", "--list", action="store_true", help="List URLs being downloaded instead of using progress bar") @cmdln.option("--gui", action="store_true", help="use Cocoa progress bar on OS X") def do_download(self, subcmd, opts): """Download images based on search criteria (dates, tags, sets) ${cmd_usage} ${cmd_option_list} Any errors will be printed. Returns the number of errors (i.e. exit value is 0 if there are no consistency problems). """ urls = self._search(opts) self.progress.reset("Getting Photo Info") count = 0 downloadeds = 0 bad_ones = [] try: try: for (id, url, original_url, date_taken) in urls: year, month, day = parse_date_taken(date_taken) month_name = calendar.month_name[month] size = pretty_size[opts.size] filename = opts.format % locals() filename = join(opts.base, filename) extra_info = " (%s %s %s) " % (day, month_name, year) self.progress.update("Phase 2: Downloading: %d/%d " % (count + 1, len(urls)), (count + 1) / float(len(urls)), after_args=(extra_info, )) if opts.test: print "Would download (test):", url, "to", filename continue if not os.path.exists(filename): if opts.list: print "Downloading:", url tmpfile = os.path.join(opts.base, 'tempfile.jpg') try: os.makedirs(os.path.dirname(filename)) except OSError: pass f, headers = urllib.urlretrieve(url, tmpfile) if (headers['Content-Length'] == 2900 and headers['Content-Type'] == 'image/gif'): # first try the original size url = original_url print "GETTING ORIGINAL", url f, headers = urllib.urlretrieve(url, tmpfile) if (headers['Content-Length'] == 2900 and headers['Content-Type'] == 'image/gif'): # something's wrong print "SOMETHING's BAD", url os.unlink(tmpfile) bad_ones.append(url) else: # it's a good one. os.rename(tmpfile, filename) # set the ctime/mtime, just for fun! datetakentime = time.mktime( strptime(date_taken, "%Y-%m-%d %H:%M:%S")) os.utime(filename, (datetakentime, datetakentime)) downloadeds += 1 elif opts.list: print "Skipping (cached):", url count += 1 except KeyboardInterrupt: raise finally: if not opts.list: self.progress.update() print "Processed %d images" % count print "Downloaded %d images" % downloadeds if bad_ones: print "Some images could not be downloaded:" print '\n\t'.join(bad_ones) def _search(self, opts): base = opts.base if not os.path.exists(opts.base): print "Make sure the base directory: %s exists first" % opts.base sys.exit(2) if opts.test: opts.list = True global rsp # for debugging runs invoked with -i self._setup(opts) kw = dict(api_key=self.flickrAPIKey, auth_token=self.token, extras="date_taken", sort="date-taken-asc", per_page="500") if opts.set: kw.update(photoset_id=opts.set) search = "Getting photos in set (%s)" % opts.set self.progress.update(search) print search + ': ', sys.stdout.flush() photo_accessor = self.fapi.photosets_getPhotos rsp = photo_accessor(**kw) self.fapi.testFailure(rsp) payload = rsp.photoset[0] else: # time and/or tag-based searches if opts.month: year = opts.year or time.localtime(time.time())[0] monthStart = datetime.date(year, opts.month, 1) monthEnd = monthStart + datetime.timedelta(days=35) min_date = monthStart.isoformat() max_date = monthEnd.isoformat() else: startyear = opts.year or 1900 endyear = opts.year or time.localtime(time.time())[0] + 1 monthStart = datetime.date(startyear, 1, 1) monthEnd = datetime.date(endyear + 1, 1, 1) min_date = monthStart.isoformat() max_date = monthEnd.isoformat() print min_date, max_date if opts.year: if opts.month: search = "Searching for photos taken in %s %s" % ( calendar.month_name[opts.month], opts.year) else: search = "Searching for photos taken in %s" % opts.year else: search = "Searching for photos (all dates)" if opts.tags: search += " tagged: " + opts.tags kw.update(user_id="me", min_taken_date=min_date, max_taken_date=max_date) if opts.tags: kw['tags'] = opts.tags self.progress.update(search) print search + ': ', sys.stdout.flush() photo_accessor = self.fapi.photos_search rsp = photo_accessor(**kw) self.fapi.testFailure(rsp) payload = rsp.photos[0] self.progress.finish() pages = payload['pages'] if pages == '0': print "no photos found" return [] num_photos = int(payload['total']) print "found %d photos (getting data)" % num_photos urls = extract_urls(payload.photo, opts.size) self.progress.reset('Flickr Download') for page in range(2, int(pages) + 1): kw['page'] = str(page) rsp = photo_accessor(**kw) self.fapi.testFailure(rsp) if opts.set: payload = rsp.photoset[0] else: payload = rsp.photos[0] urls.extend(extract_urls(payload.photo, opts.size)) self.progress.update( "Phase 1: Getting info about batch %d of %d " % (page, int(pages)), page / float(pages)) print return urls
def remap(line): if flickr.match(line): global fapi, token if fapi is None: fapi = FlickrAPI(flickrAPIKey, flickrSecret) token = fapi.getToken(browser="lynx") id = flickr.match(line).group(1) print " talking to Flickr about: ",id rsp = fapi.photos_getInfo(api_key=flickrAPIKey,auth_token=token,photo_id=id) fapi.testFailure(rsp) description = rsp.photo[0].description[0].elementText URL = rsp.photo[0].urls[0].url[0].elementText rsp = fapi.photos_getSizes(api_key=flickrAPIKey,auth_token=token,photo_id=id) fapi.testFailure(rsp) localbig = '' for x in rsp.sizes[0].size: if x.attrib['label'] == 'Large': localbig = x.attrib['source'].split('/')[-1] os.system('curl -o html/photos/%s "%s"' % (localbig, x.attrib['source'])) for x in rsp.sizes[0].size: #if x.attrib['label'] == 'Square': if x.attrib['label'] == 'Small': localpath = x.attrib['source'].split('/')[-1] big = '' if localbig != '': big = '[<a href="photos/%s">local</a>]' % localbig os.system('curl -o html/photos/%s "%s"' % (localpath, x.attrib['source'])) return '<div class="photo"><a href="%(url)s"><img src="%(src)s" height="%(height)s" width="%(width)s" alt="%(alt)s" /></a><div class="caption">%(caption)s%(localbig)s</div></div>' % \ {'src':'photos/%s'%localpath,#x.attrib['source'], 'height':x.attrib['height'], 'width':x.attrib['width'], 'caption': description, 'url':URL, 'alt':description, 'localbig':big } elif localphoto.match(line): m = localphoto.match(line) caption = m.group(1) id = m.group(2) thumb = id.split('.')[0] + '-thumb.jpeg' if not os.path.exists(thumb): cmd = 'convert -resize 240x240 ' + os.path.join(BASE,'photos/'+id) + ' ' + os.path.join(BASE,'photos/'+thumb) print cmd os.system(cmd) ## FIXME size probably wrong; figure out real size of ## thumbnail or at least whether its rotated or not return '<div class="photo"><a href="photos/%s"><img src="photos/%s" height="180" width="240" alt="%s" /></a><div class="caption">%s</div></div>' % (id, thumb, caption, caption) elif googledoc.match(line): url = googledoc.match(line).group(1) print " talking to Google about:",url html = googledocToHtml(urlopen(url).readlines()) return html elif resultdoc.match(line): name = resultdoc.match(line).group(1) url = resultdoc.match(line).group(2) print " talking to Google about results:",url html = resultdocToHtml(urlopen(url).readlines(), url, name) return html elif rideschedule.match(line): year = rideschedule.match(line).group(1).strip() region = rideschedule.match(line).group(2).strip().lower() if not year in ridelist.keys(): print " talking to Google about schedule:",year,region if int(year) > 2010: ridelist[year] = rideScheduleCsvToRideList(urlopen(PRELIM_RIDE_SCHEDULES[year]).readlines(), year) else: ridelist[year] = pre2010rideScheduleCsvToRideList(urlopen(PRELIM_RIDE_SCHEDULES[year]).readlines(), year) print year,ridelist[year] officialkey = region.strip().lower() + ':' + year.strip() if OFFICIAL_RIDE_SCHEDULES.has_key(officialkey): print " talking to Google about official schedule",year,region,OFFICIAL_RIDE_SCHEDULES[officialkey] if int(year.strip()) <= 2010: html = officialRideScheduleToHtml(urlopen(OFFICIAL_RIDE_SCHEDULES[officialkey]).readlines(), ridelist[year], year, region) else: html = officialRideListToHtml(ridelist[year], year, region) else: print "NO official ride schedule yet for",region,year,officialkey html = rideListToHtml(ridelist[year], region) return html elif membership.match(line): url = membership.match(line).group(1).strip() html = membershipToHtml(urlopen(url).readlines()) return html return line
class TransFlickr: extras = "original_format,date_upload,last_update" def __init__(self, browserName): self.fapi = FlickrAPI(flickrAPIKey, flickrSecret) self.user_id = "" # proceed with auth # TODO use auth.checkToken function if available, # and wait after opening browser. print "Authorizing with flickr..." log.info("authorizing with flickr...") try: self.authtoken = self.fapi.getToken(browser=browserName) except: print ("Can't retrieve token from browser %s" % browserName) print ("\tIf you're behind a proxy server," " first set http_proxy environment variable.") print "\tPlease close all your browser windows, and try again" log.error(format_exc()) log.error("can't retrieve token from browser %s", browserName) sys.exit(-1) if self.authtoken == None: print "Unable to authorize (reason unknown)" log.error('not able to authorize; exiting') sys.exit(-1) #Add some authorization checks here(?) print "Authorization complete." log.info('authorization complete') def uploadfile(self, filepath, taglist, bufData, mode): #Set public 4(always), 1(public). Public overwrites f&f. public = mode&1 #Set friends and family 4(always), 2(family), 1(friends). friends = mode>>3 & 1 family = mode>>4 & 1 #E.g. 745 - 4:No f&f, but 5:public #E.g. 754 - 5:friends, but not public #E.g. 774 - 7:f&f, but not public log.info("uploading file %s", filepath) log.info(" data length: %s", len(bufData)) log.info(" taglist: %s", taglist) log.info(" permissions: family %s, friends %s, public %s", family, friends, public) filename = os.path.splitext(os.path.basename(filepath))[0] rsp = self.fapi.upload(filename=filepath, jpegData=bufData, title=filename, tags=taglist, is_public=public and "1" or "0", is_friend=friends and "1" or "0", is_family=family and "1" or "0") if rsp is None: log.error("response None from attempt to write file %s", filepath) log.error("will attempt recovery...") recent_rsp = None trytimes = 2 while(trytimes): log.info("sleeping for 3 seconds...") time.sleep(3) trytimes -= 1 # Keep on trying to retrieve the recently uploaded photo, till we # actually get the information, or the function throws an exception. while(recent_rsp is None or not recent_rsp): recent_rsp = self.fapi.photos_recentlyUpdated( auth_token=self.authtoken, min_date='1', per_page='1') pic = recent_rsp.photos[0].photo[0] log.info('we are looking for %s', filename) log.info('most recently updated pic is %s', pic['title']) if filename == pic['title']: id = pic['id'] log.info("file %s uploaded with photoid %s", filepath, id) return id log.error("giving up; upload of %s appears to have failed", filepath) return None else: id = rsp.photoid[0].elementText log.info("file %s uploaded with photoid %s", filepath, id) return id def put2Set(self, set_id, photo_id): log.info("uploading photo %s to set id %s", photo_id, set_id) rsp = self.fapi.photosets_addPhoto(auth_token=self.authtoken, photoset_id=set_id, photo_id=photo_id) if rsp: log.info("photo uploaded to set") else: log.error(rsp.errormsg) def createSet(self, path, photo_id): log.info("creating set %s with primary photo %s", path, photo_id) path, title = os.path.split(path) rsp = self.fapi.photosets_create(auth_token=self.authtoken, title=title, primary_photo_id=photo_id) if rsp: log.info("created set %s", title) return rsp.photoset[0]['id'] else: log.error(rsp.errormsg) def deleteSet(self, set_id): log.info("deleting set %s", set_id) if str(set_id)=="0": log.info("ignoring attempt to delete set wtih set_id 0 (a locally " "created set that has not yet acquired an id via uploading") return rsp = self.fapi.photosets_delete(auth_token=self.authtoken, photoset_id=set_id) if rsp: log.info("deleted set %s", set_id) else: log.error(rsp.errormsg) def getPhotoInfo(self, photoId): log.debug("id: %s", photoId) rsp = self.fapi.photos_getInfo(auth_token=self.authtoken, photo_id=photoId) if not rsp: log.error("can't retrieve information about photo %s; got error %s", photoId, rsp.errormsg) return None #XXX: should see if there's some other 'format' option we can fall back to. try: format = rsp.photo[0]['originalformat'] except KeyError: format = 'jpg' perm_public = rsp.photo[0].visibility[0]['ispublic'] perm_family = rsp.photo[0].visibility[0]['isfamily'] perm_friend = rsp.photo[0].visibility[0]['isfriend'] if perm_public == '1': mode = 0755 else: b_cnt = 4 if perm_family == '1': b_cnt += 2 if perm_friend == '1': b_cnt += 1 mode = "07" + str(b_cnt) + "4" mode = int(mode) if hasattr(rsp.photo[0],'permissions'): permcomment = rsp.photo[0].permissions[0]['permcomment'] permaddmeta = rsp.photo[0].permissions[0]['permaddmeta'] else: permcomment = permaddmeta = [None] commMeta = '%s%s' % (permcomment,permaddmeta) # Required for chmod. desc = rsp.photo[0].description[0].elementText title = rsp.photo[0].title[0].elementText if hasattr(rsp.photo[0].tags[0], "tag"): taglist = [ a.elementText for a in rsp.photo[0].tags[0].tag ] else: taglist = [] license = rsp.photo[0]['license'] owner = rsp.photo[0].owner[0]['username'] ownerNSID = rsp.photo[0].owner[0]['nsid'] url = rsp.photo[0].urls[0].url[0].elementText posted = rsp.photo[0].dates[0]['posted'] lastupdate = rsp.photo[0].dates[0]['lastupdate'] return (format, mode, commMeta, desc, title, taglist, license, owner, ownerNSID, url, int(posted), int(lastupdate)) def setPerm(self, photoId, mode, comm_meta="33"): log.debug("id: %s, mode: %s, comm_meta=%s", photoId, mode, comm_meta) public = mode&1 #Set public 4(always), 1(public). Public overwrites f&f #Set friends and family 4(always), 2(family), 1(friends) friends = mode>>3 & 1 family = mode>>4 & 1 if len(comm_meta)<2: # This wd patch string index out of range bug, caused # because some photos may not have comm_meta value set. comm_meta="33" rsp = self.fapi.photos_setPerms(auth_token=self.authtoken, is_public=str(public), is_friend=str(friends), is_family=str(family), perm_comment=comm_meta[0], perm_addmeta=comm_meta[1], photo_id=photoId) if not rsp: log.error("couldn't set permission for photo %s; got error %s", photoId, rsp.errormsg) return False log.info("permissions have been set for photo %s", photoId) return True def setTags(self, photoId, tags): log.debug("id: %s, tags: %s", photoId, tags) templist = [ '"%s"'%(a,) for a in string.split(tags, ',')] + ['flickrfs'] tagstring = ' '.join(templist) rsp = self.fapi.photos_setTags(auth_token=self.authtoken, photo_id=photoId, tags=tagstring) if not rsp: log.error("couldn't set tags for %s; got error %s", photoId, rsp.errormsg) return False return True def setMeta(self, photoId, title, desc): log.debug("id: %s, title: %s, desc: %s", photoId, title, desc) rsp = self.fapi.photos_setMeta(auth_token=self.authtoken, photo_id=photoId, title=title, description=desc) if not rsp: log.error("couldn't set meta info for photo %s; got error", photoId, rsp.errormsg) return False return True def getLicenses(self): log.debug("started") rsp = self.fapi.photos_licenses_getInfo() if not rsp: log.error("couldn't retrieve licenses; got error %s", rsp.errormsg) return None licenseDict = {} for l in rsp.licenses[0].license: licenseDict[l['id']] = l['name'] keys = licenseDict.keys() keys.sort() sortedLicenseList = [] for k in keys: # Add tuple of license key, and license value. sortedLicenseList.append((k, licenseDict[k])) return sortedLicenseList def setLicense(self, photoId, license): log.debug("id: %s, license: %s", photoId, license) rsp = self.fapi.photos_licenses_setLicense(auth_token=self.authtoken, photo_id=photoId, license_id=license) if not rsp: log.error("couldn't set license info for photo %s; got error %s", photoId, rsp.errormsg) return False return True def getPhoto(self, photoId): log.debug("id: %s", photoId) rsp = self.fapi.photos_getSizes(auth_token=self.authtoken, photo_id=photoId) if not rsp: log.error("error while trying to retrieve size information" " for photo %s", photoId) return None buf = "" for a in rsp.sizes[0].size: if a['label']=='Original': try: f = urllib2.urlopen(a['source']) buf = f.read() except: log.error("exception in getPhoto") log.error(format_exc()) return "" if not buf: f = urllib2.urlopen(rsp.sizes[0].size[-1]['source']) buf = f.read() return buf def removePhotofromSet(self, photoId, photosetId): log.debug("id: %s, setid: %s", photoId, photosetId) rsp = self.fapi.photosets_removePhoto(auth_token=self.authtoken, photo_id=photoId, photoset_id=photosetId) if rsp: log.info("photo %s removed from set %s", photoId, photosetId) else: log.error(rsp.errormsg) def getBandwidthInfo(self): log.debug("retrieving bandwidth information") rsp = self.fapi.people_getUploadStatus(auth_token=self.authtoken) if not rsp: log.error("can't retrieve bandwidth information; got error %s", rsp.errormsg) return (None,None) bw = rsp.user[0].bandwidth[0] log.debug("max bandwidth: %s, bandwidth used: %s", bw['max'], bw['used']) return (bw['max'], bw['used']) def getUserId(self): log.debug("entered") rsp = self.fapi.auth_checkToken(api_key=flickrAPIKey, auth_token=self.authtoken) if not rsp: log.error("unable to get userid; got error %s", rsp.errormsg) return None usr = rsp.auth[0].user[0] log.info("got NSID %s", usr['nsid']) #Set self.user_id to this value self.user_id = usr['nsid'] return usr['nsid'] def getPhotosetList(self): log.debug("entered") if self.user_id is "": self.getUserId() #This will set the value of self.user_id rsp = self.fapi.photosets_getList(auth_token=self.authtoken, user_id=self.user_id) if not rsp: log.error("error getting photoset list; got error %s", rsp.errormsg) return [] if not hasattr(rsp.photosets[0], "photoset"): log.info("no sets found for userid %s", self.user_id) return [] else: log.info("%s sets found for userid %s", len(rsp.photosets[0].photoset), self.user_id) return rsp.photosets[0].photoset def parseInfoFromPhoto(self, photo, perms=None): info = {} info['id'] = photo['id'] info['title'] = photo['title'].replace('/', '_') # Some pics don't contain originalformat attribute, so set it to jpg by default. try: info['format'] = photo['originalformat'] except KeyError: info['format'] = 'jpg' try: info['dupload'] = photo['dateupload'] except KeyError: info['dupload'] = '0' try: info['dupdate'] = photo['lastupdate'] except KeyError: info['dupdate'] = '0' info['perms'] = perms return info def parseInfoFromFullInfo(self, id, fullInfo): info = {} info['id'] = id info['title'] = fullInfo[4] info['format'] = fullInfo[0] info['dupload'] = fullInfo[10] info['dupdate'] = fullInfo[11] info['mode'] = fullInfo[1] return info def getPhotosFromPhotoset(self, photoset_id): log.debug("set id: %s", photoset_id) photosPermsMap = {} # I'm not utilizing the value part of this dictionary. Its arbitrarily # set to i. for i in range(0,3): page = 1 while True: rsp = self.fapi.photosets_getPhotos(auth_token=self.authtoken, photoset_id=photoset_id, extras=self.extras, page=str(page), privacy_filter=str(i)) if not rsp: break if not hasattr(rsp.photoset[0], 'photo'): log.error("photoset %s doesn't have attribute photo", rsp.photoset[0]['id']) break for p in rsp.photoset[0].photo: photosPermsMap[p] = str(i) page += 1 if page > int(rsp.photoset[0]['pages']): break if photosPermsMap: break return photosPermsMap def getPhotoStream(self, user_id): log.debug("userid: %s", user_id) retList = [] pageNo = 1 maxPage = 1 while pageNo<=maxPage: log.info("retreiving page number %s of %s", pageNo, maxPage) rsp = self.fapi.photos_search(auth_token=self.authtoken, user_id=user_id, per_page="500", page=str(pageNo), extras=self.extras) if not rsp: log.error("can't retrive photos from your stream; got error %s", rsp.errormsg) return retList if not hasattr(rsp.photos[0], 'photo'): log.error("photos.search response doesn't have attribute photos; " "returning list acquired so far") return retList for a in rsp.photos[0].photo: retList.append(a) maxPage = int(rsp.photos[0]['pages']) pageNo = pageNo + 1 return retList def getTaggedPhotos(self, tags, user_id=None): log.debug("tags: %s user_id: %s", tags, user_id) kw = kwdict(auth_token=self.authtoken, tags=tags, tag_mode="all", extras=self.extras, per_page="500") if user_id is not None: kw = kwdict(user_id=user_id, **kw) rsp = self.fapi.photos_search(**kw) log.debug("search for photos with tags %s has been" " successfully finished" % tags) if not rsp: log.error("couldn't search for the photos; got error %s", rsp.errormsg) return if not hasattr(rsp.photos[0], 'photo'): return [] return rsp.photos[0].photo
sys.path.insert(0, "/home/mike/python") from flickrapi import FlickrAPI from flickr import MikeFlickr flickrAPIKey = open("/home/mike/flickr.key", "r").read() flickrSecret = open("/home/mike/flickr.secret", "r").read() fapi = None fapi = FlickrAPI(flickrAPIKey, flickrSecret) if len(sys.argv) < 2: print "usage: %s JPEG [JPEG]" % sys.argv[0] sys.exit(-1) token = fapi.getToken(browser="lynx") ##,perms="delete") mikeapi = MikeFlickr(fapi, flickrAPIKey, token) ## methods def userinput(prompt): rtn = "" while len(rtn) == 0: rtn = raw_input(prompt).strip() return rtn ## ## now, upload everything on the command line (unless we have already ## backed it up)
sys.path.insert(0, "/home/mike/python") from flickrapi import FlickrAPI from flickr import MikeFlickr flickrAPIKey = open("/home/mike/flickr.key", "r").read() flickrSecret = open("/home/mike/flickr.secret", "r").read() fapi = None fapi = FlickrAPI(flickrAPIKey, flickrSecret) if len(sys.argv) < 2: print "usage: %s JPEG [JPEG]" % sys.argv[0] sys.exit(-1) token = fapi.getToken(browser="lynx") mikeapi = MikeFlickr(fapi, flickrAPIKey, token) ## ## first get info from Flickr on what I've already backed up, by the ## "mikebackup" tag ## existing = mikeapi.imagesByTag("mikebackup", privateOnly=True) print "got", len(existing), "existing photos." names = map(lambda x: x[1].lower(), existing) # print names[:10] ## ## now, upload everything on the command line (unless we have already
#!/usr/bin/python import sys from flickrapi import FlickrAPI # flickr auth information: flickrSecret = "3fbf7144be7eca28" # shared "secret" flickrAPIKey = "f8aa9917a9ae5e44a87cae657924f42d" # API key # make a new FlickrAPI instance fapi = FlickrAPI(flickrAPIKey, flickrSecret) # do the whole whatever-it-takes to get a valid token: token = fapi.getToken(browser="/usr/bin/firefox") # get my favorites rsp = fapi.favorites_getList(api_key=flickrAPIKey,auth_token=token) fapi.testFailure(rsp) #print 'Photosets: ' print fapi.photosets_getList(api_key=flickrAPIKey, auth_token=token) rsp = fapi.photosets_getList(api_key=flickrAPIKey, auth_token=token) fapi.testFailure(rsp) #print photoSets #print ', '.join([str(set.title) for set in photoSets]) #person = fapi.flickr_people_getInfo(user_id="tuxmann") #print person.username # and print them if hasattr(rsp.photosets[0], "photoset"):
class Offlickr: def __init__(self, key, secret, uid, httplib=None, browser="lynx", verbose=False): """Instantiates an Offlickr object An API key is needed, as well as an API secret and a user id. A browser can be specified to be used for authorizing the program to access the user account.""" self.__flickrAPIKey = key self.__flickrSecret = secret self.__httplib = httplib # Get authentication token self.fapi = FlickrAPI(self.__flickrAPIKey, self.__flickrSecret) self.token = self.fapi.getToken(browser=browser) self.flickrUserId = uid self.verbose = verbose def __testFailure(self, rsp): """Returns whether the previous call was successful""" if rsp['stat'] == "fail": print "Error!" return True else: return False def getPhotoList(self, dateLo, dateHi): """Returns a list of photo given a time frame""" n = 0 flickr_max = 500 photos = [] print "Retrieving list of photos" while True: if self.verbose: print "Requesting a page..." n = n + 1 rsp = self.fapi.photos_search( api_key=self.__flickrAPIKey, auth_token=self.token, user_id=self.flickrUserId, per_page=str(flickr_max), # Max allowed by Flickr page=str(n), min_upload_date=dateLo, max_upload_date=dateHi) if self.__testFailure(rsp): return None if rsp.photos[0]['total'] == '0': return None photos += rsp.photos[0].photo if self.verbose: print " %d photos so far" % len(photos) if len(photos) >= int(rsp.photos[0]['total']): break return photos def getPhotosetList(self): """Returns a list of photosets for a user""" rsp = self.fapi.photosets_getList(api_key=self.__flickrAPIKey, auth_token=self.token, user_id=self.flickrUserId) if self.__testFailure(rsp): return None return rsp.photosets[0].photoset def getPhotosetInfo(self, pid, method): """Returns a string containing information about a photoset (in XML)""" rsp = method(api_key=self.__flickrAPIKey, auth_token=self.token, photoset_id=pid) if self.__testFailure(rsp): return None doc = libxml2.parseDoc(rsp.xml) info = str(doc.xpathEval("/rsp/photoset")[0]) doc.freeDoc() return info def getPhotoMetadata(self, pid): """Returns an array containing containing the photo metadata (as a string), and the format of the photo""" if self.verbose: print "Requesting metadata for photo %s" % pid rsp = self.fapi.photos_getInfo(api_key=self.__flickrAPIKey, auth_token=self.token, photo_id=pid) if self.__testFailure(rsp): return None doc = libxml2.parseDoc(rsp.xml) metadata = doc.xpathEval("/rsp/photo")[0].serialize() doc.freeDoc() return [metadata, rsp.photo[0]['originalformat']] def getPhotoComments(self, pid): """Returns an XML string containing the photo comments""" if self.verbose: print "Requesting comments for photo %s" % pid rsp = self.fapi.photos_comments_getList(api_key=self.__flickrAPIKey, auth_token=self.token, photo_id=pid) if self.__testFailure(rsp): return None doc = libxml2.parseDoc(rsp.xml) comments = doc.xpathEval("/rsp/comments")[0].serialize() doc.freeDoc() return comments def getPhotoSizes(self, pid): """Returns a string with is a list of available sizes for a photo""" rsp = self.fapi.photos_getSizes(api_key=self.__flickrAPIKey, auth_token=self.token, photo_id=pid) if self.__testFailure(rsp): return None return rsp def getOriginalPhoto(self, pid): """Returns a URL which is the original photo, if it exists""" source = None rsp = self.getPhotoSizes(pid) if rsp == None: return None for s in rsp.sizes[0].size: if s['label'] == 'Original': source = s['source'] return source def __downloadReportHook(self, count, blockSize, totalSize): if self.__verbose == False: return p = 100 * count * blockSize / totalSize if (p > 100): p = 100 print "\r %3d %%" % p, sys.stdout.flush() def downloadURL(self, url, target, filename, verbose=False): """Saves a photo in a file""" self.__verbose = verbose tmpfile = "%s/%s.TMP" % (target, filename) if self.__httplib == 'wget': cmd = 'wget -q -t 0 -T 120 -w 10 -c -O %s %s' % (tmpfile, url) os.system(cmd) else: urllib.urlretrieve(url, tmpfile, reporthook=self.__downloadReportHook) os.rename(tmpfile, "%s/%s" % (target, filename))
#!/usr/bin/python import sys from flickrapi import FlickrAPI # flickr auth information: flickrAPIKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # API key flickrSecret = "yyyyyyyyyyyyyyyy" # shared "secret" # make a new FlickrAPI instance fapi = FlickrAPI(flickrAPIKey, flickrSecret) # do the whole whatever-it-takes to get a valid token: token = fapi.getToken(browser="firefox") # get my favorites rsp = fapi.favorites_getList(api_key=flickrAPIKey,auth_token=token) fapi.testFailure(rsp) # and print them for a in rsp.photos[0].photo: print "%10s: %s" % (a['id'], a['title'].encode("ascii", "replace")) # upload the file foo.jpg #fp = file("foo.jpg", "rb") #data = fp.read() #fp.close() #rsp = fapi.upload(jpegData=data, api_key=flickrAPIKey, auth_token=token, \ #rsp = fapi.upload(filename="foo.jpg", api_key=flickrAPIKey, auth_token=token, \ # title="This is the title", description="This is the description", \ # tags="tag1 tag2 tag3",\