(Roku) Media Assistant provider: bug fixes / cleanup (#2828)
authorMedieval Apple <114710036+MedievalApple@users.noreply.github.com>
Wed, 17 Dec 2025 10:25:26 +0000 (05:25 -0500)
committerGitHub <noreply@github.com>
Wed, 17 Dec 2025 10:25:26 +0000 (11:25 +0100)
music_assistant/providers/roku_media_assistant/player.py

index c5999609d816ad1d2ddb3c83ec63ab8803fd0cf8..3f2885fc89752137098148214bca8763eddbf87b 100644 (file)
@@ -79,6 +79,9 @@ class MediaAssistantPlayer(Player):
 
     async def power(self, powered: bool) -> None:
         """Handle POWER command on the player."""
+        logger = self.provider.logger.getChild(self.player_id)
+        logger.info("Received POWER command on player %s", self.display_name)
+
         try:
             device_info = await self.roku.update()
             app_running = False
@@ -86,21 +89,22 @@ class MediaAssistantPlayer(Player):
                 app_running = device_info.app.app_id == self.provider.config.get_value(
                     CONF_ROKU_APP_ID
                 )
+        except Exception:
+            self.logger.error("Failed to get app state on: %s", self.name)
 
+        try:
             # There's no real way to "Power" on the app since device wake up / app start
             # is handled by The roku once it receives the Play Media request
             if not powered:
                 if app_running:
                     await self.roku.remote("home")
                     await self.roku.remote("power")
-
-            logger = self.provider.logger.getChild(self.player_id)
-            logger.info("Received POWER command on player %s", self.display_name)
-            # update the player state in the player manager
-            self.update_state()
         except Exception:
             self.logger.error("Failed to change Power state on: %s", self.name)
 
+        # update the player state in the player manager
+        self.update_state()
+
     async def volume_mute(self, muted: bool) -> None:
         """Handle VOLUME MUTE command on the player."""
         await self.roku.remote("volume_mute")
@@ -160,7 +164,6 @@ class MediaAssistantPlayer(Player):
 
         logger = self.provider.logger.getChild(self.player_id)
         logger.info("Received PAUSE command on player %s", self.display_name)
-        self._attr_playback_state = PlaybackState.PAUSED
         self.update_state()
 
     async def play_media(self, media: PlayerMedia) -> None:
@@ -286,15 +289,19 @@ class MediaAssistantPlayer(Player):
 
                 if "position" in media_state:
                     try:
-                        self._attr_elapsed_time = (
-                            int(media_state["position"].split(" ", 1)[0]) / 1000
-                        )
+                        position = int(media_state["position"].split(" ", 1)[0]) / 1000
+                        if self.elapsed_time is not None:
+                            if abs(position - self.elapsed_time) > 10:
+                                self._attr_current_media = self.queued
+                        self._attr_elapsed_time = position
                         self._attr_elapsed_time_last_updated = time.time()
                     except Exception:
                         self.logger.info(
                             "Playback Position received from %s Was Invalid", self.name
                         )
 
+                self.update_state()
+
                 if not self.current_media or self._attr_playback_state != PlaybackState.PLAYING:
                     return
 
@@ -303,7 +310,7 @@ class MediaAssistantPlayer(Player):
                 album_name = self.current_media.album or ""
                 song_name = self.current_media.title or ""
                 artist_name = self.current_media.artist or ""
-                if app_running:
+                if app_running and self.flow_mode:
                     await self.roku_input(
                         {
                             "u": "",