From 2528af06b143b5e526da19889536b14ccbb350a9 Mon Sep 17 00:00:00 2001 From: aj Date: Thu, 3 Oct 2019 21:12:43 +0100 Subject: [PATCH] initial commit with counter and count playlist function --- .gitignore | 9 ++++++ README.md | 4 +++ spotfm/__init__.py | 4 +++ spotfm/maths/__init__.py | 0 spotfm/maths/counter.py | 61 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 78 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 spotfm/__init__.py create mode 100644 spotfm/maths/__init__.py create mode 100644 spotfm/maths/counter.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e01cb02 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +venv +env +__pycache__ +*.csv +.idea +.spot +.fm + +scratch.py \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..75d2c83 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +spotfm +============= + +utility functions sitting on top of [spotframework](https://github.com/Sarsoo/spotframework) and [fmframework](https://github.com/Sarsoo/pyspotframework) \ No newline at end of file diff --git a/spotfm/__init__.py b/spotfm/__init__.py new file mode 100644 index 0000000..b061bef --- /dev/null +++ b/spotfm/__init__.py @@ -0,0 +1,4 @@ +import logging + +logger = logging.getLogger(__name__) +logger.setLevel('DEBUG') diff --git a/spotfm/maths/__init__.py b/spotfm/maths/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/spotfm/maths/counter.py b/spotfm/maths/counter.py new file mode 100644 index 0000000..e10f2c4 --- /dev/null +++ b/spotfm/maths/counter.py @@ -0,0 +1,61 @@ +from spotframework.net.network import Network as SpotifyNetwork +from spotframework.model.playlist import SpotifyPlaylist +from spotframework.model.track import SpotifyTrack +from spotframework.model.uri import Uri + +from fmframework.net.network import Network as FMNetwork + +import logging + +logger = logging.getLogger(__name__) + + +class Counter: + def __init__(self, + spotnet: SpotifyNetwork, + fmnet: FMNetwork): + self.spotnet = spotnet + self.fmnet = fmnet + + def count(self, uri: Uri): + if uri.object_type == Uri.ObjectType.playlist: + return self.count_playlist(uri=uri) + else: + logger.error('cannot process uri') + + def count_playlist(self, username: str = None, uri: Uri = None, playlist: SpotifyPlaylist = None): + + if uri is None and playlist is None: + raise ValueError('no input playlist to count') + + if playlist is not None: + if playlist.has_tracks() is False: + playlist.tracks = self.spotnet.get_playlist_tracks(uri=playlist.uri) + + if uri is not None: + playlist = self.spotnet.get_playlist(uri=uri) + + scrobble_count = 0 + + tracks = [] + for song in playlist.tracks: + if isinstance(song, SpotifyTrack): + if song.uri not in [i.uri for i in tracks]: + tracks.append(song) + + for song in tracks: + if username is not None: + fm_track = self.fmnet.get_track(name=song.name, + artist=song.artists[0].name, + username=username) + else: + fm_track = self.fmnet.get_track(name=song.name, + artist=song.artists[0].name, + username=self.fmnet.username) + + if fm_track: + scrobble_count += fm_track.user_scrobbles + else: + logger.error(f'no last.fm track returned for {song}') + + return scrobble_count