diff --git a/my/_rss.py b/my/_rss.py new file mode 100644 index 0000000..7037a50 --- /dev/null +++ b/my/_rss.py @@ -0,0 +1,12 @@ +# shared Rss stuff +from typing import NamedTuple + +class Subscription(NamedTuple): + # TODO date? + title: str + url: str + id: str + subscribed: bool=True + + + diff --git a/my/common.py b/my/common.py index 0113563..8b406c0 100644 --- a/my/common.py +++ b/my/common.py @@ -54,3 +54,25 @@ R = TypeVar('R') def cproperty(f: Callable[[Cl], R]) -> R: return property(functools.lru_cache(maxsize=1)(f)) # type: ignore + + +# https://stackoverflow.com/a/12377059/706389 +def listify(fn=None, wrapper=list): + """ + Wraps a function's return value in wrapper (e.g. list) + Useful when an algorithm can be expressed more cleanly as a generator + """ + def listify_return(fn): + @functools.wraps(fn) + def listify_helper(*args, **kw): + return wrapper(fn(*args, **kw)) + return listify_helper + if fn is None: + return listify_return + return listify_return(fn) + + +# def dictify(fn=None, key=None, value=None): +# def md(it): +# return make_dict(it, key=key, value=value) +# return listify(fn=fn, wrapper=md) diff --git a/my/feedbin.py b/my/feedbin.py new file mode 100644 index 0000000..04237f2 --- /dev/null +++ b/my/feedbin.py @@ -0,0 +1,31 @@ +from . import paths +from .common import listify +from ._rss import Subscription + +import json +from pathlib import Path +from typing import Dict, List +from datetime import datetime +from dateutil.parser import isoparse + + +@listify +def parse_file(f: Path): + raw = json.loads(f.read_text()) + print(raw) + for r in raw: + yield Subscription( + # TODO created_at? + title=r['title'], + url=r['site_url'], + id=r['id'], + ) + +def get_states() -> Dict[datetime, List[Subscription]]: + res = {} + for f in sorted(Path(paths.feedbin.export_dir).glob('*.json')): + dts = f.stem.split('_')[-1] + dt = isoparse(dts) + subs = parse_file(f) + res[dt] = subs + return res diff --git a/my/feedly.py b/my/feedly.py new file mode 100644 index 0000000..2bb6910 --- /dev/null +++ b/my/feedly.py @@ -0,0 +1,32 @@ +from . import paths +from .common import listify +from ._rss import Subscription + +import json +from pathlib import Path +from typing import Dict, List +from datetime import datetime +from dateutil.parser import isoparse + + +@listify +def parse_file(f: Path): + raw = json.loads(f.read_text()) + for r in raw: + # err, some even don't have website.. + website = r.get('website') + yield Subscription( + # TODO created_at? + title=r['title'], + url=website, + id=r['id'], + ) + +def get_states() -> Dict[datetime, List[Subscription]]: + res = {} + for f in sorted(Path(paths.feedly.export_dir).glob('*.json')): + dts = f.stem.split('_')[-1] + dt = datetime.strptime(dts, '%Y%m%d%H%M%S') + subs = parse_file(f) + res[dt] = subs + return res diff --git a/my/rss.py b/my/rss.py new file mode 100644 index 0000000..b61c1f1 --- /dev/null +++ b/my/rss.py @@ -0,0 +1,12 @@ +from . import feedbin +from . import feedly +from ._rss import Subscription +# TODO google reader? + + +def get_history(): + """ + It's useful to keep track of websites you unsubscribed from too, + so you don't try to subscribe again (or at least take into account why you unsubscribed before) + """ + pass