From 1421797c50ccfea1bfe540d03f4c42aae664fea9 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Tue, 18 Jan 2022 22:43:22 -0600 Subject: [PATCH] Add camera play stream support to roku (#64153) --- homeassistant/components/roku/media_player.py | 18 +++++++++++++++-- tests/components/roku/test_media_player.py | 20 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index 0cb03869cf8..267e904a980 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -30,6 +30,7 @@ from homeassistant.components.media_player.const import ( SUPPORT_VOLUME_STEP, ) from homeassistant.components.media_player.errors import BrowseError +from homeassistant.components.stream.const import FORMAT_CONTENT_TYPE, HLS_PROVIDER from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_NAME, @@ -79,6 +80,13 @@ ATTRS_TO_LAUNCH_PARAMS = { ATTR_MEDIA_TYPE: "MediaType", } +PLAY_MEDIA_SUPPORTED_TYPES = ( + MEDIA_TYPE_APP, + MEDIA_TYPE_CHANNEL, + MEDIA_TYPE_URL, + FORMAT_CONTENT_TYPE[HLS_PROVIDER], +) + ATTRS_TO_PLAY_VIDEO_PARAMS = { ATTR_NAME: "videoName", ATTR_FORMAT: "videoFormat", @@ -375,9 +383,9 @@ class RokuMediaPlayer(RokuEntity, MediaPlayerEntity): """Tune to channel.""" extra: dict[str, Any] = kwargs.get(ATTR_MEDIA_EXTRA) or {} - if media_type not in (MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, MEDIA_TYPE_URL): + if media_type not in PLAY_MEDIA_SUPPORTED_TYPES: _LOGGER.error( - "Invalid media type %s. Only %s, %s and %s are supported", + "Invalid media type %s. Only %s, %s, %s, and camera HLS streams are supported", media_type, MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, @@ -402,6 +410,12 @@ class RokuMediaPlayer(RokuEntity, MediaPlayerEntity): if attr in extra } + await self.coordinator.roku.play_video(media_id, params) + elif media_type == FORMAT_CONTENT_TYPE[HLS_PROVIDER]: + params = { + "MediaType": "hls", + } + await self.coordinator.roku.play_video(media_id, params) await self.coordinator.async_request_refresh() diff --git a/tests/components/roku/test_media_player.py b/tests/components/roku/test_media_player.py index c71525fcd73..5f3e5ebe956 100644 --- a/tests/components/roku/test_media_player.py +++ b/tests/components/roku/test_media_player.py @@ -48,6 +48,7 @@ from homeassistant.components.roku.const import ( DOMAIN, SERVICE_SEARCH, ) +from homeassistant.components.stream.const import FORMAT_CONTENT_TYPE, HLS_PROVIDER from homeassistant.components.websocket_api.const import TYPE_RESULT from homeassistant.config import async_process_ha_core_config from homeassistant.const import ( @@ -509,6 +510,25 @@ async def test_services( }, ) + with patch("homeassistant.components.roku.coordinator.Roku.play_video") as pv_mock: + await hass.services.async_call( + MP_DOMAIN, + SERVICE_PLAY_MEDIA, + { + ATTR_ENTITY_ID: MAIN_ENTITY_ID, + ATTR_MEDIA_CONTENT_TYPE: FORMAT_CONTENT_TYPE[HLS_PROVIDER], + ATTR_MEDIA_CONTENT_ID: "https://awesome.tld/api/hls/api_token/master_playlist.m3u8", + }, + blocking=True, + ) + + pv_mock.assert_called_once_with( + "https://awesome.tld/api/hls/api_token/master_playlist.m3u8", + { + "MediaType": "hls", + }, + ) + with patch("homeassistant.components.roku.coordinator.Roku.remote") as remote_mock: await hass.services.async_call( MP_DOMAIN,