From 17b5d8a83591b6054702161488839102c8995333 Mon Sep 17 00:00:00 2001 From: Marvin Schenkel Date: Tue, 16 Aug 2022 01:23:43 +0200 Subject: [PATCH] Improve performance of YT Music search (#455) * Improve YT Music search speed --- .../music_providers/ytmusic/ytmusic.py | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/music_assistant/music_providers/ytmusic/ytmusic.py b/music_assistant/music_providers/ytmusic/ytmusic.py index b6dceb98..960cbd09 100644 --- a/music_assistant/music_providers/ytmusic/ytmusic.py +++ b/music_assistant/music_providers/ytmusic/ytmusic.py @@ -119,24 +119,12 @@ class YoutubeMusicProvider(MusicProvider): if result["resultType"] == "artist": parsed_results.append(await self._parse_artist(result)) elif result["resultType"] == "album": - parsed_results.append( - # Search result for albums contain invalid artists - # Use a get_album to get full details - await self.get_album(result["browseId"]) - ) + parsed_results.append(await self._parse_album(result)) elif result["resultType"] == "playlist": parsed_results.append(await self._parse_playlist(result)) elif result["resultType"] == "song": - # Tracks from search results 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(result) - if track: - parsed_results.append(track) - except InvalidDataError: - track = await self.get_track(result["videoId"]) - if track: - parsed_results.append(track) + if track := await self._parse_track(result): + parsed_results.append(track) return parsed_results async def get_library_artists(self) -> AsyncGenerator[Artist, None]: @@ -474,8 +462,9 @@ class YoutubeMusicProvider(MusicProvider): } } - async def _parse_album(self, album_obj: dict, album_id: str) -> Album: + async def _parse_album(self, album_obj: dict, album_id: str = None) -> Album: """Parse a YT Album response to an Album model object.""" + album_id = album_id or album_obj.get("id") or album_obj.get("browseId") if "title" in album_obj: name = album_obj["title"] elif "name" in album_obj: @@ -485,7 +474,7 @@ class YoutubeMusicProvider(MusicProvider): name=name, provider=self.type, ) - if "year" in album_obj and album_obj["year"].isdigit(): + if album_obj.get("year") and album_obj["year"].isdigit(): album.year = album_obj["year"] if "thumbnails" in album_obj: album.metadata.images = await self._parse_thumbnails( @@ -577,7 +566,11 @@ class YoutubeMusicProvider(MusicProvider): ) if "artists" in track_obj: track.artists = [ - await self._parse_artist(artist) for artist in track_obj["artists"] + await self._parse_artist(artist) + for artist in track_obj["artists"] + if artist.get("id") + or artist.get("channelId") + or artist.get("name") == "Various Artists" ] if "thumbnails" in track_obj and track_obj["thumbnails"]: track.metadata.images = await self._parse_thumbnails( -- 2.34.1