From: Marcel van der Veldt Date: Wed, 26 Mar 2025 19:37:02 +0000 (+0100) Subject: Fix: unsubscribe entity updates at unload in HA provider X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=fc2a7f965150439123be92ba6ffeb57027b32c59;p=music-assistant-server.git Fix: unsubscribe entity updates at unload in HA provider --- diff --git a/music_assistant/providers/hass_players/__init__.py b/music_assistant/providers/hass_players/__init__.py index 6ef28ff9..a887eba9 100644 --- a/music_assistant/providers/hass_players/__init__.py +++ b/music_assistant/providers/hass_players/__init__.py @@ -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,