Fix: unsubscribe entity updates at unload in HA provider
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 26 Mar 2025 19:37:02 +0000 (20:37 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 26 Mar 2025 19:37:02 +0000 (20:37 +0100)
music_assistant/providers/hass_players/__init__.py

index 6ef28ff9731bb5b3b2fe10de16e73ce5fbf2b5e1..a887eba93eb871f62f534bda766affd03dc11bd4 100644 (file)
@@ -164,6 +164,7 @@ class HomeAssistantPlayers(PlayerProvider):
     """Home Assistant PlayerProvider for Music Assistant."""
 
     hass_prov: HomeAssistantProvider
+    on_unload_callbacks: list[callable] | None = None
 
     async def loaded_in_mass(self) -> None:
         """Call after the provider has been loaded."""
@@ -180,12 +181,25 @@ class HomeAssistantPlayers(PlayerProvider):
                 continue
             await self._setup_player(state, entity_registry, device_registry)
         # register for entity state updates
-        await self.hass_prov.hass.subscribe_entities(self._on_entity_state_update, player_ids)
+        self.on_unload_callbacks = [
+            await self.hass_prov.hass.subscribe_entities(self._on_entity_state_update, player_ids)
+        ]
         # remove any leftover players (after reconfigure of players)
         for player in self.players:
             if player.player_id not in player_ids:
                 self.mass.players.remove(player.player_id)
 
+    async def unload(self, is_removed: bool = False) -> None:
+        """
+        Handle unload/close of the provider.
+
+        Called when provider is deregistered (e.g. MA exiting or config reloading).
+        is_removed will be set to True when the provider is removed from the configuration.
+        """
+        if self.on_unload_callbacks:
+            for callback in self.on_unload_callbacks:
+                callback()
+
     async def get_player_config_entries(
         self,
         player_id: str,