diff --git a/reddit/__init__.py b/reddit/__init__.py index e69de29..1788e42 100644 --- a/reddit/__init__.py +++ b/reddit/__init__.py @@ -0,0 +1,87 @@ +from typing import List, Dict, Union, Iterable, Iterator, NamedTuple + +BPATH = "/L/backups/reddit" + +def iter_backups() -> Iterator[str]: + import os + for f in sorted(os.listdir(BPATH)): + if f.endswith('.json'): + yield os.path.join(BPATH, f) + + +from datetime import datetime + +class Save(NamedTuple): + dt: datetime + link: str + +class Misc(NamedTuple): + pass + +EventKind = Union[Save, Misc] + +class Event(NamedTuple): + dt: datetime + text: str + kind: EventKind + +from kython import JSONType, json_load + +def get_some(d, *keys): + for k in keys: + v = d.get(k, None) + if v is not None: + return v + else: + return None + + +def get_state(bfile: str): + saves: Dict[str, Save] = {} + json: JSONType + with open(bfile, 'r') as fo: + json = json_load(fo) + + saved = json['saved'] + for s in saved: + dt = datetime.utcfromtimestamp(s['created_utc']) + link = get_some(s, 'link_permalink', 'url') # TODO link title or title + save = Save(dt=dt, link=link) + saves[save.link] = save + + # "created_utc": 1535055017.0, + # link_title + # link_text + return saves + + +def get_events(): + backups = list(iter_backups()) + + events: List[Event] = [] + prev_saves: Dict[str, Save] = {} + # TODO suppress first batch?? + + for b in backups: # TODO when date... + saves = get_state(b) + for l in set(prev_saves.keys()).symmetric_difference(set(saves.keys())): + if l in prev_saves: + s = prev_saves[l] + # TODO use backup date, that is more precise... + events.append(Event( + dt=s.dt, + text=f"Unfavorited {s.link}", + kind=s, + )) + else: # in saves + s = saves[l] + events.append(Event( + dt=s.dt, + text=f"Favorited {s.link}", + kind=s, + )) + prev_saves = saves + + return list(sorted(events, key=lambda e: e.dt)) + + diff --git a/reddit/__main__.py b/reddit/__main__.py index e69de29..fea3d2d 100644 --- a/reddit/__main__.py +++ b/reddit/__main__.py @@ -0,0 +1,6 @@ +from reddit import get_events + +import sys, ipdb, traceback; exec("def info(type, value, tb):\n traceback.print_exception(type, value, tb)\n ipdb.pm()"); sys.excepthook = info # type: ignore + +for e in get_events(): + print(e) diff --git a/run b/run index a9f51cc..4a4b7e5 100755 --- a/run +++ b/run @@ -3,4 +3,4 @@ set -eu cd "$(dirname "$0")" -python3 -m location +python3 -m reddit