fix for cache
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 23 Jun 2022 09:50:39 +0000 (11:50 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 23 Jun 2022 09:50:39 +0000 (11:50 +0200)
music_assistant/controllers/music/artists.py
music_assistant/models/media_controller.py

index df27a1ec78902bd38ab3cfddee954e568030b180..a06f69f9a5d59bfda5d42a203e91c2749142f469 100644 (file)
@@ -121,7 +121,7 @@ class ArtistsController(MediaControllerBase[Artist]):
         if not prov:
             return []
         # prefer cache items (if any)
-        cache_key = f"{prov.type.value}.artist_albums.{item_id}"
+        cache_key = f"{prov.type.value}.artist_toptracks.{item_id}"
         if cache := await self.mass.cache.get(cache_key):
             return [Track.from_dict(x) for x in cache]
         # no items in cache - get listing from provider
index e01affa9ad2152452fbad8492175dd07da5dea44..a63f55b0dd036872f780484ebfedbda973912abd 100644 (file)
@@ -144,7 +144,9 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
         limit: int = 25,
     ) -> List[ItemCls]:
         """Search database or provider with given query."""
-        search_query = search_query.replace("/", " ")  # safe search string
+        search_query = search_query.replace("/", " ").replace(
+            "'", ""
+        )  # safe search string
         if provider == ProviderType.DATABASE or provider_id == "database":
             return [
                 self.item_cls.from_db_row(db_row)
@@ -153,14 +155,25 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
                 )
             ]
 
-        provider = self.mass.music.get_provider(provider_id or provider)
-        if not provider:
+        prov = self.mass.music.get_provider(provider_id or provider)
+        if not prov:
             return {}
-        return await provider.search(
+
+        # prefer cache items (if any)
+        cache_key = f"{prov.type.value}.search.{self.media_type.value}"
+        if cache := await self.mass.cache.get(cache_key):
+            return [self.media_type.from_dict(x) for x in cache]
+        # no items in cache - get listing from provider
+        items = await provider.search(
             search_query,
             [self.media_type],
             limit,
         )
+        # store (serializable items) in cache
+        self.mass.create_task(
+            self.mass.cache.set(cache_key, [x.to_dict() for x in items])
+        )
+        return items
 
     async def add_to_library(
         self,