From: Marcel van der Veldt Date: Fri, 22 Jul 2022 23:15:50 +0000 (+0200) Subject: a few fixes for search X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=aac4b722efe50e008aeec9582400cd5ac45ddc78;p=music-assistant-server.git a few fixes for search --- diff --git a/music_assistant/controllers/music/__init__.py b/music_assistant/controllers/music/__init__.py index ba55e9ca..ce0f30a4 100755 --- a/music_assistant/controllers/music/__init__.py +++ b/music_assistant/controllers/music/__init__.py @@ -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] diff --git a/music_assistant/models/enums.py b/music_assistant/models/enums.py index 8ec4fae4..272b9193 100644 --- a/music_assistant/models/enums.py +++ b/music_assistant/models/enums.py @@ -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.""" diff --git a/music_assistant/music_providers/ytmusic/ytmusic.py b/music_assistant/music_providers/ytmusic/ytmusic.py index 04e0028a..4ae52afc 100644 --- a/music_assistant/music_providers/ytmusic/ytmusic.py +++ b/music_assistant/music_providers/ytmusic/ytmusic.py @@ -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: