Add missing metadata for Spotify Connect
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 27 Oct 2025 20:39:57 +0000 (21:39 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 27 Oct 2025 20:39:57 +0000 (21:39 +0100)
music_assistant/providers/spotify_connect/__init__.py

index 55802670225d4f19e604ca6d86be4b2da3038feb..378278a1e6a32e170c4751b945778bc1b220a768 100644 (file)
@@ -491,34 +491,38 @@ class SpotifyConnectProvider(PluginProvider):
             self._source_details.in_use_by = self.mass_player_id
 
         # parse metadata fields
-        if "common_metadata_fields" in json_data:
-            uri = json_data["common_metadata_fields"].get("uri", "Unknown")
-            title = json_data["common_metadata_fields"].get("name", "Unknown")
-            if artists := json_data.get("track_metadata_fields", {}).get("artists"):
-                artist = artists[0]
-            else:
-                artist = "Unknown"
-            album = json_data["common_metadata_fields"].get("album", "Unknown")
-            if images := json_data["common_metadata_fields"].get("covers"):
-                image_url = images[0]
-            else:
-                image_url = None
+        if common_meta := json_data.get("common_metadata_fields", {}):
+            uri = common_meta.get("uri", "Unknown")
+            title = common_meta.get("name", "Unknown")
+            image_url = images[0] if (images := common_meta.get("covers")) else None
             if self._source_details.metadata is None:
                 self._source_details.metadata = StreamMetadata(uri=uri, title=title)
-            self._source_details.metadata.uri = uri
-            self._source_details.metadata.title = title
-            self._source_details.metadata.artist = artist
-            self._source_details.metadata.album = album
-            self._source_details.metadata.image_url = image_url
-            self._source_details.metadata.description = json_data.get(
-                "episode_metadata_fields", {}
-            ).get("description")
-            self._source_details.metadata.duration = json_data.get("duration_ms", 0) * 0.001
-            self._source_details.metadata.elapsed_time = json_data.get("position", None)
-            self._source_details.metadata.elapsed_time_last_updated = time.time()
-            if self._source_details.in_use_by:
-                # tell connected player to update metadata
-                self.mass.players.trigger_player_update(self._source_details.in_use_by)
+                self._source_details.metadata.uri = uri
+                self._source_details.metadata.title = title
+                self._source_details.metadata.artist = None
+                self._source_details.metadata.album = None
+                self._source_details.metadata.image_url = image_url
+                self._source_details.metadata.description = None
+                duration_ms = common_meta.get("duration_ms", 0)
+                self._source_details.metadata.duration = (
+                    int(duration_ms) // 1000 if duration_ms is not None else None
+                )
+
+        if track_meta := json_data.get("track_metadata_fields", {}):
+            if artists := track_meta.get("artists"):
+                if self._source_details.metadata is not None:
+                    self._source_details.metadata.artist = artists[0]
+            if self._source_details.metadata is not None:
+                self._source_details.metadata.album = track_meta.get("album")
+
+        if episode_meta := json_data.get("episode_metadata_fields", {}):
+            if self._source_details.metadata is not None:
+                self._source_details.metadata.description = episode_meta.get("description")
+
+        if "position_ms" in json_data:
+            if self._source_details.metadata is not None:
+                self._source_details.metadata.elapsed_time = int(json_data["position_ms"]) // 1000
+                self._source_details.metadata.elapsed_time_last_updated = int(time.time())
 
         if event_name == "volume_changed" and (volume := json_data.get("volume")):
             # Spotify Connect volume is 0-65535
@@ -528,4 +532,8 @@ class SpotifyConnectProvider(PluginProvider):
             except UnsupportedFeaturedException:
                 self.logger.debug(f"Player {self.mass_player_id} does not support volume control")
 
+        # signal update to connected player
+        if self._source_details.in_use_by:
+            self.mass.players.trigger_player_update(self._source_details.in_use_by)
+
         return Response()