import argparse import json import logging import sys from datetime import datetime, timedelta from os.path import expanduser from flickrscripts.common import setup_flickr class TimeWarper(object): flickr = None _base_query_args = dict(user_id='me', page=1) def __init__(self, api_key, api_secret): self.flickr = setup_flickr(api_key, api_secret) self.log = logging.getLogger(self.__class__.__name__) self.log.level = logging.INFO def run(self, set_to_date, **query_args): self.log.info( 'Setting upload dates for photos matching query %r', query_args ) query = self._base_query_args.copy() query.update(query_args) for i, page in self._get_pages(query): self.log.info('Processing page %s, attributes=%r', i, page.attrib) self._set_upload_date_for_photos(i, page, set_to_date) return 0 def _set_upload_date_for_photos(self, pagenum, page, set_to_date): for i, photo in enumerate(page.findall('photos/photo')): setdate_response = self.flickr.photos_setDates( photo_id=photo.attrib['id'], date_posted=set_to_date ) self.log.info('page %s photo %s: response attribs=%s', pagenum, i, setdate_response.attrib) def _get_pages(self, query): self.log.info('Getting pages for query %r', query) i = 1 while True: page = self.flickr.photos_search(**query) if len(page.findall('photos/photo')): yield i, page i += 1 else: raise StopIteration def main(sysargs=sys.argv[:]): parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter, prog='flickrscripts timewarp') parser.add_argument('set_to_date') parser.add_argument('-q', '--search-query-param', default=[], action='append', help='Add a key=value param to the search query list') parser.add_argument( '-c', '--rcfile', default=expanduser('~/.flickrscripts.json'), help='JSON file containing `APIKEY` and `APISECRET` keys', type=argparse.FileType('r') ) args = parser.parse_args(sysargs[1:]) rc_conf = json.load(args.rcfile) logging.basicConfig(level=logging.INFO, stream=sys.stdout) log = logging.getLogger('main') log.level = logging.INFO log.info('Preparing query args') query_args = {} for key_val in args.search_query_param: key, value = key_val.split('=', 1) query_args[key] = value if len(query_args.keys()) == 0: query_args = dict( min_upload_date=(datetime.now() + timedelta(days=-1)), max_upload_date=(datetime.now() + timedelta(days=1)) ) log.warn('No query arguments provided! ' + 'Defaulting to %r', query_args) warper = TimeWarper(rc_conf['APIKEY'], rc_conf['APISECRET']) return warper.run(args.set_to_date, **query_args) if __name__ == '__main__': sys.exit(main())