From 68d75a879b2a0e8a483cd89197e9a79ba7e8c5b4 Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Mon, 28 Sep 2020 07:04:08 -0700 Subject: [PATCH] Fix Android TV 'async_get_media_image' (#40672) --- .../components/androidtv/media_player.py | 11 ++++++++++- tests/components/androidtv/test_media_player.py | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/androidtv/media_player.py b/homeassistant/components/androidtv/media_player.py index 1ea20dbeca5..e64581f9a05 100644 --- a/homeassistant/components/androidtv/media_player.py +++ b/homeassistant/components/androidtv/media_player.py @@ -502,14 +502,23 @@ class ADBDevice(MediaPlayerEntity): return self._unique_id @adb_decorator() + async def _adb_screencap(self): + """Take a screen capture from the device.""" + return await self.aftv.adb_screencap() + async def async_get_media_image(self): """Fetch current playing image.""" if not self._screencap or self.state in [STATE_OFF, None] or not self.available: return None, None - media_data = await self.aftv.adb_screencap() + media_data = await self._adb_screencap() if media_data: return media_data, "image/png" + + # If an exception occurred and the device is no longer available, write the state + if not self.available: + self.async_write_ha_state() + return None, None @adb_decorator() diff --git a/tests/components/androidtv/test_media_player.py b/tests/components/androidtv/test_media_player.py index 456a9313091..c497a9daa48 100644 --- a/tests/components/androidtv/test_media_player.py +++ b/tests/components/androidtv/test_media_player.py @@ -1064,6 +1064,21 @@ async def test_get_image(hass, hass_ws_client): assert msg["result"]["content_type"] == "image/png" assert msg["result"]["content"] == base64.b64encode(b"image").decode("utf-8") + with patch( + "androidtv.basetv.basetv_async.BaseTVAsync.adb_screencap", + side_effect=RuntimeError, + ): + await client.send_json( + {"id": 6, "type": "media_player_thumbnail", "entity_id": entity_id} + ) + + msg = await client.receive_json() + + # The device is unavailable, but getting the media image did not cause an exception + state = hass.states.get(entity_id) + assert state is not None + assert state.state == STATE_UNAVAILABLE + async def _test_service( hass,