Fix for appending single tracks to queue (#385)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 23 Jun 2022 15:25:56 +0000 (17:25 +0200)
committerGitHub <noreply@github.com>
Thu, 23 Jun 2022 15:25:56 +0000 (17:25 +0200)
* fix for appending single items to the queue

music_assistant/models/media_controller.py
music_assistant/models/player_queue.py

index fc7f5e04441a2d7974b76761676bbc1ddc8b34e1..b03ae4fcf2c39b09122ba54fa72429658fe2b374 100644 (file)
@@ -19,7 +19,7 @@ from music_assistant.models.errors import MediaNotFoundError, ProviderUnavailabl
 from music_assistant.models.event import MassEvent
 
 from .enums import EventType, MediaType, ProviderType
-from .media_items import MediaItemType
+from .media_items import MediaItemType, media_from_dict
 
 if TYPE_CHECKING:
     from music_assistant.mass import MusicAssistant
@@ -163,7 +163,7 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
             f"{prov.type.value}.search.{self.media_type.value}.{search_query}.{limit}"
         )
         if cache := await self.mass.cache.get(cache_key):
-            return [self.media_type.from_dict(x) for x in cache]
+            return [media_from_dict(x) for x in cache]
         # no items in cache - get listing from provider
         items = await prov.search(
             search_query,
index 88834c120f3a2f55b8ed05a4e6e03ebac57addd0..7c5e02290a9fbbe61446659bc9e02211bd3e1759 100644 (file)
@@ -544,18 +544,22 @@ class PlayerQueue:
 
     async def append(self, queue_items: List[QueueItem]) -> None:
         """Append new items at the end of the queue."""
-        cur_index = self._current_index or 0
         for index, item in enumerate(queue_items):
             item.sort_index = len(self.items) + index
         if self.settings.shuffle_enabled:
             # if shuffle is enabled we shuffle the remaining tracks and the new ones
-            played_items = self.items[:cur_index]
-            next_items = self.items[cur_index + 1 :] + queue_items
-            next_items = random.sample(next_items, len(next_items))
-            if self.current_item:
-                queue_items = played_items + [self.current_item] + next_items
+            cur_index = self.index_in_buffer or self._current_index
+            if cur_index is None:
+                played_items = []
+                next_items = self.items + queue_items
+                cur_item = []
             else:
-                queue_items = played_items + next_items
+                played_items = self.items[:cur_index] if cur_index is not None else []
+                next_items = self.items[cur_index + 1 :] + queue_items
+                cur_item = [self.get_item(cur_index)]
+            # do the shuffle
+            next_items = random.sample(next_items, len(next_items))
+            queue_items = played_items + cur_item + next_items
         else:
             queue_items = self._items + queue_items
         await self._update_items(queue_items)