From: Marvin Schenkel Date: Fri, 8 Jul 2022 17:06:29 +0000 (+0200) Subject: Fix get_track X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=c7523c08151309c07e67c8024e71f8ee9675bfc2;p=music-assistant-server.git Fix get_track --- diff --git a/music_assistant/models/music_provider.py b/music_assistant/models/music_provider.py index b4f8f7cb..936e24da 100644 --- a/music_assistant/models/music_provider.py +++ b/music_assistant/models/music_provider.py @@ -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 diff --git a/music_assistant/music_providers/ytmusic/helpers.py b/music_assistant/music_providers/ytmusic/helpers.py index 1307f600..cb559ce7 100644 --- a/music_assistant/music_providers/ytmusic/helpers.py +++ b/music_assistant/music_providers/ytmusic/helpers.py @@ -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) diff --git a/music_assistant/music_providers/ytmusic/ytmusic.py b/music_assistant/music_providers/ytmusic/ytmusic.py index a2aae0be..ece93b20 100644 --- a/music_assistant/music_providers/ytmusic/ytmusic.py +++ b/music_assistant/music_providers/ytmusic/ytmusic.py @@ -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 []