diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index 4b2972b0c002eb..0a1406adceec4a 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -1046,6 +1046,11 @@ def media_image_url(self): return images[0].url if images and images[0].url else None + @property + def media_image_remotely_accessible(self) -> bool: + """If the image url is remotely accessible.""" + return True + @property def media_title(self): """Title of current playing media.""" diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 7dcfdac52179f8..478f59d2817ae8 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -324,6 +324,11 @@ def media_image_url(self): """Image url of current playing media.""" return None + @property + def media_image_remotely_accessible(self) -> bool: + """If the image url is remotely accessible.""" + return False + @property def media_image_hash(self): """Hash value for media image.""" @@ -722,6 +727,9 @@ def entity_picture(self): if self.state == STATE_OFF: return None + if self.media_image_remotely_accessible: + return self.media_image_url + image_hash = self.media_image_hash if image_hash is None: @@ -808,6 +816,14 @@ async def get(self, request, entity_id): if not authenticated: return web.Response(status=401) + if player.media_image_remotely_accessible: + url = player.media_image_url + if url is not None: + return web.Response(status=302, headers={ + 'location': url + }) + return web.Response(status=500) + data, content_type = await player.async_get_media_image() if data is None: diff --git a/tests/components/media_player/test_init.py b/tests/components/media_player/test_init.py index 808c6e4f50fa77..23deffa972a2ed 100644 --- a/tests/components/media_player/test_init.py +++ b/tests/components/media_player/test_init.py @@ -8,8 +8,8 @@ from tests.common import mock_coro -async def test_get_panels(hass, hass_ws_client): - """Test get_panels command.""" +async def test_get_image(hass, hass_ws_client): + """Test get image via WS command.""" await async_setup_component(hass, 'media_player', { 'media_player': { 'platform': 'demo' @@ -35,3 +35,40 @@ async def test_get_panels(hass, hass_ws_client): assert msg['result']['content_type'] == 'image/jpeg' assert msg['result']['content'] == \ base64.b64encode(b'image').decode('utf-8') + + +async def test_get_image_http(hass, hass_client): + """Test get image via http command.""" + await async_setup_component(hass, 'media_player', { + 'media_player': { + 'platform': 'demo' + } + }) + + client = await hass_client() + + with patch('homeassistant.components.media_player.MediaPlayerDevice.' + 'async_get_media_image', return_value=mock_coro( + (b'image', 'image/jpeg'))): + resp = await client.get('/api/media_player_proxy/media_player.bedroom') + content = await resp.read() + + assert content == b'image' + + +async def test_get_image_http_url(hass, hass_client): + """Test get image url via http command.""" + await async_setup_component(hass, 'media_player', { + 'media_player': { + 'platform': 'demo' + } + }) + + client = await hass_client() + + with patch('homeassistant.components.media_player.MediaPlayerDevice.' + 'media_image_remotely_accessible', return_value=True): + resp = await client.get('/api/media_player_proxy/media_player.bedroom', + allow_redirects=False) + assert resp.headers['Location'] == \ + 'https://img.youtube.com/vi/kxopViU98Xo/hqdefault.jpg'