diff --git a/homeassistant/components/radarr/services.py b/homeassistant/components/radarr/services.py index 8d45b6a2dd7..1f1949d765d 100644 --- a/homeassistant/components/radarr/services.py +++ b/homeassistant/components/radarr/services.py @@ -6,11 +6,10 @@ from typing import Any, Final, cast from aiopyarr import exceptions import voluptuous as vol -from homeassistant.config_entries import ConfigEntryState from homeassistant.const import CONF_URL from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback -from homeassistant.exceptions import HomeAssistantError, ServiceValidationError -from homeassistant.helpers import selector +from homeassistant.exceptions import HomeAssistantError +from homeassistant.helpers import selector, service from .const import DOMAIN from .coordinator import RadarrConfigEntry @@ -49,24 +48,6 @@ SERVICE_GET_QUEUE_SCHEMA = SERVICE_BASE_SCHEMA.extend( ) -def _get_config_entry_from_service_data(call: ServiceCall) -> RadarrConfigEntry: - """Return config entry for entry id.""" - config_entry_id: str = call.data[ATTR_ENTRY_ID] - if not (entry := call.hass.config_entries.async_get_entry(config_entry_id)): - raise ServiceValidationError( - translation_domain=DOMAIN, - translation_key="integration_not_found", - translation_placeholders={"target": DOMAIN}, - ) - if entry.state is not ConfigEntryState.LOADED: - raise ServiceValidationError( - translation_domain=DOMAIN, - translation_key="not_loaded", - translation_placeholders={"target": entry.title}, - ) - return cast(RadarrConfigEntry, entry) - - async def _handle_api_errors[_T](func: Callable[[], Awaitable[_T]]) -> _T: """Handle API errors and raise HomeAssistantError with user-friendly messages.""" try: @@ -79,9 +60,11 @@ async def _handle_api_errors[_T](func: Callable[[], Awaitable[_T]]) -> _T: raise HomeAssistantError(f"Radarr API error: {ex}") from ex -async def _async_get_movies(service: ServiceCall) -> dict[str, Any]: +async def _async_get_movies(call: ServiceCall) -> dict[str, Any]: """Get all Radarr movies.""" - entry = _get_config_entry_from_service_data(service) + entry: RadarrConfigEntry = service.async_get_config_entry( + call.hass, DOMAIN, call.data[ATTR_ENTRY_ID] + ) api_client = entry.runtime_data.status.api_client movies_list = await _handle_api_errors(api_client.async_get_movies) @@ -95,10 +78,12 @@ async def _async_get_movies(service: ServiceCall) -> dict[str, Any]: } -async def _async_get_queue(service: ServiceCall) -> dict[str, Any]: +async def _async_get_queue(call: ServiceCall) -> dict[str, Any]: """Get Radarr queue.""" - entry = _get_config_entry_from_service_data(service) - max_items: int = service.data[CONF_MAX_ITEMS] + entry: RadarrConfigEntry = service.async_get_config_entry( + call.hass, DOMAIN, call.data[ATTR_ENTRY_ID] + ) + max_items: int = call.data[CONF_MAX_ITEMS] api_client = entry.runtime_data.status.api_client diff --git a/homeassistant/components/radarr/strings.json b/homeassistant/components/radarr/strings.json index 2b2320e96e0..f759b0dec5e 100644 --- a/homeassistant/components/radarr/strings.json +++ b/homeassistant/components/radarr/strings.json @@ -46,14 +46,6 @@ } } }, - "exceptions": { - "integration_not_found": { - "message": "Config entry for integration \"{target}\" not found." - }, - "not_loaded": { - "message": "Config entry \"{target}\" is not loaded." - } - }, "options": { "step": { "init": { diff --git a/tests/components/radarr/test_services.py b/tests/components/radarr/test_services.py index e7ea6fb4d60..92dbb7916a8 100644 --- a/tests/components/radarr/test_services.py +++ b/tests/components/radarr/test_services.py @@ -137,9 +137,7 @@ async def test_services_invalid_entry( # Set up at least one entry so the service gets registered await setup_integration(hass, aioclient_mock) - with pytest.raises( - ServiceValidationError, match='Config entry for integration "radarr" not found' - ): + with pytest.raises(ServiceValidationError, match="service_config_entry_not_found"): await hass.services.async_call( DOMAIN, service, @@ -165,9 +163,7 @@ async def test_services_entry_not_loaded( # Now create a second entry that isn't loaded unloaded_entry = create_entry(hass) - with pytest.raises( - ServiceValidationError, match='Config entry "Mock Title" is not loaded' - ): + with pytest.raises(ServiceValidationError, match="service_config_entry_not_loaded"): await hass.services.async_call( DOMAIN, service,