From: Marcel van der Veldt Date: Wed, 21 Aug 2024 14:20:22 +0000 (+0200) Subject: small tweaks X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=b07aa81935ed11d4865f57e3af24bec0a5845dfc;p=music-assistant-server.git small tweaks --- diff --git a/music_assistant/common/models/api.py b/music_assistant/common/models/api.py index ee91666f..d3b5e83c 100644 --- a/music_assistant/common/models/api.py +++ b/music_assistant/common/models/api.py @@ -34,6 +34,7 @@ class SuccessResultMessage(ResultMessageBase): """Message sent when a Command has been successfully executed.""" result: Any = field(default=None, metadata={"serialize": lambda v: get_serializable_value(v)}) + partial: bool = False @dataclass diff --git a/music_assistant/server/controllers/media/albums.py b/music_assistant/server/controllers/media/albums.py index 189c9e22..6d3454eb 100644 --- a/music_assistant/server/controllers/media/albums.py +++ b/music_assistant/server/controllers/media/albums.py @@ -119,6 +119,7 @@ class AlbumsController(MediaControllerBase[Album]): extra_query_params: dict[str, Any] = extra_query_params or {} extra_query_parts: list[str] = [extra_query] if extra_query else [] extra_join_parts: list[str] = [] + artist_table_joined = False # optional album type filter if album_types: extra_query_parts.append("albums.album_type IN :album_types") @@ -343,7 +344,7 @@ class AlbumsController(MediaControllerBase[Album]): "sort_name": update.sort_name if overwrite else cur_item.sort_name or update.sort_name, - "version": update.version if overwrite else cur_item.version, + "version": update.version if overwrite else cur_item.version or update.version, "year": update.year if overwrite else cur_item.year or update.year, "album_type": album_type.value, "metadata": serialize_to_json(metadata), diff --git a/music_assistant/server/controllers/media/base.py b/music_assistant/server/controllers/media/base.py index 222e6d3c..a326bca4 100644 --- a/music_assistant/server/controllers/media/base.py +++ b/music_assistant/server/controllers/media/base.py @@ -23,8 +23,8 @@ from music_assistant.common.models.media_items import ( ItemMapping, MediaItemType, ProviderMapping, + SearchResults, Track, - media_from_dict, ) from music_assistant.constants import DB_TABLE_PLAYLOG, DB_TABLE_PROVIDER_MAPPINGS, MASS_LOGGER_NAME from music_assistant.server.helpers.compare import compare_media_item @@ -306,13 +306,14 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta): cache_key, category=cache_category, base_key=cache_base_key ) ) is not None: - return [media_from_dict(x) for x in cache] - # no items in cache - get listing from provider - searchresult = await prov.search( - search_query, - [self.media_type], - limit, - ) + searchresult = SearchResults.from_dict(cache) + else: + # no items in cache - get listing from provider + searchresult = await prov.search( + search_query, + [self.media_type], + limit, + ) if self.media_type == MediaType.ARTIST: items = searchresult.artists elif self.media_type == MediaType.ALBUM: @@ -328,7 +329,7 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta): self.mass.create_task( self.mass.cache.set( cache_key, - [x.to_dict() for x in items], + searchresult.to_dict(), expiration=86400 * 7, category=cache_category, base_key=cache_base_key, diff --git a/music_assistant/server/controllers/metadata.py b/music_assistant/server/controllers/metadata.py index f7e2ed67..eb1cad47 100644 --- a/music_assistant/server/controllers/metadata.py +++ b/music_assistant/server/controllers/metadata.py @@ -540,7 +540,7 @@ class MetaDataController(CoreController): ) album.metadata.update(prov_item.metadata) if album.year is None and prov_item.year: - album.year = prov_item + album.year = prov_item.year if album.album_type == AlbumType.UNKNOWN: album.album_type = prov_item.album_type diff --git a/music_assistant/server/controllers/webserver.py b/music_assistant/server/controllers/webserver.py index 39869898..c3faff21 100644 --- a/music_assistant/server/controllers/webserver.py +++ b/music_assistant/server/controllers/webserver.py @@ -14,7 +14,7 @@ import urllib.parse from concurrent import futures from contextlib import suppress from functools import partial -from typing import TYPE_CHECKING, Final +from typing import TYPE_CHECKING, Any, Final from aiohttp import WSMsgType, web from music_assistant_frontend import where as locate_frontend @@ -348,8 +348,16 @@ class WebsocketClientHandler: args = parse_arguments(handler.signature, handler.type_hints, msg.args) result = handler.target(**args) if hasattr(result, "__anext__"): - # handle async generator - result = [x async for x in result] + # handle async generator (for really large listings) + iterator = result + result: list[Any] = [] + async for item in iterator: + result.append(item) + if len(result) >= 500: + self._send_message( + SuccessResultMessage(msg.message_id, result, partial=True) + ) + result = [] elif asyncio.iscoroutine(result): result = await result self._send_message(SuccessResultMessage(msg.message_id, result))