From 13120b0a478cdd7611aabb6dc2b614e90a68167d Mon Sep 17 00:00:00 2001 From: aj Date: Sun, 6 Oct 2019 09:17:31 +0100 Subject: [PATCH] fixed iteration counter, int casting of timestamps, altered model reprs --- fmframework/model/album.py | 2 +- fmframework/model/artist.py | 2 +- fmframework/model/track.py | 2 +- fmframework/net/network.py | 45 +++++++++++++++++++++++++++++-------- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/fmframework/model/album.py b/fmframework/model/album.py index 23ec22d..1629d4d 100644 --- a/fmframework/model/album.py +++ b/fmframework/model/album.py @@ -27,7 +27,7 @@ class Album(LastFM): return f'{self.name} / {self.artist}' def __repr__(self): - return Color.DARKCYAN + Color.BOLD + 'Album' + Color.END + f': {self.artist} ' + super().__repr__() + return Color.DARKCYAN + Color.BOLD + 'Album' + Color.END + f': {self.name} {self.artist} ' + super().__repr__() @staticmethod def wrap(name: str = None, diff --git a/fmframework/model/artist.py b/fmframework/model/artist.py index 12442e4..3097747 100644 --- a/fmframework/model/artist.py +++ b/fmframework/model/artist.py @@ -23,4 +23,4 @@ class Artist(LastFM): return f'{self.name}' def __repr__(self): - return Color.PURPLE + Color.BOLD + 'Artist ' + Color.END + super().__repr__() + return Color.PURPLE + Color.BOLD + 'Artist' + Color.END + f': {self.name}' + super().__repr__() diff --git a/fmframework/model/track.py b/fmframework/model/track.py index fc98d3c..4127a4b 100644 --- a/fmframework/model/track.py +++ b/fmframework/model/track.py @@ -31,7 +31,7 @@ class Track(LastFM): def __repr__(self): return Color.YELLOW + Color.BOLD + 'Track' + Color.END + \ - f': album({repr(self.album)}), artist({repr(self.artist)}) ' + super().__repr__() + f': {self.name} album({repr(self.album)}), artist({repr(self.artist)}) ' + super().__repr__() @staticmethod def wrap(name: str = None, diff --git a/fmframework/net/network.py b/fmframework/net/network.py index 71efaaa..b8b9bea 100644 --- a/fmframework/net/network.py +++ b/fmframework/net/network.py @@ -2,7 +2,7 @@ import requests from typing import Optional, List from copy import deepcopy import logging -from datetime import datetime +from datetime import datetime, date, time, timedelta from fmframework.model.fm import Scrobble, Wiki from fmframework.model.track import Track @@ -75,9 +75,9 @@ class Network: } if from_time is not None: - params['from'] = from_time.timestamp() + params['from'] = int(from_time.timestamp()) if to_time is not None: - params['to'] = to_time.timestamp() + params['to'] = int(to_time.timestamp()) iterator = PageCollection(net=self, method='user.getrecenttracks', params=params, response_limit=limit) iterator.response_limit = limit + 1 if limit is not None else None @@ -90,10 +90,37 @@ class Network: return [self.parse_scrobble(i) for i in items[:limit]] + def get_scrobbles_from_date(self, + input_date: date, + username: str = None, + limit: int = None) -> Optional[List[Scrobble]]: + logger.info(f'getting {input_date} scrobbles for {self.username if username is None else username}') + midnight = time(hour=0, minute=0, second=0) + + from_date = datetime.combine(date=input_date, time=midnight) + to_date = datetime.combine(date=input_date + timedelta(days=1), time=midnight) + + scrobbles = self.get_recent_tracks(username=username, from_time=from_date, to_time=to_date, limit=limit) + + return scrobbles + + def get_scrobble_count_from_date(self, + input_date: date, + username: str = None, + limit: int = None) -> int: + logger.info(f'getting {input_date} scrobble count for {self.username if username is None else username}') + + scrobbles = self.get_scrobbles_from_date(input_date=input_date, username=username, limit=limit) + + if scrobbles: + return len(scrobbles) + else: + return 0 + def get_track(self, name: str, artist: str, - username: str = None): + username: str = None) -> Optional[Track]: logger.info(f'getting {name} / {artist} for {self.username if username is None else username}') params = { @@ -112,7 +139,7 @@ class Network: def get_album(self, name: str, artist: str, - username: str = None): + username: str = None) -> Optional[Album]: logger.info(f'getting {name} / {artist} for {self.username if username is None else username}') params = { @@ -130,7 +157,7 @@ class Network: def get_artist(self, name: str, - username: str = None): + username: str = None) -> Optional[Artist]: logger.info(f'getting {name} for {self.username if username is None else username}') params = { @@ -173,7 +200,7 @@ class Network: wiki=self.parse_wiki(album_dict['wiki']) if album_dict.get('wiki', None) else None, artist=album_dict.get('artist')) - def parse_track(self, track_dict): + def parse_track(self, track_dict) -> Track: track = Track(name=track_dict.get('name', 'n/a'), url=track_dict.get('url', 'n/a'), mbid=track_dict.get('mbid', 'n/a'), @@ -191,7 +218,7 @@ class Network: return track @staticmethod - def parse_scrobble(scrobble_dict): + def parse_scrobble(scrobble_dict) -> Scrobble: album = None if scrobble_dict.get('album', None): album = Album(name=scrobble_dict['album'].get('#text', 'n/a'), @@ -228,7 +255,7 @@ class PageCollection: self.pages: List[Page] = [] self.page_limit = page_limit self.response_limit = response_limit - self.counter = 1 + self.counter = 0 def __len__(self): length = 0