small improvements
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 3 Apr 2023 21:39:02 +0000 (23:39 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 3 Apr 2023 21:39:02 +0000 (23:39 +0200)
music_assistant/server/controllers/media/playlists.py
music_assistant/server/controllers/media/radio.py
music_assistant/server/models/music_provider.py
music_assistant/server/providers/filesystem_local/base.py
music_assistant/server/providers/ytmusic/helpers.py
music_assistant/server/server.py

index 8cb38f6f6a127f4b6f76a02d6453649bf67931eb..cd3b1a91ebc51dcd4ec5f8d54b0ded72ee11eff3 100644 (file)
@@ -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),
index 2dbb946dd83f3cdbad52d0cf642f547af860c7da..4ab8678298dc9460faa84eb7e5a234a682bfc975 100644 (file)
@@ -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()),
index 72560a3210fd6f6282dce779b42cc2221afd7148..bcbcee69f80e83faef716f0510adbb2aedc44a38 100644 (file)
@@ -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
index 80a7bb358be4022712efbd6e1abbfb949749d0a7..9c126af6f98c5fd69bb95937c76b970bc309865d 100644 (file)
@@ -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
index 23b0f177b8516836b9a69b055ee2a6d434f57c4c..27491a51e0add20ff1cf4a23ec0e4da1fbce7559 100644 (file)
@@ -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()))
index 76b1438a0280cebd5b96c295a54cb3bc8d87e920..876bf4fc8d152428f38ef90ca4fc228c1aa5bd16 100644 (file)
@@ -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