diff --git a/homeassistant/components/kodi/__init__.py b/homeassistant/components/kodi/__init__.py index 5ffde76d313..b5c8aed7d32 100644 --- a/homeassistant/components/kodi/__init__.py +++ b/homeassistant/components/kodi/__init__.py @@ -17,11 +17,16 @@ from homeassistant.const import ( Platform, ) from homeassistant.core import HomeAssistant +from homeassistant.helpers import config_validation as cv from homeassistant.helpers.aiohttp_client import async_get_clientsession +from homeassistant.helpers.typing import ConfigType -from .const import CONF_WS_PORT +from .const import CONF_WS_PORT, DOMAIN +from .services import async_setup_services _LOGGER = logging.getLogger(__name__) + +CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) PLATFORMS = [Platform.MEDIA_PLAYER] type KodiConfigEntry = ConfigEntry[KodiRuntimeData] @@ -35,6 +40,12 @@ class KodiRuntimeData: kodi: Kodi +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: KodiConfigEntry) -> bool: """Set up Kodi from a config entry.""" conn = get_kodi_connection( diff --git a/homeassistant/components/kodi/media_player.py b/homeassistant/components/kodi/media_player.py index 1efa6bec296..a6b93436876 100644 --- a/homeassistant/components/kodi/media_player.py +++ b/homeassistant/components/kodi/media_player.py @@ -11,7 +11,6 @@ from typing import Any, Concatenate from jsonrpc_base.jsonrpc import ProtocolError, TransportError from pykodi import CannotConnectError -import voluptuous as vol from homeassistant.components import media_source from homeassistant.components.media_player import ( @@ -31,16 +30,11 @@ from homeassistant.const import ( EVENT_HOMEASSISTANT_STARTED, ) from homeassistant.core import CoreState, HomeAssistant, callback -from homeassistant.helpers import ( - config_validation as cv, - device_registry as dr, - entity_platform, -) +from homeassistant.helpers import device_registry as dr from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.event import async_track_time_interval from homeassistant.helpers.network import is_internal_request -from homeassistant.helpers.typing import VolDictType from homeassistant.util import dt as dt_util from . import KodiConfigEntry @@ -85,42 +79,12 @@ MAP_KODI_MEDIA_TYPES: dict[MediaType | str, str] = { } -SERVICE_ADD_MEDIA = "add_to_playlist" -SERVICE_CALL_METHOD = "call_method" - -ATTR_MEDIA_TYPE = "media_type" -ATTR_MEDIA_NAME = "media_name" -ATTR_MEDIA_ARTIST_NAME = "artist_name" -ATTR_MEDIA_ID = "media_id" -ATTR_METHOD = "method" - - -KODI_ADD_MEDIA_SCHEMA: VolDictType = { - vol.Required(ATTR_MEDIA_TYPE): cv.string, - vol.Optional(ATTR_MEDIA_ID): cv.string, - vol.Optional(ATTR_MEDIA_NAME): cv.string, - vol.Optional(ATTR_MEDIA_ARTIST_NAME): cv.string, -} - -KODI_CALL_METHOD_SCHEMA = cv.make_entity_service_schema( - {vol.Required(ATTR_METHOD): cv.string}, extra=vol.ALLOW_EXTRA -) - - async def async_setup_entry( hass: HomeAssistant, config_entry: KodiConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Kodi media player platform.""" - platform = entity_platform.async_get_current_platform() - platform.async_register_entity_service( - SERVICE_ADD_MEDIA, KODI_ADD_MEDIA_SCHEMA, "async_add_media_to_playlist" - ) - platform.async_register_entity_service( - SERVICE_CALL_METHOD, KODI_CALL_METHOD_SCHEMA, "async_call_method" - ) - data = config_entry.runtime_data name = config_entry.data[CONF_NAME] if (uid := config_entry.unique_id) is None: diff --git a/homeassistant/components/kodi/services.py b/homeassistant/components/kodi/services.py new file mode 100644 index 00000000000..1e6266b3318 --- /dev/null +++ b/homeassistant/components/kodi/services.py @@ -0,0 +1,54 @@ +"""Support for interfacing with the XBMC/Kodi JSON-RPC API.""" + +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 config_validation as cv, service +from homeassistant.helpers.typing import VolDictType + +from .const import DOMAIN + +SERVICE_ADD_MEDIA = "add_to_playlist" +SERVICE_CALL_METHOD = "call_method" + +ATTR_MEDIA_TYPE = "media_type" +ATTR_MEDIA_NAME = "media_name" +ATTR_MEDIA_ARTIST_NAME = "artist_name" +ATTR_MEDIA_ID = "media_id" +ATTR_METHOD = "method" + + +KODI_ADD_MEDIA_SCHEMA: VolDictType = { + vol.Required(ATTR_MEDIA_TYPE): cv.string, + vol.Optional(ATTR_MEDIA_ID): cv.string, + vol.Optional(ATTR_MEDIA_NAME): cv.string, + vol.Optional(ATTR_MEDIA_ARTIST_NAME): cv.string, +} + +KODI_CALL_METHOD_SCHEMA = cv.make_entity_service_schema( + {vol.Required(ATTR_METHOD): cv.string}, extra=vol.ALLOW_EXTRA +) + + +@callback +def async_setup_services(hass: HomeAssistant) -> None: + """Set up services.""" + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_ADD_MEDIA, + entity_domain=MEDIA_PLAYER_DOMAIN, + schema=KODI_ADD_MEDIA_SCHEMA, + func="async_add_media_to_playlist", + ) + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_CALL_METHOD, + entity_domain=MEDIA_PLAYER_DOMAIN, + schema=KODI_CALL_METHOD_SCHEMA, + func="async_call_method", + )