Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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=301, headers={

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do the parameters used in /api/media_player_proxy (token or cache) change whenever the media changes? If not, we should be using a 302 instead so browsers don't cache the redirect and pin to the image.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're so right.

'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'