silo.pasta/Flickr.py

138 lines
3.7 KiB
Python

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