Update lastfm order/tests/docs

This commit is contained in:
Dima Gerasimov 2020-05-13 20:35:47 +01:00
parent 522bfff679
commit eba2d26b31
3 changed files with 42 additions and 6 deletions

View file

@ -32,6 +32,7 @@ modules = [
('reddit' , 'my.reddit' ), ('reddit' , 'my.reddit' ),
('twint' , 'my.twitter.twint' ), ('twint' , 'my.twitter.twint' ),
('twitter', 'my.twitter.archive' ), ('twitter', 'my.twitter.archive' ),
('lastfm' , 'my.lastfm' ),
] ]
def indent(s, spaces=4): def indent(s, spaces=4):
@ -105,4 +106,15 @@ for cls, p in modules:
class twitter: class twitter:
export_path: Paths # path[s]/glob to the twitter archive takeout export_path: Paths # path[s]/glob to the twitter archive takeout
#+end_src #+end_src
- [[file:../my/lastfm][my.lastfm]]
Last.fm scrobbles
#+begin_src python
class lastfm:
"""
Uses [[https://github.com/karlicoss/lastfm-backup][lastfm-backup]] outputs
"""
export_path: Paths
#+end_src
:end: :end:

View file

@ -2,8 +2,21 @@
Last.fm scrobbles Last.fm scrobbles
''' '''
from ..core.common import Paths
from dataclasses import dataclass
from my.config import lastfm as user_config
@dataclass
class lastfm(user_config):
"""
Uses [[https://github.com/karlicoss/lastfm-backup][lastfm-backup]] outputs
"""
export_path: Paths
from ..core.cfg import make_config
config = make_config(lastfm)
from ..common import get_files, mcachew, Json
from datetime import datetime from datetime import datetime
import json import json
@ -12,16 +25,17 @@ from typing import NamedTuple, Any, Sequence, Iterable
import pytz import pytz
from my.config import lastfm as config from ..core.common import mcachew, Json, get_files
def inputs() -> Sequence[Path]:
return get_files(config.export_path)
# TODO memoised properties? # TODO memoised properties?
# TODO lazy mode and eager mode? # TODO lazy mode and eager mode?
# lazy is a bit nicer in terms of more flexibility and less processing? # lazy is a bit nicer in terms of more flexibility and less processing?
# eager is a bit more explicit for error handling # eager is a bit more explicit for error handling
def inputs() -> Sequence[Path]:
return get_files(config.export_path)
class Scrobble(NamedTuple): class Scrobble(NamedTuple):
raw: Json raw: Json
@ -54,5 +68,5 @@ def scrobbles() -> Iterable[Scrobble]:
last = max(inputs()) last = max(inputs())
j = json.loads(last.read_text()) j = json.loads(last.read_text())
for raw in j: for raw in reversed(j):
yield Scrobble(raw=raw) yield Scrobble(raw=raw)

View file

@ -1,3 +1,7 @@
from my.core.cachew import disable_cachew
# TODO need something nicer and integrated inside cachew..
disable_cachew() # meh
from more_itertools import ilen from more_itertools import ilen
from my.lastfm import scrobbles from my.lastfm import scrobbles
@ -5,3 +9,9 @@ from my.lastfm import scrobbles
def test(): def test():
assert ilen(scrobbles()) > 1000 assert ilen(scrobbles()) > 1000
def test_datetime_ascending():
from more_itertools import pairwise
for a, b in pairwise(scrobbles()):
assert a.dt <= b.dt