101 lines
2.1 KiB
Python
101 lines
2.1 KiB
Python
"""
|
|
[[https://www.goodreads.com][Goodreads]] statistics
|
|
"""
|
|
REQUIRES = [
|
|
'git+https://github.com/karlicoss/goodrexport',
|
|
]
|
|
|
|
|
|
from dataclasses import dataclass
|
|
from my.core import datetime_aware, Paths
|
|
from my.config import goodreads as user_config
|
|
|
|
@dataclass
|
|
class goodreads(user_config):
|
|
# paths[s]/glob to the exported JSON data
|
|
export_path: Paths
|
|
|
|
from my.core.cfg import make_config, Attrs
|
|
|
|
def _migration(attrs: Attrs) -> Attrs:
|
|
export_dir = 'export_dir'
|
|
if export_dir in attrs: # legacy name
|
|
attrs['export_path'] = attrs[export_dir]
|
|
from my.core.warnings import high
|
|
high(f'"{export_dir}" is deprecated! Please use "export_path" instead."')
|
|
return attrs
|
|
config = make_config(goodreads, migration=_migration)
|
|
|
|
#############################3
|
|
|
|
|
|
from my.core import get_files
|
|
from typing import Sequence, Iterator
|
|
from pathlib import Path
|
|
|
|
def inputs() -> Sequence[Path]:
|
|
return get_files(config.export_path)
|
|
|
|
|
|
from datetime import datetime
|
|
import pytz
|
|
|
|
|
|
from goodrexport import dal
|
|
|
|
|
|
def _dal() -> dal.DAL:
|
|
return dal.DAL(inputs())
|
|
|
|
|
|
def reviews() -> Iterator[dal.Review]:
|
|
return _dal().reviews()
|
|
|
|
|
|
# todo should be in DAL?
|
|
def books() -> Iterator[dal.Book]:
|
|
for r in reviews():
|
|
yield r.book
|
|
|
|
|
|
#######
|
|
# todo ok, not sure these really belong here...
|
|
|
|
@dataclass
|
|
class Event:
|
|
dt: datetime_aware
|
|
summary: str
|
|
eid: str
|
|
|
|
|
|
def events() -> Iterator[Event]:
|
|
for b in books():
|
|
yield Event(
|
|
dt=b.date_added,
|
|
summary=f'Added book "{b.title}"', # todo shelf?
|
|
eid=b.id
|
|
)
|
|
# todo finished? other updates?
|
|
|
|
|
|
def print_read_history() -> None:
|
|
def ddate(x):
|
|
if x is None:
|
|
return datetime.fromtimestamp(0, pytz.utc)
|
|
else:
|
|
return x
|
|
|
|
def key(b):
|
|
return ddate(b.date_started)
|
|
|
|
def fmtdt(dt):
|
|
if dt is None:
|
|
return dt
|
|
tz = pytz.timezone('Europe/London')
|
|
return dt.astimezone(tz)
|
|
for b in sorted(books(), key=key):
|
|
print(f"""
|
|
{b.title} by {', '.join(b.authors)}
|
|
started : {fmtdt(b.date_started)}
|
|
finished: {fmtdt(b.date_read)}
|
|
""")
|