From 28e1fefb86f80e54a9ebdc5ec5845c15f4b5a1ea Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Mon, 3 Apr 2023 23:39:02 +0200 Subject: [PATCH] small improvements --- music_assistant/server/controllers/media/playlists.py | 8 ++++---- music_assistant/server/controllers/media/radio.py | 6 +++--- music_assistant/server/models/music_provider.py | 3 +-- .../server/providers/filesystem_local/base.py | 6 +++--- music_assistant/server/providers/ytmusic/helpers.py | 2 +- music_assistant/server/server.py | 11 +++++++++++ 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/music_assistant/server/controllers/media/playlists.py b/music_assistant/server/controllers/media/playlists.py index 8cb38f6f..cd3b1a91 100644 --- a/music_assistant/server/controllers/media/playlists.py +++ b/music_assistant/server/controllers/media/playlists.py @@ -210,7 +210,7 @@ class PlaylistController(MediaControllerBase[Playlist]): return await self.get_db_item(item_id) async def _update_db_item( - self, item_id: int, item: Playlist, overwrite: bool = True + self, item_id: int, item: Playlist, overwrite: bool = False ) -> Playlist: """Update Playlist record in the database.""" cur_item = await self.get_db_item(item_id) @@ -221,9 +221,9 @@ class PlaylistController(MediaControllerBase[Playlist]): {"item_id": item_id}, { # always prefer name/owner from updated item here - "name": item.name, - "sort_name": item.sort_name, - "owner": item.owner, + "name": item.name or cur_item.name, + "sort_name": item.sort_name or cur_item.sort_name, + "owner": item.owner or cur_item.sort_name, "is_editable": item.is_editable, "metadata": serialize_to_json(metadata), "provider_mappings": serialize_to_json(provider_mappings), diff --git a/music_assistant/server/controllers/media/radio.py b/music_assistant/server/controllers/media/radio.py index 2dbb946d..4ab86782 100644 --- a/music_assistant/server/controllers/media/radio.py +++ b/music_assistant/server/controllers/media/radio.py @@ -95,7 +95,7 @@ class RadioController(MediaControllerBase[Radio]): # return created object return await self.get_db_item(item_id) - async def _update_db_item(self, item_id: int, item: Radio, overwrite: bool = True) -> Radio: + async def _update_db_item(self, item_id: int, item: Radio, overwrite: bool = False) -> Radio: """Update Radio record in the database.""" cur_item = await self.get_db_item(item_id) metadata = cur_item.metadata.update(getattr(item, "metadata", None), overwrite) @@ -106,8 +106,8 @@ class RadioController(MediaControllerBase[Radio]): match, { # always prefer name from updated item here - "name": item.name, - "sort_name": item.sort_name, + "name": item.name or cur_item.name, + "sort_name": item.sort_name or cur_item.sort_name, "metadata": serialize_to_json(metadata), "provider_mappings": serialize_to_json(provider_mappings), "timestamp_modified": int(utc_timestamp()), diff --git a/music_assistant/server/models/music_provider.py b/music_assistant/server/models/music_provider.py index 72560a32..bcbcee69 100644 --- a/music_assistant/server/models/music_provider.py +++ b/music_assistant/server/models/music_provider.py @@ -388,11 +388,10 @@ class MusicProvider(Provider): raise NotImplementedError return [] - async def sync_library(self, media_types: tuple[MediaType, ...] | None = None) -> None: + async def sync_library(self, media_types: tuple[MediaType, ...]) -> None: """Run library sync for this provider.""" # this reference implementation can be overridden # with a provider specific approach if needed - media_types = tuple(x for x in MediaType) for media_type in media_types: if not self.library_supported(media_type): continue diff --git a/music_assistant/server/providers/filesystem_local/base.py b/music_assistant/server/providers/filesystem_local/base.py index 80a7bb35..9c126af6 100644 --- a/music_assistant/server/providers/filesystem_local/base.py +++ b/music_assistant/server/providers/filesystem_local/base.py @@ -271,10 +271,10 @@ class FileSystemProviderBase(MusicProvider): items=sorted(subitems, key=lambda x: (x.name.casefold(), x.name)), ) - async def sync_library( - self, media_types: tuple[MediaType, ...] | None = None # noqa: ARG002 - ) -> None: + async def sync_library(self, media_types: tuple[MediaType, ...]) -> None: """Run library sync for this provider.""" + if MediaType.TRACK not in media_types or MediaType.PLAYLIST not in media_types: + return cache_key = f"{self.instance_id}.checksums" prev_checksums = await self.mass.cache.get(cache_key, SCHEMA_VERSION) save_checksum_interval = 0 diff --git a/music_assistant/server/providers/ytmusic/helpers.py b/music_assistant/server/providers/ytmusic/helpers.py index 23b0f177..27491a51 100644 --- a/music_assistant/server/providers/ytmusic/helpers.py +++ b/music_assistant/server/providers/ytmusic/helpers.py @@ -266,7 +266,7 @@ async def search(query: str, ytm_filter: str = None, limit: int = 20) -> list[di def get_playlist_checksum(playlist_obj: dict) -> str: """Try to calculate a checksum so we can detect changes in a playlist.""" - for key in ("duration_seconds", "trackCount"): + for key in ("duration_seconds", "trackCount", "count"): if key in playlist_obj: return playlist_obj[key] return str(int(time())) diff --git a/music_assistant/server/server.py b/music_assistant/server/server.py index 76b1438a..876bf4fc 100644 --- a/music_assistant/server/server.py +++ b/music_assistant/server/server.py @@ -182,6 +182,17 @@ class MusicAssistant: """Signal event to subscribers.""" if self.closing: return + if ( + event + in ( + EventType.MEDIA_ITEM_ADDED, + EventType.MEDIA_ITEM_DELETED, + EventType.MEDIA_ITEM_UPDATED, + ) + and self.music.in_progress_syncs + ): + # ignore media item events while sync is running because it clutters too much + return if LOGGER.isEnabledFor(logging.DEBUG) and event != EventType.QUEUE_TIME_UPDATED: # do not log queue time updated events because that is too chatty -- 2.34.1