From 20673939ad33780fbef45495d13dff33fbe772af Mon Sep 17 00:00:00 2001 From: Juan Date: Sat, 16 Sep 2023 00:11:16 -0700 Subject: [PATCH 1/3] Implement get_all_user_playlists --- src/packages/music_api_clients/spotify.py | 10 +++++++ src/scripts/duplicate_all_user_playlists.py | 31 +++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/scripts/duplicate_all_user_playlists.py diff --git a/src/packages/music_api_clients/spotify.py b/src/packages/music_api_clients/spotify.py index 8f54fe6..1553ae0 100644 --- a/src/packages/music_api_clients/spotify.py +++ b/src/packages/music_api_clients/spotify.py @@ -75,6 +75,16 @@ def get_matching_albums(self, album_name): albums = self._get_albums_from_ids(matching_album_ids) return set(albums) + def get_all_user_playlists(self, user_id): + def get_playlist_tracks(spotify_playlist_id): + return lambda: self._get_playlist_tracks(spotify_playlist_id) + results = self.client.user_playlists(user_id) + return [ + Playlist.from_spotify_playlist_search_results( + playlist, get_playlist_tracks(playlist['id'])) + for playlist in results['items'] + ] + def get_current_user_playlist_by_name(self, name): playlist_id = self.find_current_user_playlist(name) if playlist_id is None: diff --git a/src/scripts/duplicate_all_user_playlists.py b/src/scripts/duplicate_all_user_playlists.py new file mode 100644 index 0000000..6c022be --- /dev/null +++ b/src/scripts/duplicate_all_user_playlists.py @@ -0,0 +1,31 @@ +# allows me to run: +# $ python scripts/playlist_updater_example.py +import sys + +sys.path.extend(['.', '../']) + +from packages.music_management.music_util import MusicUtil +from packages.music_management.my_music_lib import MyMusicLib +from packages.music_api_clients.spotify import Spotify + +def main(): + spotify = Spotify() + playlists = spotify.get_all_user_playlists("2222rxc7a5xacexelkeqbrony") + if (len(playlists) == 0): + print("No playlists found") + return + + music_util = MusicUtil(spotify, print) + my_music_lib = MyMusicLib(spotify, music_util, print) + for playlist in playlists: + new_playlist_name = f"Jaime: {playlist.name}" + print(f"Creating playlist: \"{new_playlist_name}\", containing ", len(playlist.get_tracks()), " tracks") + my_music_lib.create_playlist( + new_playlist_name, + playlist.get_tracks(), + playlist.description + ) + + +if __name__ == "__main__": + main() \ No newline at end of file From 9e44d5d0aa1f117f692664f47331a194754340db Mon Sep 17 00:00:00 2001 From: Juan Date: Sat, 16 Sep 2023 00:12:00 -0700 Subject: [PATCH 2/3] Rename playlist.tracks -> playlist._tracks to encourage use of playlist.get_tracks() instead --- src/packages/music_api_clients/models/playlist.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/packages/music_api_clients/models/playlist.py b/src/packages/music_api_clients/models/playlist.py index 8133083..d050044 100644 --- a/src/packages/music_api_clients/models/playlist.py +++ b/src/packages/music_api_clients/models/playlist.py @@ -6,7 +6,7 @@ def __init__(self, name, description, tracks_fetcher, spotify_id=None): self.description = description self.tracks_fetcher = tracks_fetcher self.spotify_id = spotify_id - self.tracks = None + self._tracks = None self.num_tracks = None def __key(self): @@ -21,15 +21,15 @@ def __eq__(self, other): return NotImplemented def get_tracks(self): - if self.tracks is None: - self.tracks = self.tracks_fetcher() - return self.tracks + if self._tracks is None: + self._tracks = self.tracks_fetcher() + return self._tracks def get_num_tracks(self): if self.num_tracks is None: - if self.tracks is None: - self.tracks = self.tracks_fetcher() - self.num_tracks = len(self.tracks) + if self._tracks is None: + self._tracks = self.tracks_fetcher() + self.num_tracks = len(self._tracks) return self.num_tracks def has_any_tracks_from_album(self, album): From 7d6405520f7e0fc9dee2483ee5cfa625cc86e6b5 Mon Sep 17 00:00:00 2001 From: Juan Date: Sat, 16 Sep 2023 00:13:26 -0700 Subject: [PATCH 3/3] Preserve playlist track order --- src/packages/music_api_clients/spotify.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/packages/music_api_clients/spotify.py b/src/packages/music_api_clients/spotify.py index 1553ae0..b462e42 100644 --- a/src/packages/music_api_clients/spotify.py +++ b/src/packages/music_api_clients/spotify.py @@ -330,13 +330,15 @@ def _fetch_until_all_items_returned(self, fetch_func): (List): all fetched items. """ all_items, finished = fetch_func() - all_items = set(all_items) + # transforming list to a set is losing the order + # TODO: find another way to remove duplicates + #all_items = set(all_items) offset, batch_size = 0, API_BATCH_SIZE while not finished: offset += batch_size items, finished = fetch_func(batch_size=batch_size, offset=offset) - all_items |= set(items) - return list(all_items) + all_items.extend(items) + return all_items def _fetch_in_batches(self, items_to_fetch, fetch_items): """