start on async
authorJonathan Bangert <jonathan@bangert.dk>
Mon, 29 May 2023 12:50:38 +0000 (14:50 +0200)
committerJonathan Bangert <jonathan@bangert.dk>
Tue, 13 Jun 2023 12:14:50 +0000 (14:14 +0200)
music_assistant/server/providers/deezer/__init__.py

index ae55ede661b9b86a958c4c695416f0602d029797..224ba1005d050c192400fe1ad0a5fb14c720f203 100644 (file)
@@ -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