From 1161c0187e25aa8ba742eb1da3ae1a1d663e4cef Mon Sep 17 00:00:00 2001 From: Jonathan Bangert Date: Mon, 29 May 2023 14:50:38 +0200 Subject: [PATCH] start on async --- .../server/providers/deezer/__init__.py | 78 ++++++++++--------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/music_assistant/server/providers/deezer/__init__.py b/music_assistant/server/providers/deezer/__init__.py index ae55ede6..224ba100 100644 --- a/music_assistant/server/providers/deezer/__init__.py +++ b/music_assistant/server/providers/deezer/__init__.py @@ -142,13 +142,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 gw_client: GWClient creds: Credential _throttler: Throttler - - @property - def name(self) -> str: - """Return (custom) friendly name for this provider instance.""" - if client := getattr(self, "client", None): - return f"Deezer - {client.user.name}" - return super().name + user: deezer.resources.User async def handle_setup(self) -> None: """Set up the Deezer provider.""" @@ -167,6 +161,8 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 except Exception as error: raise LoginFailed("Invalid login credentials") from error + self.user = await self.client.get_user() + self.gw_client = GWClient(self.mass.http_session, self.config.get_value(CONF_ACCESS_TOKEN)) await self.gw_client.setup() @@ -227,45 +223,49 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 async def get_library_artists(self) -> AsyncGenerator[Artist, None]: """Retrieve all library artists from Deezer.""" - for artist in await self.client.get_user_artists(): - yield self.parse_artist(artist=artist) + async for artist in await self.client.get_user_artists(): + yield await self.parse_artist(artist=artist) async def get_library_albums(self) -> AsyncGenerator[Album, None]: """Retrieve all library albums from Deezer.""" - for album in await self.client.get_user_albums(): - yield self.parse_album(album=album) + async for album in await self.client.get_user_albums(): + yield await self.parse_album(album=album) async def get_library_playlists(self) -> AsyncGenerator[Playlist, None]: """Retrieve all library playlists from Deezer.""" - for playlist in await self.client.get_user_playlists(): - yield self.parse_playlist(playlist=playlist) + async for playlist in await self.client.get_user_playlists(): + yield await self.parse_playlist(playlist=playlist) async def get_library_tracks(self) -> AsyncGenerator[Track, None]: """Retrieve all library tracks from Deezer.""" - for track in await self.client.get_user_tracks(): - yield self.parse_track(track=track, user_country=self.gw_client.user_country) + async for track in await self.client.get_user_tracks(): + yield await self.parse_track(track=track, user_country=self.gw_client.user_country) async def get_artist(self, prov_artist_id: str) -> Artist: """Get full artist details by id.""" - return self.parse_artist(artist=await self.client.get_artist(artist_id=int(prov_artist_id))) + return await self.parse_artist( + artist=await self.client.get_artist(artist_id=int(prov_artist_id)) + ) async def get_album(self, prov_album_id: str) -> Album: """Get full album details by id.""" try: - return self.parse_album(album=await self.client.get_album(album_id=int(prov_album_id))) + return await self.parse_album( + album=await self.client.get_album(album_id=int(prov_album_id)) + ) except deezer.exceptions.DeezerErrorResponse as error: self.logger.warning("Failed getting album: %s", error) return Album(prov_album_id, self.instance_id, "Not Found") async def get_playlist(self, prov_playlist_id: str) -> Playlist: """Get full playlist details by id.""" - return self.parse_playlist( + return await self.parse_playlist( playlist=await self.client.get_playlist(playlist_id=int(prov_playlist_id)), ) async def get_track(self, prov_track_id: str) -> Track: """Get full track details by id.""" - return self.parse_track( + return await self.parse_track( track=await self.client.get_track(track_id=int(prov_track_id)), user_country=self.gw_client.user_country, ) @@ -274,7 +274,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 """Get all albums in a playlist.""" album = await self.client.get_album(album_id=int(prov_album_id)) return [ - self.parse_track(track=track, user_country=self.gw_client.user_country) + await self.parse_track(track=track, user_country=self.gw_client.user_country) for track in album.tracks ] @@ -282,7 +282,9 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 """Get all tracks in a playlist.""" playlist = await self.client.get_playlist(playlist_id=prov_playlist_id) for count, track in enumerate(playlist.tracks, start=1): - track_parsed = self.parse_track(track=track, user_country=self.gw_client.user_country) + track_parsed = await self.parse_track( + track=track, user_country=self.gw_client.user_country + ) track_parsed.position = count track_parsed.id = track.id yield track_parsed @@ -292,7 +294,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 artist = await self.client.get_artist(artist_id=int(prov_artist_id)) albums = [] for album in await self.client.get_albums_by_artist(artist=artist): - albums.append(self.parse_album(album=album)) + albums.append(await self.parse_album(album=album)) return albums async def get_artist_toptracks(self, prov_artist_id: str) -> list[Track]: @@ -300,7 +302,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 artist = await self.client.get_artist(artist_id=int(prov_artist_id)) top_tracks = await self.client.get_artist_top(artist=artist, limit=25) return [ - self.parse_track(track=track, user_country=self.gw_client.user_country) + await self.parse_track(track=track, user_country=self.gw_client.user_country) for track in top_tracks ] @@ -359,7 +361,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 name="Recommendations", label="recommendations", items=[ - self.parse_track(track=track, user_country=self.gw_client.user_country) + await self.parse_track(track=track, user_country=self.gw_client.user_country) for track in await self.client.get_recommended_tracks() ], ) @@ -388,7 +390,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 async def create_playlist(self, name: str) -> Playlist: """Create a new playlist on provider with given name.""" playlist = await self.client.create_playlist(playlist_name=name) - return self.parse_playlist(playlist=playlist) + return await self.parse_playlist(playlist=playlist) async def get_stream_details(self, item_id: str) -> StreamDetails | None: """Return the content details for the given track when it will be streamed.""" @@ -435,7 +437,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 ### PARSING METADATA FUNCTIONS ### - def parse_metadata_track(self, track: deezer.Track) -> MediaItemMetadata: + async def parse_metadata_track(self, track: deezer.Track) -> MediaItemMetadata: """Parse the track metadata.""" try: return MediaItemMetadata( @@ -452,20 +454,20 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 preview=track.preview, ) - def parse_metadata_album(self, album: deezer.Album) -> MediaItemMetadata: + async def parse_metadata_album(self, album: deezer.Album) -> MediaItemMetadata: """Parse the album metadata.""" return MediaItemMetadata( images=[MediaItemImage(type=ImageType.THUMB, path=album.cover_big)], ) - def parse_metadata_artist(self, artist: deezer.Artist) -> MediaItemMetadata: + async def parse_metadata_artist(self, artist: deezer.Artist) -> MediaItemMetadata: """Parse the artist metadata.""" return MediaItemMetadata( images=[MediaItemImage(type=ImageType.THUMB, path=artist.picture_big)], ) ### PARSING FUNCTIONS ### - def parse_artist(self, artist: deezer.Artist) -> Artist: + async def parse_artist(self, artist: deezer.Artist) -> Artist: """Parse the deezer-python artist to a MASS artist.""" return Artist( item_id=str(artist.id), @@ -482,7 +484,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 metadata=self.parse_metadata_artist(artist=artist), ) - def parse_album(self, album: deezer.Album) -> Album: + async def parse_album(self, album: deezer.Album) -> Album: """Parse the deezer-python album to a MASS album.""" return Album( album_type=AlbumType(album.type), @@ -508,7 +510,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 metadata=self.parse_metadata_album(album=album), ) - def parse_playlist(self, playlist: deezer.Playlist) -> Playlist: + async def parse_playlist(self, playlist: deezer.Playlist) -> Playlist: """Parse the deezer-python playlist to a MASS playlist.""" return Playlist( item_id=str(playlist.id), @@ -528,7 +530,7 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 is_editable=playlist.creator.id == self.client.user.id, ) - def parse_track(self, track: deezer.Track, user_country: str) -> Track: + async def parse_track(self, track: deezer.Track, user_country: str) -> Track: """Parse the deezer-python track to a MASS track.""" return Track( item_id=str(track.id), @@ -569,27 +571,27 @@ class DeezerProvider(MusicProvider): # pylint: disable=W0223 ) -> list[Track]: """Search for tracks and parse them.""" deezer_tracks = await self.client.search_track(query=query, limit=limit) - return [self.parse_track(track, user_country) for track in deezer_tracks] + return [await self.parse_track(track, user_country) for track in deezer_tracks] async def search_and_parse_artists(self, query: str, limit: int = 5) -> list[Artist]: """Search for artists and parse them.""" deezer_artist = await self.client.search_artist(query=query, limit=limit) - return [self.parse_artist(artist=artist) for artist in deezer_artist] + return [await self.parse_artist(artist=artist) for artist in deezer_artist] async def search_and_parse_albums(self, query: str, limit: int = 5) -> list[Album]: """Search for album and parse them.""" deezer_albums = await self.client.search_album(query=query, limit=limit) - return [self.parse_album(album=album) for album in deezer_albums] + return [await self.parse_album(album=album) for album in deezer_albums] async def search_and_parse_playlists(self, query: str, limit: int = 5) -> list[Playlist]: """Search for playlists and parse them.""" deezer_playlists = await self.client.search_playlist(query=query, limit=limit) - return [self.parse_playlist(playlist=playlist) for playlist in deezer_playlists] + return [await self.parse_playlist(playlist=playlist) for playlist in deezer_playlists] ### OTHER PARSING FUNCTIONS ### - def _get_album(self, track: deezer.Track) -> Album | None: + async def _get_album(self, track: deezer.Track) -> Album | None: try: - return self.parse_album(album=track.get_album()) + return await self.parse_album(album=track.get_album()) except AttributeError: return None -- 2.34.1