From 59daab94346bc628f2edee374bb29ae9dc6d3c8f Mon Sep 17 00:00:00 2001 From: Jason Hunter Date: Mon, 28 Sep 2020 08:24:30 -0400 Subject: [PATCH] Fix camera play stream (#40641) Co-authored-by: Justin Wong <46082645+uvjustin@users.noreply.github.com> --- homeassistant/components/camera/__init__.py | 44 ++++++++++++++++--- homeassistant/components/cast/manifest.json | 2 +- homeassistant/components/cast/media_player.py | 5 ++- .../components/media_player/__init__.py | 2 + .../components/media_player/const.py | 1 + requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 7 files changed, 49 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index f6b909231ca..f4950751fc9 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -19,6 +19,7 @@ from homeassistant.components.http import KEY_AUTHENTICATED, HomeAssistantView from homeassistant.components.media_player.const import ( ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_CONTENT_TYPE, + ATTR_MEDIA_EXTRA, DOMAIN as DOMAIN_MP, SERVICE_PLAY_MEDIA, ) @@ -46,7 +47,7 @@ from homeassistant.helpers.config_validation import ( # noqa: F401 PLATFORM_SCHEMA, PLATFORM_SCHEMA_BASE, ) -from homeassistant.helpers.entity import Entity +from homeassistant.helpers.entity import Entity, entity_sources from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.network import get_url from homeassistant.loader import bind_hass @@ -695,14 +696,47 @@ async def async_handle_play_stream_service(camera, service_call): options=camera.stream_options, ) data = { - ATTR_ENTITY_ID: entity_ids, ATTR_MEDIA_CONTENT_ID: f"{get_url(hass)}{url}", ATTR_MEDIA_CONTENT_TYPE: FORMAT_CONTENT_TYPE[fmt], } - await hass.services.async_call( - DOMAIN_MP, SERVICE_PLAY_MEDIA, data, blocking=True, context=service_call.context - ) + # It is required to send a different payload for cast media players + cast_entity_ids = [ + entity + for entity, source in entity_sources(hass).items() + if entity in entity_ids and source["domain"] == "cast" + ] + other_entity_ids = list(set(entity_ids) - set(cast_entity_ids)) + + if cast_entity_ids: + await hass.services.async_call( + DOMAIN_MP, + SERVICE_PLAY_MEDIA, + { + ATTR_ENTITY_ID: cast_entity_ids, + **data, + ATTR_MEDIA_EXTRA: { + "stream_type": "LIVE", + "media_info": { + "hlsVideoSegmentFormat": "fmp4", + }, + }, + }, + blocking=True, + context=service_call.context, + ) + + if other_entity_ids: + await hass.services.async_call( + DOMAIN_MP, + SERVICE_PLAY_MEDIA, + { + ATTR_ENTITY_ID: other_entity_ids, + **data, + }, + blocking=True, + context=service_call.context, + ) async def async_handle_record_service(camera, call): diff --git a/homeassistant/components/cast/manifest.json b/homeassistant/components/cast/manifest.json index 49d26431f5b..03412d3b6df 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==7.2.1"], + "requirements": ["pychromecast==7.5.0"], "after_dependencies": ["cloud", "http", "media_source", "tts", "zeroconf"], "zeroconf": ["_googlecast._tcp.local."], "codeowners": ["@emontnemery"] diff --git a/homeassistant/components/cast/media_player.py b/homeassistant/components/cast/media_player.py index f948c51655b..788da18e8bd 100644 --- a/homeassistant/components/cast/media_player.py +++ b/homeassistant/components/cast/media_player.py @@ -21,6 +21,7 @@ from homeassistant.components import media_source, zeroconf from homeassistant.components.http.auth import async_sign_path from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity from homeassistant.components.media_player.const import ( + ATTR_MEDIA_EXTRA, MEDIA_TYPE_MOVIE, MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, @@ -574,7 +575,9 @@ class CastDevice(MediaPlayerEntity): except NotImplementedError: _LOGGER.error("App %s not supported", app_name) else: - self._chromecast.media_controller.play_media(media_id, media_type) + self._chromecast.media_controller.play_media( + media_id, media_type, **kwargs.get(ATTR_MEDIA_EXTRA, {}) + ) # ========== Properties ========== @property diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 348bc521a5a..41c1a4e8690 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -71,6 +71,7 @@ from .const import ( ATTR_MEDIA_DURATION, ATTR_MEDIA_ENQUEUE, ATTR_MEDIA_EPISODE, + ATTR_MEDIA_EXTRA, ATTR_MEDIA_PLAYLIST, ATTR_MEDIA_POSITION, ATTR_MEDIA_POSITION_UPDATED_AT, @@ -139,6 +140,7 @@ MEDIA_PLAYER_PLAY_MEDIA_SCHEMA = { vol.Required(ATTR_MEDIA_CONTENT_TYPE): cv.string, vol.Required(ATTR_MEDIA_CONTENT_ID): cv.string, vol.Optional(ATTR_MEDIA_ENQUEUE): cv.boolean, + vol.Optional(ATTR_MEDIA_EXTRA, default={}): dict, } ATTR_TO_PROPERTY = [ diff --git a/homeassistant/components/media_player/const.py b/homeassistant/components/media_player/const.py index 0035fc9f4d2..3db31006341 100644 --- a/homeassistant/components/media_player/const.py +++ b/homeassistant/components/media_player/const.py @@ -12,6 +12,7 @@ ATTR_MEDIA_CONTENT_ID = "media_content_id" ATTR_MEDIA_CONTENT_TYPE = "media_content_type" ATTR_MEDIA_DURATION = "media_duration" ATTR_MEDIA_ENQUEUE = "enqueue" +ATTR_MEDIA_EXTRA = "extra" ATTR_MEDIA_EPISODE = "media_episode" ATTR_MEDIA_PLAYLIST = "media_playlist" ATTR_MEDIA_POSITION = "media_position" diff --git a/requirements_all.txt b/requirements_all.txt index 6d6a1f2371b..2606c5da079 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1265,7 +1265,7 @@ pycfdns==0.0.1 pychannels==1.0.0 # homeassistant.components.cast -pychromecast==7.2.1 +pychromecast==7.5.0 # homeassistant.components.cmus pycmus==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 1469501fd42..56341864a6a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -613,7 +613,7 @@ pyblackbird==0.5 pybotvac==0.0.17 # homeassistant.components.cast -pychromecast==7.2.1 +pychromecast==7.5.0 # homeassistant.components.coolmaster pycoolmasternet-async==0.1.2