OPML RSS export + adding tumblr favs pagination that was missing earlier
Peter Molnar hello@petermolnar.eu
Mon, 15 Oct 2018 21:57:45 +0100
7 files changed,
155 insertions(+),
110 deletions(-)
M
DeviantArt.py
→
DeviantArt.py
@@ -19,9 +19,37 @@ scope='user'
) self.favfolder = None + @property + def feeds(self): + logging.info('Generating OPML feeds for DeviantArt') + feeds = [] + offset = 0 + has_more = True + while has_more: + logging.info('Generating OPML feeds for DeviantArt: offset %d' % offset) + try: + following = self.client.get_friends( + username=keys.deviantart.get('username'), + offset=offset + ) + offset = following.get('next_offset') + for follow in following.get('results'): + u = follow.get('user').username.lower() + feeds.append({ + 'text': u, + 'xmlUrl': "https://backend.deviantart.com/rss.xml?q=gallery%%3A%s" % u, + 'htmlUrl': "https://www.deviantart.com/%s" % u + }) + has_more = following.get('has_more') + except deviantart.api.DeviantartError as e: + print(e) + break + return feeds + def run(self): offset = 0 while not self.favfolder: + logging.info('fetching for DeviantArt: offset %d' % offset) try: folders = self.client.get_collections( username=keys.deviantart.get('username'),
M
Flickr.py
→
Flickr.py
@@ -9,6 +9,9 @@ import settings
from pprint import pprint import logging +#class FlickrFollows(common.Follows): + + class FlickrFavs(common.Favs): def __init__(self): super().__init__('flickr')@@ -20,27 +23,33 @@ 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: - #try: + logging.info('fetching for Flickr: page %d' % page) fetched = self.user.getFavorites( user_id=self.user.id, - #extras=','.join([ - #'description', - #'geo', - #'tags', - #'owner_name', - #'date_upload', - #'url_o', - #'url_k', - #'url_h', - #'url_b', - #'url_c', - #'url_z', - #]), - #'min_fave_date': self.lastpulled page=page ) for p in fetched:@@ -141,85 +150,3 @@
if __name__ == '__main__': t = FlickrFavs() t.run() - -#https://api.flickr.com/services/rest/?method=flickr.favorites.getPublicList&api_key=80a5c2e7fdad3ed1304298850caab99d&user_id=36003160%40N08&per_page=500&format=json&nojsoncallback=1 - - -#class FlickrFavs(Favs): - #url = 'https://api.flickr.com/services/rest/' - - #def __init__(self): - #super().__init__('flickr') - #self.get_uid() - #self.params = { - #'method': 'flickr.favorites.getList', - #'api_key': shared.config.get('api_flickr', 'api_key'), - #'user_id': self.uid, - #'extras': ','.join([ - #'description', - #'geo', - #'tags', - #'owner_name', - #'date_upload', - #'url_o', - #'url_k', - #'url_h', - #'url_b', - #'url_c', - #'url_z', - #]), - #'per_page': 500, # maximim - #'format': 'json', - #'nojsoncallback': '1', - #'min_fave_date': self.lastpulled - #} - - #def get_uid(self): - #params = { - #'method': 'flickr.people.findByUsername', - #'api_key': shared.config.get('api_flickr', 'api_key'), - #'format': 'json', - #'nojsoncallback': '1', - #'username': shared.config.get('api_flickr', 'username'), - #} - #r = requests.get( - #self.url, - #params=params - #) - #parsed = json.loads(r.text) - #self.uid = parsed.get('user', {}).get('id') - - #def getpaged(self, offset): - #logging.info('requesting page #%d of paginated results', offset) - #self.params.update({ - #'page': offset - #}) - #r = requests.get( - #self.url, - #params=self.params - #) - #parsed = json.loads(r.text) - #return parsed.get('photos', {}).get('photo', []) - - #def run(self): - #r = requests.get(self.url, params=self.params) - #js = json.loads(r.text) - #js = js.get('photos', {}) - - #photos = js.get('photo', []) - - #total = int(js.get('pages', 1)) - #current = int(js.get('page', 1)) - #cntr = total - current - - #while cntr > 0: - #current = current + 1 - #paged = self.getpaged(current) - #photos = photos + paged - #cntr = total - current - - #for photo in photos: - #fav = FlickrFav(photo) - #if not fav.exists: - #fav.run() - ## fav.fix_extension()
M
Tumblr.py
→
Tumblr.py
@@ -1,5 +1,6 @@
import os import glob +import logging import pytumblr import arrow import keys@@ -19,15 +20,44 @@ keys.tumblr.get('oauth_token'),
keys.tumblr.get('oauth_secret') ) - def run(self): - likes = self.client.likes(after=self.since) - if 'liked_posts' not in likes: - return + @property + def feeds(self): + logging.info('Generating OPML feeds for Tumblr') + feeds = [] + offset = 0 + has_more = True + while has_more: + fetched = self.client.following(offset=offset) + if '_links' in fetched and 'next' in fetched['_links'] and len(fetched): + offset = fetched.get('_links').get('next').get('query_params').get('offset') + else: + has_more = False - for like in likes.get('liked_posts'): - fav = TumblrFav(like) + for u in fetched.get('blogs'): + feeds.append({ + 'text': u.get('name'), + 'xmlUrl': "%srss" % u.get('url'), + 'htmlUrl': u.get('url') + }) + return feeds - fav.run() + def run(self): + has_more = True + after = 0 + while has_more: + logging.info('fetching for Tumblr: after %d' % after) + fetched = self.client.likes(after=after) + if 'liked_posts' not in fetched: + has_more = False + elif '_links' in fetched and 'prev' in fetched['_links'] and len(fetched): + after = fetched.get('_links').get('prev').get('query_params').get('after') + after = int(after) + else: + has_more = False + + for like in fetched.get('liked_posts'): + fav = TumblrFav(like) + fav.run() class TumblrFav(common.ImgFav):@@ -102,7 +132,7 @@ def images(self):
r = {} cntr = 0 for p in self.data.get('photos', []): - f = "%s-%d%s" % (self.targetprefix, cntr, common.TMPFEXT) + f = "%s_%d%s" % (self.targetprefix, cntr, common.TMPFEXT) r.update({ f: p.get('original_size').get('url') })
M
common.py
→
common.py
@@ -5,6 +5,7 @@ import re
import logging import shutil import subprocess +import lxml.etree as etree from slugify import slugify import requests import arrow@@ -21,9 +22,47 @@ lower=True
)[:200] +class Follows(object): + def __init__(self): + self.feeds = {} + + def append(self, silo, feeds): + self.feeds.update({silo: feeds}) + + def export(self): + opml = etree.Element("opml") + + head = etree.SubElement(opml, "head") + title = etree.SubElement(head, "title").text = "Social media RSS feeds" + + body = etree.SubElement(opml, "body") + for silo, feeds in self.feeds.items(): + s = etree.SubElement(body, "outline", text=silo) + for f in feeds: + entry = etree.SubElement( + s, + "outline", + type="rss", + text=f.get('text'), + xmlUrl=f.get('xmlUrl'), + htmlUrl=f.get('htmlUrl') + ) + + opmlfile = os.path.join( + settings.paths.get('archive'), + 'feeds.opml' + ) + + with open(opmlfile, 'wb') as f: + f.write(etree.tostring(opml, pretty_print=True)) + class Favs(object): def __init__(self, silo): self.silo = silo + + @property + def feeds(self): + return [] @property def since(self):
A
run.py
@@ -0,0 +1,24 @@
+import common +import settings +import Tumblr +import LastFM +import DeviantArt +import Flickr +from pprint import pprint + +lfm = LastFM.LastFM() +lfm.run() + +opml = common.Follows() + +silos = [ + DeviantArt.DAFavs(), + Flickr.FlickrFavs(), + Tumblr.TumblrFavs() +] + +for silo in silos: + silo.run() + opml.append(silo.silo, silo.feeds) + +opml.export()
M
settings.py
→
settings.py
@@ -20,7 +20,7 @@
_parser = argparse.ArgumentParser(description='Parameters for silo.pasta') _parser.add_argument( '--loglevel', - default='info', + default='debug', help='change loglevel' )