Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions homeassistant/components/cast/media_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down
16 changes: 16 additions & 0 deletions homeassistant/components/media_player/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
41 changes: 39 additions & 2 deletions tests/components/media_player/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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'