From ce9188a1f74fecd87847d2dc61952e57ac12fdb0 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sun, 23 Jul 2023 21:56:36 +0200 Subject: [PATCH] A few small bugfixes (#790) * 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 | 1 + .../server/controllers/media/playlists.py | 15 +++++++++------ .../server/controllers/media/tracks.py | 6 ++++++ music_assistant/server/controllers/music.py | 2 +- music_assistant/server/controllers/streams.py | 2 +- music_assistant/server/helpers/compare.py | 4 ++-- .../server/providers/filesystem_local/base.py | 4 ++-- music_assistant/server/providers/ugp/__init__.py | 6 ++++-- .../server/providers/ugp/manifest.json | 2 +- pyproject.toml | 2 +- requirements_all.txt | 2 +- 11 files changed, 29 insertions(+), 17 deletions(-) diff --git a/music_assistant/server/controllers/media/base.py b/music_assistant/server/controllers/media/base.py index 6ae70f69..2a9861d6 100644 --- a/music_assistant/server/controllers/media/base.py +++ b/music_assistant/server/controllers/media/base.py @@ -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! diff --git a/music_assistant/server/controllers/media/playlists.py b/music_assistant/server/controllers/media/playlists.py index 5b741a58..d3b419a8 100644 --- a/music_assistant/server/controllers/media/playlists.py +++ b/music_assistant/server/controllers/media/playlists.py @@ -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.""" diff --git a/music_assistant/server/controllers/media/tracks.py b/music_assistant/server/controllers/media/tracks.py index c0f91c0a..c35f25cb 100644 --- a/music_assistant/server/controllers/media/tracks.py +++ b/music_assistant/server/controllers/media/tracks.py @@ -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( diff --git a/music_assistant/server/controllers/music.py b/music_assistant/server/controllers/music.py index 664553cd..eced162d 100755 --- a/music_assistant/server/controllers/music.py +++ b/music_assistant/server/controllers/music.py @@ -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. diff --git a/music_assistant/server/controllers/streams.py b/music_assistant/server/controllers/streams.py index 85f48103..3bbeff3a 100644 --- a/music_assistant/server/controllers/streams.py +++ b/music_assistant/server/controllers/streams.py @@ -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 diff --git a/music_assistant/server/helpers/compare.py b/music_assistant/server/helpers/compare.py index a981856d..d61cbe0d 100644 --- a/music_assistant/server/helpers/compare.py +++ b/music_assistant/server/helpers/compare.py @@ -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 diff --git a/music_assistant/server/providers/filesystem_local/base.py b/music_assistant/server/providers/filesystem_local/base.py index 2984112f..ab932a72 100644 --- a/music_assistant/server/providers/filesystem_local/base.py +++ b/music_assistant/server/providers/filesystem_local/base.py @@ -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) diff --git a/music_assistant/server/providers/ugp/__init__.py b/music_assistant/server/providers/ugp/__init__.py index 5e6f93b4..8c6ce4df 100644 --- a/music_assistant/server/providers/ugp/__init__.py +++ b/music_assistant/server/providers/ugp/__init__.py @@ -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 diff --git a/music_assistant/server/providers/ugp/manifest.json b/music_assistant/server/providers/ugp/manifest.json index a2aeccea..c10c66f8 100644 --- a/music_assistant/server/providers/ugp/manifest.json +++ b/music_assistant/server/providers/ugp/manifest.json @@ -8,6 +8,6 @@ "documentation": "", "multi_instance": false, "builtin": false, - "load_by_default": false, + "load_by_default": true, "icon": "speaker-multiple" } diff --git a/pyproject.toml b/pyproject.toml index 405ba8ab..99668a28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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", diff --git a/requirements_all.txt b/requirements_all.txt index f2126039..efe674af 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 -- 2.34.1