From: Artur Pragacz <49985303+arturpragacz@users.noreply.github.com> Date: Tue, 23 Dec 2025 16:08:58 +0000 (+0100) Subject: Fix items not showing up in the library (filtering still not right) (#2873) X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=78f6cc3d4d9f966d82b3a82381711695bb37767a;p=music-assistant-server.git Fix items not showing up in the library (filtering still not right) (#2873) Reverts (partially) 1b60a3c. --- diff --git a/music_assistant/controllers/media/albums.py b/music_assistant/controllers/media/albums.py index 4a7a6c88..d7c1b9d1 100644 --- a/music_assistant/controllers/media/albums.py +++ b/music_assistant/controllers/media/albums.py @@ -114,9 +114,7 @@ class AlbumsController(MediaControllerBase[Album]): provider: str | list[str] | None = None, extra_query: str | None = None, extra_query_params: dict[str, Any] | None = None, - library_items_only: bool = True, album_types: list[AlbumType] | None = None, - **kwargs: Any, ) -> list[Album]: """Get in-database albums. @@ -129,8 +127,6 @@ class AlbumsController(MediaControllerBase[Album]): :param extra_query: Additional SQL query string. :param extra_query_params: Additional query parameters. :param album_types: Filter by album types. - :param library_items_only: If True, only return items that are - marked as 'in_library' on any provider mapping. """ extra_query_params = extra_query_params or {} extra_query_parts: list[str] = [extra_query] if extra_query else [] @@ -175,7 +171,6 @@ class AlbumsController(MediaControllerBase[Album]): extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, extra_join_parts=extra_join_parts, - in_library_only=library_items_only, ) # Calculate how many more items we need to reach the original limit @@ -203,7 +198,6 @@ class AlbumsController(MediaControllerBase[Album]): extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, extra_join_parts=extra_join_parts, - in_library_only=library_items_only, ): # prevent duplicates (when artist is also in the title) if album.uri not in existing_uris: diff --git a/music_assistant/controllers/media/artists.py b/music_assistant/controllers/media/artists.py index 95dbb43f..a1a65153 100644 --- a/music_assistant/controllers/media/artists.py +++ b/music_assistant/controllers/media/artists.py @@ -73,9 +73,7 @@ class ArtistsController(MediaControllerBase[Artist]): provider: str | list[str] | None = None, extra_query: str | None = None, extra_query_params: dict[str, Any] | None = None, - library_items_only: bool = True, album_artists_only: bool = False, - **kwargs: Any, ) -> list[Artist]: """Get in-database (album) artists. @@ -88,8 +86,6 @@ class ArtistsController(MediaControllerBase[Artist]): :param extra_query: Additional SQL query string. :param extra_query_params: Additional query parameters. :param album_artists_only: Only return artists that have albums. - :param library_items_only: If True, only return items that are - marked as 'in_library' on any provider mapping. """ extra_query_params = extra_query_params or {} extra_query_parts: list[str] = [extra_query] if extra_query else [] @@ -107,7 +103,6 @@ class ArtistsController(MediaControllerBase[Artist]): provider_filter=self._ensure_provider_filter(provider), extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, - in_library_only=library_items_only, ) async def tracks( diff --git a/music_assistant/controllers/media/audiobooks.py b/music_assistant/controllers/media/audiobooks.py index 84d42da0..671fd642 100644 --- a/music_assistant/controllers/media/audiobooks.py +++ b/music_assistant/controllers/media/audiobooks.py @@ -70,8 +70,6 @@ class AudiobooksController(MediaControllerBase[Audiobook]): provider: str | list[str] | None = None, extra_query: str | None = None, extra_query_params: dict[str, Any] | None = None, - library_items_only: bool = True, - **kwargs: Any, ) -> list[Audiobook]: """Get in-database audiobooks. @@ -83,8 +81,6 @@ class AudiobooksController(MediaControllerBase[Audiobook]): :param provider: Filter by provider instance ID (single string or list). :param extra_query: Additional SQL query string. :param extra_query_params: Additional query parameters. - :param library_items_only: If True, only return items that are - marked as 'in_library' on any provider mapping. """ extra_query_params = extra_query_params or {} extra_query_parts: list[str] = [extra_query] if extra_query else [] @@ -97,7 +93,6 @@ class AudiobooksController(MediaControllerBase[Audiobook]): provider_filter=self._ensure_provider_filter(provider), extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, - in_library_only=library_items_only, ) if search and len(result) < 25 and not offset: # append author items to result @@ -113,7 +108,6 @@ class AudiobooksController(MediaControllerBase[Audiobook]): provider_filter=self._ensure_provider_filter(provider), extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, - in_library_only=library_items_only, ) return result diff --git a/music_assistant/controllers/media/base.py b/music_assistant/controllers/media/base.py index afeaae8e..fb1e9fa8 100644 --- a/music_assistant/controllers/media/base.py +++ b/music_assistant/controllers/media/base.py @@ -244,23 +244,8 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): provider: str | list[str] | None = None, extra_query: str | None = None, extra_query_params: dict[str, Any] | None = None, - library_items_only: bool = True, - **kwargs: Any, ) -> list[ItemCls]: - """ - Get in-database albums. - - :param favorite: Filter by favorite status. - :param search: Filter by search query. - :param limit: Maximum number of items to return. - :param offset: Number of items to skip. - :param order_by: Order by field (e.g. 'sort_name', 'timestamp_added'). - :param provider: Filter by provider instance ID (single string or list). - :param extra_query: Additional SQL query string. - :param extra_query_params: Additional query parameters. - :param library_items_only: If True, only return items that are - marked as 'in_library' on any provider mapping. - """ + """Get in-database items.""" return await self._get_library_items_by_query( favorite=favorite, search=search, @@ -270,7 +255,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): provider_filter=self._ensure_provider_filter(provider), extra_query_parts=[extra_query] if extra_query else None, extra_query_params=extra_query_params, - in_library_only=library_items_only, ) async def iter_library_items( @@ -281,7 +265,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): provider: str | list[str] | None = None, extra_query: str | None = None, extra_query_params: dict[str, Any] | None = None, - library_items_only: bool = True, ) -> AsyncGenerator[ItemCls, None]: """Iterate all in-database items.""" limit: int = 500 @@ -300,7 +283,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): provider_filter=provider_filter, extra_query_parts=[extra_query] if extra_query else None, extra_query_params=extra_query_params, - in_library_only=library_items_only, ) for item in next_items: yield item @@ -377,7 +359,7 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): db_id = int(item_id) # ensure integer extra_query = f"WHERE {self.db_table}.item_id = {item_id}" for db_item in await self._get_library_items_by_query( - extra_query_parts=[extra_query], in_library_only=False + extra_query_parts=[extra_query], ): return db_item msg = f"{self.media_type.value} not found in library: {db_id}" @@ -487,7 +469,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): offset=offset, extra_query_parts=[query], extra_query_params=query_params, - in_library_only=False, ) @final @@ -797,7 +778,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): extra_query_parts: list[str] | None = None, extra_query_params: dict[str, Any] | None = None, extra_join_parts: list[str] | None = None, - in_library_only: bool = False, ) -> list[ItemCls]: """Fetch MediaItem records from database by building the query.""" query_params = extra_query_params or {} @@ -813,7 +793,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): favorite=favorite, search=search, provider_filter=provider_filter, - in_library_only=in_library_only, limit=limit, ) else: @@ -825,7 +804,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): favorite=favorite, search=search, provider_filter=provider_filter, - in_library_only=in_library_only, ) # build and execute final query sql_query = self._build_final_query(query_parts, join_parts, order_by) @@ -860,7 +838,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): favorite: bool | None, search: str | None, provider_filter: list[str] | None, - in_library_only: bool, limit: int, ) -> None: """Build a fast random subquery with all filters applied.""" @@ -875,7 +852,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): favorite=favorite, search=search, provider_filter=provider_filter, - in_library_only=in_library_only, ) # Build the subquery @@ -904,7 +880,6 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): favorite: bool | None, search: str | None, provider_filter: list[str] | None, - in_library_only: bool, ) -> None: """Apply search, favorite, and provider filters.""" # handle search @@ -922,15 +897,9 @@ class MediaControllerBase[ItemCls: "MediaItemType"](metaclass=ABCMeta): join_parts.append( f"JOIN provider_mappings ON provider_mappings.item_id = {self.db_table}.item_id " f"AND provider_mappings.media_type = '{self.media_type.value}' " - f"AND provider_mappings.in_library = {in_library_only} " + f"AND provider_mappings.in_library = 1 " f"AND ({' OR '.join(provider_conditions)})" ) - elif in_library_only: - join_parts.append( - f"JOIN provider_mappings ON provider_mappings.item_id = {self.db_table}.item_id " - f"AND provider_mappings.media_type = '{self.media_type.value}' " - f"AND provider_mappings.in_library = {in_library_only} " - ) @final def _build_final_query( diff --git a/music_assistant/controllers/media/podcasts.py b/music_assistant/controllers/media/podcasts.py index c19bd506..7530b958 100644 --- a/music_assistant/controllers/media/podcasts.py +++ b/music_assistant/controllers/media/podcasts.py @@ -52,8 +52,6 @@ class PodcastsController(MediaControllerBase[Podcast]): provider: str | list[str] | None = None, extra_query: str | None = None, extra_query_params: dict[str, Any] | None = None, - library_items_only: bool = True, - **kwargs: Any, ) -> list[Podcast]: """Get in-database podcasts. @@ -65,8 +63,6 @@ class PodcastsController(MediaControllerBase[Podcast]): :param provider: Filter by provider instance ID (single string or list). :param extra_query: Additional SQL query string. :param extra_query_params: Additional query parameters. - :param library_items_only: If True, only return items that are - marked as 'in_library' on any provider mapping. """ extra_query_params = extra_query_params or {} extra_query_parts: list[str] = [extra_query] if extra_query else [] @@ -79,7 +75,6 @@ class PodcastsController(MediaControllerBase[Podcast]): provider_filter=self._ensure_provider_filter(provider), extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, - in_library_only=library_items_only, ) if search and len(result) < 25 and not offset: # append publisher items to result @@ -95,7 +90,6 @@ class PodcastsController(MediaControllerBase[Podcast]): provider_filter=self._ensure_provider_filter(provider), extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, - in_library_only=library_items_only, ) return result diff --git a/music_assistant/controllers/media/tracks.py b/music_assistant/controllers/media/tracks.py index 9dd2192c..b4346927 100644 --- a/music_assistant/controllers/media/tracks.py +++ b/music_assistant/controllers/media/tracks.py @@ -168,8 +168,6 @@ class TracksController(MediaControllerBase[Track]): provider: str | list[str] | None = None, extra_query: str | None = None, extra_query_params: dict[str, Any] | None = None, - library_items_only: bool = True, - **kwargs: Any, ) -> list[Track]: """Get in-database tracks. @@ -181,8 +179,6 @@ class TracksController(MediaControllerBase[Track]): :param provider: Filter by provider instance ID (single string or list). :param extra_query: Additional SQL query string. :param extra_query_params: Additional query parameters. - :param library_items_only: If True, only return items that are - marked as 'in_library' on any provider mapping. """ extra_query_params = extra_query_params or {} extra_query_parts: list[str] = [extra_query] if extra_query else [] @@ -212,7 +208,6 @@ class TracksController(MediaControllerBase[Track]): extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, extra_join_parts=extra_join_parts, - in_library_only=library_items_only, ) if search and len(result) < 25 and not offset: # append artist items to result @@ -233,7 +228,6 @@ class TracksController(MediaControllerBase[Track]): extra_query_parts=extra_query_parts, extra_query_params=extra_query_params, extra_join_parts=extra_join_parts, - in_library_only=library_items_only, ): # prevent duplicates (when artist is also in the title) if _track.uri not in existing_uris: @@ -421,9 +415,7 @@ class TracksController(MediaControllerBase[Track]): f"WHERE {DB_TABLE_ALBUM_TRACKS}.track_id = {item_id}" ) query = f"{DB_TABLE_ALBUMS}.item_id in ({subquery})" - return await self.mass.music.albums._get_library_items_by_query( - extra_query_parts=[query], in_library_only=True - ) + return await self.mass.music.albums._get_library_items_by_query(extra_query_parts=[query]) async def match_provider( self, diff --git a/music_assistant/controllers/music.py b/music_assistant/controllers/music.py index b2bc4530..9ca6b3b8 100644 --- a/music_assistant/controllers/music.py +++ b/music_assistant/controllers/music.py @@ -2598,9 +2598,7 @@ class MusicController(CoreController): self.audiobooks, self.podcasts, ): - async for db_item in ctrl.iter_library_items( - provider=list(multi_instance_providers), library_items_only=False - ): + async for db_item in ctrl.iter_library_items(provider=list(multi_instance_providers)): if self.match_provider_instances(db_item): await ctrl.update_item_in_library(db_item.item_id, db_item) # prevent overwhelming the event loop