Pass metadata when casting an app (#51148)

* Pass through metadata when casting an app

* Remove passing kwargs to quick_play

Add metadata to the app_data dict.

* Include pass-through of metadata

* Bump pychromecast to 9.2.0

* Add changes to test to verify metadata

* Fix order of imports
This commit is contained in:
blawford 2021-06-14 07:48:32 +01:00 committed by GitHub
parent cc622f46c5
commit 0709aa7c8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 7 deletions

View File

@ -3,7 +3,7 @@
"name": "Google Cast",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/cast",
"requirements": ["pychromecast==9.1.2"],
"requirements": ["pychromecast==9.2.0"],
"after_dependencies": [
"cloud",
"http",

View File

@ -482,10 +482,15 @@ class CastDevice(MediaPlayerEntity):
def play_media(self, media_type, media_id, **kwargs):
"""Play media from a URL."""
extra = kwargs.get(ATTR_MEDIA_EXTRA, {})
metadata = extra.get("metadata")
# We do not want this to be forwarded to a group
if media_type == CAST_DOMAIN:
try:
app_data = json.loads(media_id)
if metadata is not None:
app_data["metadata"] = extra.get("metadata")
except json.JSONDecodeError:
_LOGGER.error("Invalid JSON in media_content_id")
raise

View File

@ -1330,7 +1330,7 @@ pycfdns==1.2.1
pychannels==1.0.0
# homeassistant.components.cast
pychromecast==9.1.2
pychromecast==9.2.0
# homeassistant.components.pocketcasts
pycketcasts==1.0.0

View File

@ -740,7 +740,7 @@ pybotvac==0.0.20
pycfdns==1.2.1
# homeassistant.components.cast
pychromecast==9.1.2
pychromecast==9.2.0
# homeassistant.components.climacell
pyclimacell==0.18.2

View File

@ -10,7 +10,7 @@ import attr
import pychromecast
import pytest
from homeassistant.components import tts
from homeassistant.components import media_player, tts
from homeassistant.components.cast import media_player as cast
from homeassistant.components.cast.media_player import ChromecastInfo
from homeassistant.components.media_player.const import (
@ -27,7 +27,7 @@ from homeassistant.components.media_player.const import (
SUPPORT_VOLUME_SET,
)
from homeassistant.config import async_process_ha_core_config
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
from homeassistant.const import ATTR_ENTITY_ID, EVENT_HOMEASSISTANT_STOP
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.dispatcher import async_dispatcher_connect
@ -702,8 +702,20 @@ async def test_entity_play_media_cast(hass: HomeAssistant, quick_play_mock):
chromecast.start_app.assert_called_once_with("abc123")
# Play_media - cast with app name (quick play)
await common.async_play_media(hass, "cast", '{"app_name": "youtube"}', entity_id)
quick_play_mock.assert_called_once_with(ANY, "youtube", {})
await hass.services.async_call(
media_player.DOMAIN,
media_player.SERVICE_PLAY_MEDIA,
{
ATTR_ENTITY_ID: entity_id,
media_player.ATTR_MEDIA_CONTENT_TYPE: "cast",
media_player.ATTR_MEDIA_CONTENT_ID: '{"app_name":"youtube"}',
media_player.ATTR_MEDIA_EXTRA: {"metadata": {"metadatatype": 3}},
},
blocking=True,
)
quick_play_mock.assert_called_once_with(
ANY, "youtube", {"metadata": {"metadatatype": 3}}
)
async def test_entity_play_media_cast_invalid(hass, caplog, quick_play_mock):