Fix items not showing up in the library (filtering still not right) (#2873)
authorArtur Pragacz <49985303+arturpragacz@users.noreply.github.com>
Tue, 23 Dec 2025 16:08:58 +0000 (17:08 +0100)
committerGitHub <noreply@github.com>
Tue, 23 Dec 2025 16:08:58 +0000 (17:08 +0100)
Reverts (partially) 1b60a3c.

music_assistant/controllers/media/albums.py
music_assistant/controllers/media/artists.py
music_assistant/controllers/media/audiobooks.py
music_assistant/controllers/media/base.py
music_assistant/controllers/media/podcasts.py
music_assistant/controllers/media/tracks.py
music_assistant/controllers/music.py

index 4a7a6c884915ad1f0708f2b600d12c70ca158bab..d7c1b9d137abf132d3da253be1597b02cdb04d8b 100644 (file)
@@ -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:
index 95dbb43fe71a0523149ab33a685fefc729ff67dc..a1a651537869ba307ccad3694c2634f8673f799b 100644 (file)
@@ -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(
index 84d42da0d500ec2e31f62370a62af9fb3033e29a..671fd6429128a347ab7bd438e835cb355f7c09dd 100644 (file)
@@ -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
 
index afeaae8e6e8b0f005046149c3a9cd9020ff0d1ab..fb1e9fa8cc1f77b42e8af956bda0b5a6fbf450ef 100644 (file)
@@ -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(
index c19bd506890f727e56a9c23a7129a615f9272be9..7530b95894176e92a4ec12f0bfd94154a52804b7 100644 (file)
@@ -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
 
index 9dd2192c3b328176267c39e4810318b4e872977e..b43469270a76f5b41af10a05d9ea1f88a9ea0aa4 100644 (file)
@@ -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,
index b2bc45303648637994ef0364237584d145405710..9ca6b3b890682f23ade005ba188ee6a4d8158681 100644 (file)
@@ -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