From 0709aa7c8c361843d48d3f9170f76ff532d62c88 Mon Sep 17 00:00:00 2001 From: blawford Date: Mon, 14 Jun 2021 07:48:32 +0100 Subject: [PATCH] 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 --- homeassistant/components/cast/manifest.json | 2 +- homeassistant/components/cast/media_player.py | 5 +++++ requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/cast/test_media_player.py | 20 +++++++++++++++---- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/cast/manifest.json b/homeassistant/components/cast/manifest.json index c104ff7a12e..78f7bcf485c 100644 --- a/homeassistant/components/cast/manifest.json +++ b/homeassistant/components/cast/manifest.json @@ -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", diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index 969e690fcc2..07e97dd1a7e 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -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 diff --git a/requirements_all.txt b/requirements_all.txt index 11896467ab0..cec3e65f1f5 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 56d32dfdbde..adf047b3a4a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -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 diff --git a/tests/components/cast/test_media_player.py b/tests/components/cast/test_media_player.py index 959d53184a4..3bb2b895c1a 100644 --- a/tests/components/cast/test_media_player.py +++ b/tests/components/cast/test_media_player.py @@ -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):