From 5ac24987db46b2b4136adb2e4962c1995d005e2d Mon Sep 17 00:00:00 2001 From: aj Date: Thu, 3 Oct 2019 20:04:04 +0100 Subject: [PATCH] added puller functions for network objects, hotfixed index error --- .gitignore | 3 +- README.md | 4 +++ fmframework/model/fm.py | 4 +-- fmframework/net/network.py | 70 +++++++++++++++++++++++++++++++++++--- 4 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 README.md diff --git a/.gitignore b/.gitignore index e72b0af..96645b5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ env __pycache__ *.csv .idea -.fm \ No newline at end of file +.fm +scratch.py \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9d4cd3b --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +fmframework +================ + +python scripting framework for last.fm \ No newline at end of file diff --git a/fmframework/model/fm.py b/fmframework/model/fm.py index 7d51864..d423711 100644 --- a/fmframework/model/fm.py +++ b/fmframework/model/fm.py @@ -31,8 +31,8 @@ class LastFM: user_scrobbles: int = None, wiki: Wiki = None): self.name = name - self.url = url, - self.mbid = mbid, + self.url = url + self.mbid = mbid self.listeners = listeners self.play_count = play_count self.user_scrobbles = user_scrobbles diff --git a/fmframework/net/network.py b/fmframework/net/network.py index bf09da6..83494af 100644 --- a/fmframework/net/network.py +++ b/fmframework/net/network.py @@ -80,10 +80,70 @@ class Network: params['to'] = to_time.timestamp() iterator = PageCollection(net=self, method='user.getrecenttracks', params=params, response_limit=limit) - iterator.response_limit = limit + iterator.response_limit = limit + 1 if limit is not None else None iterator.load() - return [self.parse_scrobble(i) for i in iterator.items] + items = iterator.items + + if items[0].get('@attr', {}).get('nowplaying', None): + items.pop(0) + + return [self.parse_scrobble(i) for i in items[:limit]] + + def get_track(self, + name: str, + artist: str, + username: str = None): + logger.info(f'getting {name} / {artist} for {self.username if username is None else username}') + + params = { + 'track': name, + 'artist': artist, + 'user': self.username if username is None else username + } + + resp = self.get_request('track.getInfo', params=params) + + if resp: + return self.parse_track(resp['track']) + else: + logger.error('no response') + + def get_album(self, + name: str, + artist: str, + username: str = None): + logger.info(f'getting {name} / {artist} for {self.username if username is None else username}') + + params = { + 'album': name, + 'artist': artist, + 'user': self.username if username is None else username + } + + resp = self.get_request('album.getInfo', params=params) + + if resp: + return self.parse_album(resp['album']) + else: + logger.error('no response') + + def get_artist(self, + name: str, + username: str = None): + logger.info(f'getting {name} for {self.username if username is None else username}') + + params = { + 'artist': name, + 'user': self.username if username is None else username + } + + resp = self.get_request('artist.getInfo', params=params) + + if resp: + return self.parse_artist(resp['artist']) + else: + logger.error('no response') @staticmethod def parse_wiki(wiki_dict) -> Optional[Wiki]: @@ -98,9 +158,9 @@ class Network: return Artist(name=artist_dict.get('name', 'n/a'), url=artist_dict.get('url', None), mbid=artist_dict.get('mbid', None), - listeners=artist_dict.get('listeners', None), - play_count=artist_dict.get('playcount', None), - user_scrobbles=artist_dict.get('userplaycount', None), + listeners=artist_dict["stats"].get('listeners', None), + play_count=artist_dict["stats"].get('playcount', None), + user_scrobbles=artist_dict["stats"].get('userplaycount', None), wiki=self.parse_wiki(artist_dict['wiki']) if artist_dict.get('wiki', None) else None) def parse_album(self, album_dict) -> Album: