From de6fdb09f493614a8b4ae245eeb1354cccc3a66b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 24 Apr 2019 22:37:29 -0700 Subject: [PATCH] Add media player external url (#23337) * Add media player external url * Lint * Simplify * Update __init__.py * Update __init__.py * Use 302 --- homeassistant/components/cast/media_player.py | 5 +++ .../components/media_player/__init__.py | 16 ++++++++ tests/components/media_player/test_init.py | 41 ++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index 4b2972b0c00..0a1406adcee 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -1046,6 +1046,11 @@ class CastDevice(MediaPlayerDevice): 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 7dcfdac5217..478f59d2817 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -324,6 +324,11 @@ class MediaPlayerDevice(Entity): """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 @@ class MediaPlayerDevice(Entity): 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 @@ class MediaPlayerImageView(HomeAssistantView): 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 808c6e4f50f..23deffa972a 100644 --- a/tests/components/media_player/test_init.py +++ b/tests/components/media_player/test_init.py @@ -8,8 +8,8 @@ from homeassistant.components.websocket_api.const import TYPE_RESULT 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'