Fix get_track
authorMarvin Schenkel <marvinschenkel@gmail.com>
Fri, 8 Jul 2022 17:06:29 +0000 (19:06 +0200)
committerMarvin Schenkel <marvinschenkel@gmail.com>
Fri, 8 Jul 2022 17:06:29 +0000 (19:06 +0200)
music_assistant/models/music_provider.py
music_assistant/music_providers/ytmusic/helpers.py
music_assistant/music_providers/ytmusic/ytmusic.py

index b4f8f7cb6801d49b64bdd790c7a3803142c91603..936e24da7c04b1db78cc41122feac418b6480a33 100644 (file)
@@ -321,7 +321,6 @@ class MusicProvider:
                 )
                 if not db_item:
                     # dump the item in the db, rich metadata is lazy loaded later
-                    print(prov_item)
                     db_item = await controller.add_db_item(prov_item)
                 elif (
                     db_item.metadata.checksum and prov_item.metadata.checksum
index 1307f600e5d0e6101c370f15b6c463561231dff0..cb559ce7d38ee91f6751ae51e5e9b03c9879e8cd 100644 (file)
@@ -36,11 +36,13 @@ async def get_album(prov_album_id: str) -> Dict[str, str]:
     return await loop.run_in_executor(None, _get_album)
 
 
-async def get_playlist(prov_playlist_id: str) -> Dict[str, str]:
+async def get_playlist(
+    prov_playlist_id: str, headers: Dict[str, str]
+) -> Dict[str, str]:
     """Async wrapper around the ytmusicapi get_playlist function."""
 
     def _get_playlist():
-        ytm = ytmusicapi.YTMusic()
+        ytm = ytmusicapi.YTMusic(auth=json.dumps(headers))
         return ytm.get_playlist(playlistId=prov_playlist_id)
 
     loop = asyncio.get_running_loop()
@@ -67,6 +69,7 @@ async def get_track(prov_track_id: str) -> Dict[str, str]:
             "thumbnail"
         ]["thumbnails"]
         track["isAvailable"] = track_obj["playabilityStatus"]["status"] == "OK"
+        return track
 
     loop = asyncio.get_running_loop()
     return await loop.run_in_executor(None, _get_song)
index a2aae0bebc470340aa717d6ac636bb8f8089e7f5..ece93b20cc6165c6a4b7a2b43664a39891bf5dc2 100644 (file)
@@ -134,7 +134,8 @@ class YoutubeMusicProvider(MusicProvider):
             try:
                 yield await self._parse_track(track)
             except InvalidDataError:
-                yield await self.get_track(track["videoId"])
+                track = await self.get_track(track["videoId"])
+                yield track
 
     async def get_album(self, prov_album_id) -> Album:
         """Get full album details by id."""
@@ -162,21 +163,34 @@ class YoutubeMusicProvider(MusicProvider):
     async def get_track(self, prov_track_id) -> Track:
         """Get full track details by id."""
         track_obj = await get_track(prov_track_id=prov_track_id)
-        return await self._parse_track(track_obj) if track_obj else None
+        return await self._parse_track(track_obj)
 
     async def get_playlist(self, prov_playlist_id) -> Playlist:
         """Get full playlist details by id."""
-        playlist_obj = await get_playlist(prov_playlist_id)
+        playlist_obj = await get_playlist(
+            prov_playlist_id=prov_playlist_id, headers=self._headers
+        )
         return await self._parse_playlist(playlist_obj)
 
     async def get_playlist_tracks(self, prov_playlist_id) -> List[Track]:
         """Get all playlist tracks for given playlist id."""
-        playlist_obj = await get_playlist(prov_playlist_id)
+        playlist_obj = await get_playlist(
+            prov_playlist_id=prov_playlist_id, headers=self._headers
+        )
         if "tracks" in playlist_obj:
             tracks = []
             for track in playlist_obj["tracks"]:
                 if track["isAvailable"]:
-                    tracks.append(await self._parse_track(track))
+                    # Playlist tracks sometimes do not have a valid artist id
+                    # In that case, call the API for track details based on track id
+                    try:
+                        track = await self._parse_track(track)
+                        if track:
+                            tracks.append(track)
+                    except InvalidDataError:
+                        track = await self.get_track(track["videoId"])
+                        if track:
+                            tracks.append(track)
             return tracks
         return []