From: Marcel van der Veldt Date: Fri, 14 Jun 2024 11:57:37 +0000 (+0200) Subject: Fix race condition causing a (potential) endless loop (#1361) X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=90453749208ff1f99661982a9bc91f3a53607ff1;p=music-assistant-server.git Fix race condition causing a (potential) endless loop (#1361) --- diff --git a/music_assistant/server/controllers/media/albums.py b/music_assistant/server/controllers/media/albums.py index 21e6d455..22d337ed 100644 --- a/music_assistant/server/controllers/media/albums.py +++ b/music_assistant/server/controllers/media/albums.py @@ -151,19 +151,20 @@ class AlbumsController(MediaControllerBase[Album]): in_library_only: bool = False, ) -> UniqueList[AlbumTrack]: """Return album tracks for the given provider album id.""" - full_album = await self.get(item_id, provider_instance_id_or_domain) - db_items = ( - await self.get_library_album_tracks(full_album.item_id) - if full_album.provider == "library" - else [] + # always check if we have a library item for this album + library_album = await self.get_library_item_by_prov_id( + item_id, provider_instance_id_or_domain ) - # return all (unique) items from all providers + if not library_album: + return await self._get_provider_album_tracks(item_id, provider_instance_id_or_domain) + db_items = await self.get_library_album_tracks(library_album.item_id) result: UniqueList[AlbumTrack] = UniqueList(db_items) - if full_album.provider == "library" and in_library_only: + if in_library_only: # return in-library items only return sorted(db_items, key=lambda x: (x.disc_number, x.track_number)) + # return all (unique) items from all providers unique_ids: set[str] = {f"{x.disc_number or 1}.{x.track_number}" for x in db_items} - for provider_mapping in full_album.provider_mappings: + for provider_mapping in library_album.provider_mappings: provider_tracks = await self._get_provider_album_tracks( provider_mapping.item_id, provider_mapping.provider_instance ) @@ -172,7 +173,7 @@ class AlbumsController(MediaControllerBase[Album]): if unique_id in unique_ids: continue unique_ids.add(unique_id) - result.append(AlbumTrack.from_track(provider_track, full_album)) + result.append(AlbumTrack.from_track(provider_track, library_album)) # NOTE: we need to return the results sorted on disc/track here # to ensure the correct order at playback return sorted(result, key=lambda x: (x.disc_number, x.track_number)) @@ -183,7 +184,7 @@ class AlbumsController(MediaControllerBase[Album]): provider_instance_id_or_domain: str, ) -> UniqueList[Album]: """Return all versions of an album we can find on all providers.""" - album = await self.get(item_id, provider_instance_id_or_domain, add_to_library=False) + album = await self.get_provider_item(item_id, provider_instance_id_or_domain) search_query = f"{album.artists[0].name} - {album.name}" if album.artists else album.name result: UniqueList[Album] = UniqueList() for provider_id in self.mass.music.get_unique_providers(): diff --git a/music_assistant/server/controllers/media/artists.py b/music_assistant/server/controllers/media/artists.py index 11687124..e6c1dec8 100644 --- a/music_assistant/server/controllers/media/artists.py +++ b/music_assistant/server/controllers/media/artists.py @@ -105,19 +105,20 @@ class ArtistsController(MediaControllerBase[Artist]): in_library_only: bool = False, ) -> UniqueList[Track]: """Return all/top tracks for an artist.""" - full_artist = await self.get(item_id, provider_instance_id_or_domain) - db_items = ( - await self.get_library_artist_tracks(full_artist.item_id) - if full_artist.provider == "library" - else [] + # always check if we have a library item for this artist + library_artist = await self.get_library_item_by_prov_id( + item_id, provider_instance_id_or_domain ) + if not library_artist: + return await self.get_provider_artist_toptracks(item_id, provider_instance_id_or_domain) + db_items = await self.get_library_artist_tracks(library_artist.item_id) result: UniqueList[Track] = UniqueList(db_items) - if full_artist.provider == "library" and in_library_only: + if in_library_only: # return in-library items only return result # return all (unique) items from all providers unique_ids: set[str] = set() - for provider_mapping in full_artist.provider_mappings: + for provider_mapping in library_artist.provider_mappings: provider_tracks = await self.get_provider_artist_toptracks( provider_mapping.item_id, provider_mapping.provider_instance ) @@ -142,19 +143,20 @@ class ArtistsController(MediaControllerBase[Artist]): in_library_only: bool = False, ) -> UniqueList[Album]: """Return (all/most popular) albums for an artist.""" - full_artist = await self.get(item_id, provider_instance_id_or_domain) - db_items = ( - await self.get_library_artist_albums(full_artist.item_id) - if full_artist.provider == "library" - else [] + # always check if we have a library item for this artist + library_artist = await self.get_library_item_by_prov_id( + item_id, provider_instance_id_or_domain ) + if not library_artist: + return await self.get_provider_artist_albums(item_id, provider_instance_id_or_domain) + db_items = await self.get_library_artist_albums(library_artist.item_id) result: UniqueList[Album] = UniqueList(db_items) - if full_artist.provider == "library" and in_library_only: + if in_library_only: # return in-library items only return result # return all (unique) items from all providers unique_ids: set[str] = set() - for provider_mapping in full_artist.provider_mappings: + for provider_mapping in library_artist.provider_mappings: provider_albums = await self.get_provider_artist_albums( provider_mapping.item_id, provider_mapping.provider_instance )