A few small bugfixes (#790)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 23 Jul 2023 19:56:36 +0000 (21:56 +0200)
committerGitHub <noreply@github.com>
Sun, 23 Jul 2023 19:56:36 +0000 (21:56 +0200)
* increase default limit

* fix typo

* fix playlist create

* fix various typos and bugs

* allow additional chunk in buffer

attempt to fix the buffer underrun issues

* bump frontend

* another fix for an albumless track

* log warning just in case

music_assistant/server/controllers/media/base.py
music_assistant/server/controllers/media/playlists.py
music_assistant/server/controllers/media/tracks.py
music_assistant/server/controllers/music.py
music_assistant/server/controllers/streams.py
music_assistant/server/helpers/compare.py
music_assistant/server/providers/filesystem_local/base.py
music_assistant/server/providers/ugp/__init__.py
music_assistant/server/providers/ugp/manifest.json
pyproject.toml
requirements_all.txt

index 6ae70f694301f7c2e6a107b3fdf7d274365d9c5f..2a9861d6f75ab0f8dcc7a9d3ed040f1658ee8814 100644 (file)
@@ -157,6 +157,7 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
             add_to_library = True
         if library_item and force_refresh:
             # get (first) provider item id belonging to this library item
+            add_to_library = True
             provider_instance_id_or_domain, item_id = await self.get_provider_mapping(library_item)
         elif library_item:
             # we have a library item and no refreshing is needed, return the results!
index 5b741a582c0f6e510049142f00690c75abcd7960..d3b419a87a1a6655f0c4f0f6b3df36d87a837cef 100644 (file)
@@ -3,6 +3,7 @@ from __future__ import annotations
 
 import asyncio
 import random
+import time
 from collections.abc import AsyncGenerator
 from typing import Any
 
@@ -117,17 +118,17 @@ class PlaylistController(MediaControllerBase[Playlist]):
         return library_item
 
     async def tracks(
-        self,
-        item_id: str,
-        provider_instance_id_or_domain: str,
+        self, item_id: str, provider_instance_id_or_domain: str, force_refresh: bool = False
     ) -> AsyncGenerator[Track, None]:
         """Return playlist tracks for the given provider playlist id."""
-        playlist = await self.get(item_id, provider_instance_id_or_domain)
+        playlist = await self.get(
+            item_id, provider_instance_id_or_domain, force_refresh=force_refresh
+        )
         prov = next(x for x in playlist.provider_mappings)
         async for track in self._get_provider_playlist_tracks(
             prov.item_id,
             prov.provider_instance,
-            cache_checksum=playlist.metadata.checksum,
+            cache_checksum=str(time.time()) if force_refresh else playlist.metadata.checksum,
         ):
             yield track
 
@@ -151,7 +152,9 @@ class PlaylistController(MediaControllerBase[Playlist]):
             raise ProviderUnavailableError("No provider available which allows playlists creation.")
 
         # create playlist on the provider
-        return await provider.create_playlist(name)
+        playlist = await provider.create_playlist(name)
+        # add the new playlist to the library
+        return await self.add_item_to_library(playlist, True)
 
     async def add_playlist_tracks(self, db_playlist_id: str | int, uris: list[str]) -> None:
         """Add multiple tracks to playlist. Creates background tasks to process the action."""
index c0f91c0ae77f13a99d345d50dd8e2f8c26c1ecf5..c35f25cba3c6d660be09107f8f63bf72dd1a3d4f 100644 (file)
@@ -133,6 +133,12 @@ class TracksController(MediaControllerBase[Track]):
             item.album = await self.mass.music.albums.get_provider_item(
                 item.album.item_id, item.album.provider, fallback=item.album
             )
+            if isinstance(item.album, ItemMapping):
+                self.logger.warning(
+                    "Unable to resolve Album for track %s, "
+                    "track will be added to the library without album",
+                    item.uri,
+                )
         if item.album and not isinstance(item.album, ItemMapping):
             item.album.artists = [
                 await self.mass.music.artists.get_provider_item(
index 664553cd6b0c4a44e0c3aa7b40b624f4ac8ac3db..eced162dc8b4eae36e310b989df397c5fc504238 100755 (executable)
@@ -154,7 +154,7 @@ class MusicController(CoreController):
         self,
         search_query: str,
         media_types: list[MediaType] = MediaType.ALL,
-        limit: int = 10,
+        limit: int = 50,
     ) -> SearchResults:
         """Perform global search for media items on all providers.
 
index 85f48103d05dfe96e287e5f51b2f861e6a9fe90d..3bbeff3aacf11650efd1a2e3069d26c136f83d4d 100644 (file)
@@ -162,7 +162,7 @@ class MultiClientStreamJob:
     async def subscribe(self, player_id: str) -> AsyncGenerator[bytes, None]:
         """Subscribe consumer and iterate incoming chunks on the queue."""
         try:
-            self.subscribed_players[player_id] = sub_queue = asyncio.Queue(1)
+            self.subscribed_players[player_id] = sub_queue = asyncio.Queue(2)
 
             if self._all_clients_connected.is_set():
                 # client subscribes while we're already started
index a981856d9092fa63033eb16391751a504711fc5b..d61cbe0dae820b1b54c567c06a646b8f6f80d57d 100644 (file)
@@ -292,9 +292,9 @@ def compare_track(
     if strict and not compare_version(base_item.version, compare_item.version):
         return False
     # check if both tracks are (not) explicit
-    if base_item.metadata.explicit is None and base_item.album:
+    if base_item.metadata.explicit is None and isinstance(base_item.album, Album):
         base_item.metadata.explicit = base_item.album.metadata.explicit
-    if compare_item.metadata.explicit is None and compare_item.album:
+    if compare_item.metadata.explicit is None and isinstance(base_item.album, Album):
         compare_item.metadata.explicit = compare_item.album.metadata.explicit
     if strict and not compare_explicit(base_item.metadata, compare_item.metadata):
         return False
index 2984112fedb22ae2691ef70c33b086b370cbcde4..ab932a72a473cd8eb3b70d145fca62770b83b168 100644 (file)
@@ -272,7 +272,7 @@ class FileSystemProviderBase(MusicProvider):
                 elif playlist := await self.get_playlist(item.path):
                     # make sure that the item exists
                     # https://github.com/music-assistant/hass-music-assistant/issues/707
-                    library_item = await self.mass.music.playlists.add(
+                    library_item = await self.mass.music.playlists.add_item_to_library(
                         playlist, skip_metadata_lookup=True
                     )
                     subitems.append(library_item)
@@ -574,7 +574,7 @@ class FileSystemProviderBase(MusicProvider):
         else:
             playlist_lines = await parse_pls(playlist_data)
 
-        for line_no, playlist_line in enumerate(playlist_lines):
+        for line_no, playlist_line in enumerate(playlist_lines, 1):
             if line_no not in positions_to_remove:
                 cur_lines.append(playlist_line)
 
index 5e6f93b4bf36d9a57a4927a9eba0e95e07b5c2a9..8c6ce4df7fd8ba47856d5f6ce33f530c5a55f26c 100644 (file)
@@ -467,8 +467,10 @@ class UniversalGroupProvider(PlayerProvider):
         child_players: list[Player] = []
         conf_members: list[str] = self.config.get_value(player_id)
         ignore_ids = set()
-        group_player = self.mass.players.get(player_id)
-        parent_source = group_player.active_source
+        if group_player := self.mass.players.get(player_id):
+            parent_source = group_player.active_source
+        else:
+            parent_source = player_id
         for child_id in conf_members:
             if child_player := self.mass.players.get(child_id, False):
                 # work out power state
index a2aeccea5a8ed85988caf44f6b7ca33ed6bd786a..c10c66f82c894fc9bfe56823361ab26c04760d7b 100644 (file)
@@ -8,6 +8,6 @@
   "documentation": "",
   "multi_instance": false,
   "builtin": false,
-  "load_by_default": false,
+  "load_by_default": true,
   "icon": "speaker-multiple"
 }
index 405ba8ab828fe98a19f6fccfc7b3604e5552f933..99668a28db7c609bd1cb9409cb0f542fb511bf63 100644 (file)
@@ -37,7 +37,7 @@ server = [
   "python-slugify==8.0.1",
   "mashumaro==3.8.1",
   "memory-tempfile==2.2.3",
-  "music-assistant-frontend==2.0.5",
+  "music-assistant-frontend==2.0.7",
   "pillow==9.5.0",
   "unidecode==1.3.6",
   "xmltodict==0.13.0",
index f21260392b26d1505fcd09d9c2cf416535784928..efe674af4c2f22d03434ed9714f6b89bb5b252fc 100644 (file)
@@ -18,7 +18,7 @@ git+https://github.com/gieljnssns/python-radios.git@main
 ifaddr==0.2.0
 mashumaro==3.8.1
 memory-tempfile==2.2.3
-music-assistant-frontend==2.0.5
+music-assistant-frontend==2.0.7
 orjson==3.9.2
 pillow==9.5.0
 plexapi==4.14.0