small tweaks
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 21 Aug 2024 14:20:22 +0000 (16:20 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 21 Aug 2024 14:20:22 +0000 (16:20 +0200)
music_assistant/common/models/api.py
music_assistant/server/controllers/media/albums.py
music_assistant/server/controllers/media/base.py
music_assistant/server/controllers/metadata.py
music_assistant/server/controllers/webserver.py

index ee91666f222ea4470f482a27ffc650c48ab1fcf8..d3b5e83c942b3f9b3536b8509c6bded00365c497 100644 (file)
@@ -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
index 189c9e22bd68b53ffff0779843e9032faf3ff842..6d3454eb97ee03831fbf4e10e7e36a2a3b5dbc32 100644 (file)
@@ -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),
index 222e6d3cdfdb209dd29743bfd49ab452b63ec8a3..a326bca48f360a991fd18a5d3699a8b9f1fcc60e 100644 (file)
@@ -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,
index f7e2ed67ac5957dbfd34d587d8c913b97b74c067..eb1cad475da4cfb44fe5b7b9b00761d9a35289b9 100644 (file)
@@ -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
 
index 39869898e12dd457d94f8816788b44d587f571ea..c3faff21ea935a713323997a9f6a1193c67e440b 100644 (file)
@@ -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))