a few fixes for search
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 22 Jul 2022 23:15:50 +0000 (01:15 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 22 Jul 2022 23:15:50 +0000 (01:15 +0200)
music_assistant/controllers/music/__init__.py
music_assistant/models/enums.py
music_assistant/music_providers/ytmusic/ytmusic.py

index ba55e9ca4c8decda20a0a544da4e1c38c2da5be7..ce0f30a439dc370dd57ce4af092d0d53258018f0 100755 (executable)
@@ -2,6 +2,7 @@
 from __future__ import annotations
 
 import asyncio
+import itertools
 import statistics
 from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union
 
@@ -126,7 +127,10 @@ class MusicController:
         raise ProviderUnavailableError(f"Provider {provider_id} is not available")
 
     async def search(
-        self, search_query, media_types: List[MediaType], limit: int = 10
+        self,
+        search_query,
+        media_types: List[MediaType] = MediaType.ALL,
+        limit: int = 10,
     ) -> List[MediaItemType]:
         """
         Perform global search for media items on all providers.
@@ -138,19 +142,21 @@ class MusicController:
         # include results from all music providers
         provider_ids = [item.id for item in self.providers]
         # TODO: sort by name and filter out duplicates ?
-        return await asyncio.gather(
-            *[
-                self.search_provider(
-                    search_query, media_types, provider_id=prov_id, limit=limit
-                )
-                for prov_id in provider_ids
-            ]
+        return itertools.chain.from_iterable(
+            await asyncio.gather(
+                *[
+                    self.search_provider(
+                        search_query, media_types, provider_id=prov_id, limit=limit
+                    )
+                    for prov_id in provider_ids
+                ]
+            )
         )
 
     async def search_provider(
         self,
         search_query: str,
-        media_types: List[MediaType],
+        media_types: List[MediaType] = MediaType.ALL,
         provider: Optional[ProviderType] = None,
         provider_id: Optional[str] = None,
         limit: int = 10,
@@ -173,7 +179,7 @@ class MusicController:
 
         # prefer cache items (if any)
         cache_key = f"{prov.type.value}.search.{search_query}.{limit}"
-        cache_key += "".join(media_types)
+        cache_key += "".join((x.value for x in media_types))
 
         if cache := await self.mass.cache.get(cache_key):
             return [media_from_dict(x) for x in cache]
index 8ec4fae4a0998d0e7a20fe4d37c07787938be184..272b919347baed476ef454756f0b8fbae2775c9d 100644 (file)
@@ -1,6 +1,7 @@
 """All enums used by the Music Assistant models."""
 
 from enum import Enum, IntEnum
+from typing import List
 
 
 class MediaType(Enum):
@@ -15,6 +16,18 @@ class MediaType(Enum):
     ANNOUNCEMENT = "announcement"
     UNKNOWN = "unknown"
 
+    @classmethod
+    @property
+    def ALL(cls) -> List["MediaType"]:  # pylint: disable=invalid-name
+        """Return all (default) MediaTypes as list."""
+        return [
+            MediaType.ARTIST,
+            MediaType.ALBUM,
+            MediaType.TRACK,
+            MediaType.PLAYLIST,
+            MediaType.RADIO,
+        ]
+
 
 class MediaQuality(IntEnum):
     """Enum for Media Quality."""
index 04e0028afd461056b7aa9a3edc3d22a73feeed95..4ae52afce36c3ebc5fbd231d143a67255eb25a61 100644 (file)
@@ -536,7 +536,7 @@ class YoutubeMusicProvider(MusicProvider):
                 item_id=playlist_obj["id"], prov_type=self.type, prov_id=self.id
             )
         )
-        playlist.metadata.checksum = playlist_obj["checksum"]
+        playlist.metadata.checksum = playlist_obj.get("checksum")
         return playlist
 
     async def _parse_track(self, track_obj: dict) -> Track: