From 30774d40409a3a0538fbeca6a83161320cbc8702 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 20:23:06 -0600 Subject: [PATCH 01/14] add play video url support to roku --- homeassistant/components/roku/media_player.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index 10483d980f9a6d..e6cde1555e2a57 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -16,6 +16,7 @@ ATTR_MEDIA_EXTRA, MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, + MEDIA_TYPE_URL, SUPPORT_BROWSE_MEDIA, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, @@ -367,12 +368,13 @@ async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> No """Tune to channel.""" extra: dict[str, Any] = kwargs.get(ATTR_MEDIA_EXTRA) or {} - if media_type not in (MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL): + if media_type not in (MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, MEDIA_TYPE_URL): _LOGGER.error( "Invalid media type %s. Only %s and %s are supported", media_type, MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, + MEDIA_TYPE_URL, ) return @@ -384,6 +386,8 @@ async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> No } await self.coordinator.roku.launch(media_id, params) + elif media_type == MEDIA_TYPE_URL: + await self.coordinator.roku.play_video(media_id) elif media_type == MEDIA_TYPE_CHANNEL: await self.coordinator.roku.tune(media_id) From ea4071541149c29b50f4b60d00093b758df33b37 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 20:26:26 -0600 Subject: [PATCH 02/14] Update media_player.py --- homeassistant/components/roku/media_player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index e6cde1555e2a57..0c0a36fd7ea169 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -370,7 +370,7 @@ async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> No if media_type not in (MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, MEDIA_TYPE_URL): _LOGGER.error( - "Invalid media type %s. Only %s and %s are supported", + "Invalid media type %s. Only %s, %s and %s are supported", media_type, MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, From 37fbd1bb754cf896c0029bcd7b894e6eec80b6f6 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 20:37:46 -0600 Subject: [PATCH 03/14] Update test_media_player.py --- tests/components/roku/test_media_player.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/components/roku/test_media_player.py b/tests/components/roku/test_media_player.py index d0e0388dde11c1..bcbf50df1af955 100644 --- a/tests/components/roku/test_media_player.py +++ b/tests/components/roku/test_media_player.py @@ -481,6 +481,20 @@ 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: MEDIA_TYPE_VIDEO, + ATTR_MEDIA_CONTENT_ID: "https://awesome.tld/media.mp4", + }, + blocking=True, + ) + + pv_mock.assert_called_once_with("https://awesome.tld/media.mp4") + with patch("homeassistant.components.roku.coordinator.Roku.remote") as remote_mock: await hass.services.async_call( MP_DOMAIN, From 0fc4bbd7dca37fe57d309eee92f9258034f34658 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 20:41:43 -0600 Subject: [PATCH 04/14] Update test_media_player.py --- tests/components/roku/test_media_player.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/components/roku/test_media_player.py b/tests/components/roku/test_media_player.py index bcbf50df1af955..ce4135f4459216 100644 --- a/tests/components/roku/test_media_player.py +++ b/tests/components/roku/test_media_player.py @@ -25,6 +25,7 @@ MEDIA_TYPE_APPS, MEDIA_TYPE_CHANNEL, MEDIA_TYPE_CHANNELS, + MEDIA_TYPE_URL, SERVICE_PLAY_MEDIA, SERVICE_SELECT_SOURCE, SUPPORT_BROWSE_MEDIA, @@ -487,7 +488,7 @@ async def test_services( SERVICE_PLAY_MEDIA, { ATTR_ENTITY_ID: MAIN_ENTITY_ID, - ATTR_MEDIA_CONTENT_TYPE: MEDIA_TYPE_VIDEO, + ATTR_MEDIA_CONTENT_TYPE: MEDIA_TYPE_URL, ATTR_MEDIA_CONTENT_ID: "https://awesome.tld/media.mp4", }, blocking=True, From aa2c8948394cd369b25354f4308b36f2e3ac59ef Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 20:43:52 -0600 Subject: [PATCH 05/14] Update media_player.py --- homeassistant/components/roku/media_player.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index 0c0a36fd7ea169..ce6b044b3458d7 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -386,10 +386,10 @@ async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> No } await self.coordinator.roku.launch(media_id, params) - elif media_type == MEDIA_TYPE_URL: - await self.coordinator.roku.play_video(media_id) elif media_type == MEDIA_TYPE_CHANNEL: await self.coordinator.roku.tune(media_id) + elif media_type == MEDIA_TYPE_URL: + await self.coordinator.roku.play_video(media_id) await self.coordinator.async_request_refresh() From d177ca852acc26f77bda94a7196b76e74c271f62 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 20:52:50 -0600 Subject: [PATCH 06/14] Update media_player.py --- homeassistant/components/roku/media_player.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index ce6b044b3458d7..3cd6da6c346a4e 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -14,6 +14,7 @@ ) from homeassistant.components.media_player.const import ( ATTR_MEDIA_EXTRA, + ATTR_TITLE, MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, MEDIA_TYPE_URL, @@ -77,6 +78,10 @@ ATTR_MEDIA_TYPE: "MediaType", } +ATTRS_TO_PLAY_VIDEO_PARAMS = { + ATTR_TITLE: "videoName", +} + SEARCH_SCHEMA = {vol.Required(ATTR_KEYWORD): str} @@ -389,7 +394,12 @@ async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> No elif media_type == MEDIA_TYPE_CHANNEL: await self.coordinator.roku.tune(media_id) elif media_type == MEDIA_TYPE_URL: - await self.coordinator.roku.play_video(media_id) + params = { + param: extra[attr] + for (attr, param) in ATTRS_TO_PLAY_VIDEO_PARAMS.items() + if attr in extra + } + await self.coordinator.roku.play_video(media_id, params) await self.coordinator.async_request_refresh() From a67f3e8adad35796c28eeb3d31c2674ff1323b12 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 20:57:26 -0600 Subject: [PATCH 07/14] Update media_player.py --- homeassistant/components/roku/media_player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index 3cd6da6c346a4e..e3bc88c6c66d81 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -14,7 +14,6 @@ ) from homeassistant.components.media_player.const import ( ATTR_MEDIA_EXTRA, - ATTR_TITLE, MEDIA_TYPE_APP, MEDIA_TYPE_CHANNEL, MEDIA_TYPE_URL, @@ -51,6 +50,7 @@ ATTR_CONTENT_ID, ATTR_KEYWORD, ATTR_MEDIA_TYPE, + ATTR_TITLE, DOMAIN, SERVICE_SEARCH, ) From 741a349587dad75c45a97bf6a5760881855fd75d Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 21:00:05 -0600 Subject: [PATCH 08/14] Update const.py --- homeassistant/components/roku/const.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/roku/const.py b/homeassistant/components/roku/const.py index eb2d5040b50c6a..e8f181665e5cc9 100644 --- a/homeassistant/components/roku/const.py +++ b/homeassistant/components/roku/const.py @@ -5,6 +5,7 @@ ATTR_CONTENT_ID = "content_id" ATTR_KEYWORD = "keyword" ATTR_MEDIA_TYPE = "media_type" +ATTR_FORMAT = "format" # Default Values DEFAULT_PORT = 8060 From 302aa7706dc518a910633f7d649ae98dcc89119d Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 21:02:13 -0600 Subject: [PATCH 09/14] Update media_player.py --- homeassistant/components/roku/media_player.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index e3bc88c6c66d81..328419ca30ebd2 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -32,6 +32,7 @@ from homeassistant.components.media_player.errors import BrowseError from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( + ATTR_NAME, STATE_HOME, STATE_IDLE, STATE_ON, @@ -47,10 +48,10 @@ from . import roku_exception_handler from .browse_media import build_item_response, library_payload from .const import ( + ATTR_FORMAT, ATTR_CONTENT_ID, ATTR_KEYWORD, ATTR_MEDIA_TYPE, - ATTR_TITLE, DOMAIN, SERVICE_SEARCH, ) @@ -79,7 +80,8 @@ } ATTRS_TO_PLAY_VIDEO_PARAMS = { - ATTR_TITLE: "videoName", + ATTR_NAME: "videoName", + ATTR_FORMAT: "videoFormat", } SEARCH_SCHEMA = {vol.Required(ATTR_KEYWORD): str} From 294a8a4bbd02a9121438bbaa9bb8d0afa107fecc Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 21:02:42 -0600 Subject: [PATCH 10/14] Update const.py --- homeassistant/components/roku/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/roku/const.py b/homeassistant/components/roku/const.py index e8f181665e5cc9..e399f6e0558be9 100644 --- a/homeassistant/components/roku/const.py +++ b/homeassistant/components/roku/const.py @@ -3,9 +3,9 @@ # Attributes ATTR_CONTENT_ID = "content_id" +ATTR_FORMAT = "format" ATTR_KEYWORD = "keyword" ATTR_MEDIA_TYPE = "media_type" -ATTR_FORMAT = "format" # Default Values DEFAULT_PORT = 8060 From 4c14be15eb24d5799a0947db9d3e864c31d65c57 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 21:08:38 -0600 Subject: [PATCH 11/14] Update test_media_player.py --- tests/components/roku/test_media_player.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/components/roku/test_media_player.py b/tests/components/roku/test_media_player.py index ce4135f4459216..4da59050b0854b 100644 --- a/tests/components/roku/test_media_player.py +++ b/tests/components/roku/test_media_player.py @@ -42,6 +42,7 @@ ) from homeassistant.components.roku.const import ( ATTR_CONTENT_ID, + ATTR_FORMAT, ATTR_KEYWORD, ATTR_MEDIA_TYPE, DOMAIN, @@ -51,6 +52,7 @@ from homeassistant.config import async_process_ha_core_config from homeassistant.const import ( ATTR_ENTITY_ID, + ATTR_NAME, SERVICE_MEDIA_NEXT_TRACK, SERVICE_MEDIA_PAUSE, SERVICE_MEDIA_PLAY, @@ -490,11 +492,21 @@ async def test_services( ATTR_ENTITY_ID: MAIN_ENTITY_ID, ATTR_MEDIA_CONTENT_TYPE: MEDIA_TYPE_URL, ATTR_MEDIA_CONTENT_ID: "https://awesome.tld/media.mp4", + ATTR_MEDIA_EXTRA: { + ATTR_NAME: "Sent from HA", + ATTR_FORMAT: "mp4", + }, }, blocking=True, ) - pv_mock.assert_called_once_with("https://awesome.tld/media.mp4") + pv_mock.assert_called_once_with( + "https://awesome.tld/media.mp4", + { + "videoName": "Sent from HA", + "videoFormat": "mp4", + }, + ) with patch("homeassistant.components.roku.coordinator.Roku.remote") as remote_mock: await hass.services.async_call( From 2f8aea6922ba3f0acc5d54f191943a641eb73597 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 21:16:42 -0600 Subject: [PATCH 12/14] Update media_player.py --- homeassistant/components/roku/media_player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index 328419ca30ebd2..f68c2a77b7052b 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -48,8 +48,8 @@ from . import roku_exception_handler from .browse_media import build_item_response, library_payload from .const import ( - ATTR_FORMAT, ATTR_CONTENT_ID, + ATTR_FORMAT, ATTR_KEYWORD, ATTR_MEDIA_TYPE, DOMAIN, From 8cd58f08d99d4f253d71b43f0d949fe8a3039dc7 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Wed, 12 Jan 2022 21:23:51 -0600 Subject: [PATCH 13/14] Update media_player.py --- homeassistant/components/roku/media_player.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index f68c2a77b7052b..db061516ae4dd0 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -401,6 +401,7 @@ async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> No for (attr, param) in ATTRS_TO_PLAY_VIDEO_PARAMS.items() if attr in extra } + await self.coordinator.roku.play_video(media_id, params) await self.coordinator.async_request_refresh() From 8c019617085ecb795ba542c580aae4aeb67f708e Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Sat, 15 Jan 2022 01:44:55 -0600 Subject: [PATCH 14/14] Update media_player.py --- homeassistant/components/roku/media_player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index db061516ae4dd0..859ae42e06f605 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -388,7 +388,7 @@ async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> No if media_type == MEDIA_TYPE_APP: params = { param: extra[attr] - for (attr, param) in ATTRS_TO_LAUNCH_PARAMS.items() + for attr, param in ATTRS_TO_LAUNCH_PARAMS.items() if attr in extra }