import os import glob import flickr_api from bleach import clean import arrow import keys import common from common import cached_property import settings from pprint import pprint import logging class FlickrFavs(common.Favs): def __init__(self): super().__init__("flickr") flickr_api.set_keys( api_key=keys.flickr.get("key"), api_secret=keys.flickr.get("secret") ) self.user = flickr_api.Person.findByUserName(keys.flickr.get("username")) @property def feeds(self): logging.info("Generating OPML feeds for Flickr") feeds = [] pages = 1 page = 1 while page <= pages: fetched = self.user.getPublicContacts(page=page) for u in fetched: feeds.append( { "text": u.username, "xmlUrl": "https://api.flickr.com/services/feeds/photos_public.gne?lang=en-us&format=rss_200&id=%s" % u.id, "htmlUrl": "https://www.flickr.com/photos/%s" % u.id, } ) pages = fetched.info.pages page = page + 1 return feeds def run(self): pages = 1 page = 1 while page <= pages: logging.info("fetching for Flickr: page %d" % page) fetched = self.user.getFavorites( user_id=self.user.id, page=page, min_fave_date=self.since ) for p in fetched: photo = FlickrFav(p) photo.run() pages = fetched.info.pages page = page + 1 class FlickrFav(common.ImgFav): def __init__(self, flickrphoto): self.flickrphoto = flickrphoto def __str__(self): return "fav-of %s" % (self.url) @cached_property def owner(self): return self.info.get("owner") @cached_property def info(self): return self.flickrphoto.getInfo() @property def author(self): return { "name": "%s" % self.owner.username, "url": "%s" % self.owner.getProfileUrl(), } @property def id(self): return "%s" % self.info.get("id") @property def url(self): return "https://www.flickr.com/photos/%s/%s/" % (self.owner.id, self.id) @property def content(self): return "%s" % self.info.get("description") @property def geo(self): if "location" not in self.info: return None lat = self.info.get("location").get("latitude", None) lon = self.info.get("location").get("longitude", None) return (lat, lon) @property def title(self): return clean("".strip("%s" % self.info.get("title"))) @property def targetprefix(self): return os.path.join( settings.paths.get("archive"), "favorite", "flickr_%s_%s" % (common.url2slug("%s" % self.owner.id), self.id), ) @property def published(self): x = self.info.get("dateuploaded") if x.isnumeric(): return arrow.get(int(x)) else: return arrow.get(x) @property def tags(self): tags = [] for t in self.info.get("tags"): tags.append("%s" % t.text) return tags @property def images(self): sizes = self.flickrphoto.getSizes() for maybe in ["Original", "Large 2048", "Large 1600", "Large", "Medium"]: if maybe in sizes: f = "%s%s" % (self.targetprefix, common.TMPFEXT) return {f: sizes.get(maybe).get("source")} if __name__ == "__main__": t = FlickrFavs() t.run()