From b43abf83b8e24dbc07c605928f751c5b3be65612 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 3 Feb 2026 11:13:19 +0100 Subject: [PATCH] Move roku service registration (#162128) --- homeassistant/components/roku/__init__.py | 11 +++++++ homeassistant/components/roku/const.py | 3 -- homeassistant/components/roku/media_player.py | 15 --------- homeassistant/components/roku/services.py | 31 +++++++++++++++++++ tests/components/roku/test_media_player.py | 3 +- 5 files changed, 43 insertions(+), 20 deletions(-) create mode 100644 homeassistant/components/roku/services.py diff --git a/homeassistant/components/roku/__init__.py b/homeassistant/components/roku/__init__.py index 46149264e55..06223acf450 100644 --- a/homeassistant/components/roku/__init__.py +++ b/homeassistant/components/roku/__init__.py @@ -4,9 +4,14 @@ from __future__ import annotations from homeassistant.const import Platform from homeassistant.core import HomeAssistant +from homeassistant.helpers import config_validation as cv +from homeassistant.helpers.typing import ConfigType +from .const import DOMAIN from .coordinator import RokuConfigEntry, RokuDataUpdateCoordinator +from .services import async_setup_services +CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) PLATFORMS = [ Platform.BINARY_SENSOR, Platform.MEDIA_PLAYER, @@ -16,6 +21,12 @@ PLATFORMS = [ ] +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: + """Set up the component.""" + async_setup_services(hass) + return True + + async def async_setup_entry(hass: HomeAssistant, entry: RokuConfigEntry) -> bool: """Set up Roku from a config entry.""" coordinator = RokuDataUpdateCoordinator(hass, entry) diff --git a/homeassistant/components/roku/const.py b/homeassistant/components/roku/const.py index f0c7d4e2537..090810ff666 100644 --- a/homeassistant/components/roku/const.py +++ b/homeassistant/components/roku/const.py @@ -6,15 +6,12 @@ DOMAIN = "roku" ATTR_ARTIST_NAME = "artist_name" ATTR_CONTENT_ID = "content_id" ATTR_FORMAT = "format" -ATTR_KEYWORD = "keyword" ATTR_MEDIA_TYPE = "media_type" ATTR_THUMBNAIL = "thumbnail" # Default Values DEFAULT_PORT = 8060 -# Services -SERVICE_SEARCH = "search" # Config CONF_PLAY_MEDIA_APP_ID = "play_media_app_id" diff --git a/homeassistant/components/roku/media_player.py b/homeassistant/components/roku/media_player.py index 7f815c4e458..fe74d69c90d 100644 --- a/homeassistant/components/roku/media_player.py +++ b/homeassistant/components/roku/media_player.py @@ -8,7 +8,6 @@ import mimetypes from typing import Any from rokuecp.helpers import guess_stream_format -import voluptuous as vol import yarl from homeassistant.components import media_source @@ -25,19 +24,15 @@ from homeassistant.components.media_player import ( from homeassistant.components.stream import FORMAT_CONTENT_TYPE, HLS_PROVIDER from homeassistant.const import ATTR_NAME from homeassistant.core import HomeAssistant -from homeassistant.helpers import entity_platform from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from homeassistant.helpers.typing import VolDictType from .browse_media import async_browse_media from .const import ( ATTR_ARTIST_NAME, ATTR_CONTENT_ID, ATTR_FORMAT, - ATTR_KEYWORD, ATTR_MEDIA_TYPE, ATTR_THUMBNAIL, - SERVICE_SEARCH, ) from .coordinator import RokuConfigEntry, RokuDataUpdateCoordinator from .entity import RokuEntity @@ -76,8 +71,6 @@ ATTRS_TO_PLAY_ON_ROKU_AUDIO_PARAMS = { ATTR_THUMBNAIL: "albumArtUrl", } -SEARCH_SCHEMA: VolDictType = {vol.Required(ATTR_KEYWORD): str} - PARALLEL_UPDATES = 1 @@ -96,14 +89,6 @@ async def async_setup_entry( True, ) - platform = entity_platform.async_get_current_platform() - - platform.async_register_entity_service( - SERVICE_SEARCH, - SEARCH_SCHEMA, - "search", - ) - class RokuMediaPlayer(RokuEntity, MediaPlayerEntity): """Representation of a Roku media player on the network.""" diff --git a/homeassistant/components/roku/services.py b/homeassistant/components/roku/services.py new file mode 100644 index 00000000000..83ec9c0cbfb --- /dev/null +++ b/homeassistant/components/roku/services.py @@ -0,0 +1,31 @@ +"""Support for the Roku media player.""" + +from __future__ import annotations + +import voluptuous as vol + +from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN +from homeassistant.core import HomeAssistant, callback +from homeassistant.helpers import service +from homeassistant.helpers.typing import VolDictType + +from .const import DOMAIN + +ATTR_KEYWORD = "keyword" + +SERVICE_SEARCH = "search" + +SEARCH_SCHEMA: VolDictType = {vol.Required(ATTR_KEYWORD): str} + + +@callback +def async_setup_services(hass: HomeAssistant) -> None: + """Set up services.""" + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_SEARCH, + entity_domain=MEDIA_PLAYER_DOMAIN, + schema=SEARCH_SCHEMA, + func="search", + ) diff --git a/tests/components/roku/test_media_player.py b/tests/components/roku/test_media_player.py index 2607c79086a..9f92e3bf042 100644 --- a/tests/components/roku/test_media_player.py +++ b/tests/components/roku/test_media_player.py @@ -30,12 +30,11 @@ from homeassistant.components.media_player import ( from homeassistant.components.roku.const import ( ATTR_CONTENT_ID, ATTR_FORMAT, - ATTR_KEYWORD, ATTR_MEDIA_TYPE, DEFAULT_PLAY_MEDIA_APP_ID, DOMAIN, - SERVICE_SEARCH, ) +from homeassistant.components.roku.services import ATTR_KEYWORD, SERVICE_SEARCH from homeassistant.components.stream import FORMAT_CONTENT_TYPE, HLS_PROVIDER from homeassistant.components.websocket_api import TYPE_RESULT from homeassistant.const import (