From 9a0fed89bd9635b387e56adc289754f8d205f2b9 Mon Sep 17 00:00:00 2001 From: peteS-UK <64092177+peteS-UK@users.noreply.github.com> Date: Thu, 15 May 2025 00:39:00 +0100 Subject: [PATCH] Translate raised exceptions for Squeezebox (#144842) * initial * tweak * review updates --- .../components/squeezebox/browse_media.py | 28 ++++++++++++++--- .../components/squeezebox/coordinator.py | 6 +++- .../components/squeezebox/media_player.py | 30 +++++++++++++++---- .../components/squeezebox/strings.json | 29 ++++++++++++++++++ homeassistant/components/squeezebox/update.py | 4 ++- 5 files changed, 86 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/squeezebox/browse_media.py b/homeassistant/components/squeezebox/browse_media.py index 3f4af99fffd..6e1ec8b37c4 100644 --- a/homeassistant/components/squeezebox/browse_media.py +++ b/homeassistant/components/squeezebox/browse_media.py @@ -19,7 +19,7 @@ from homeassistant.components.media_player import ( from homeassistant.core import HomeAssistant from homeassistant.helpers.network import is_internal_request -from .const import UNPLAYABLE_TYPES +from .const import DOMAIN, UNPLAYABLE_TYPES LIBRARY = [ "favorites", @@ -315,7 +315,14 @@ async def build_item_response( children.append(child_media) if children is None: - raise BrowseError(f"Media not found: {search_type} / {search_id}") + raise BrowseError( + translation_domain=DOMAIN, + translation_key="browse_media_not_found", + translation_placeholders={ + "type": str(search_type), + "id": str(search_id), + }, + ) assert media_class["item"] is not None if not search_id: @@ -398,7 +405,13 @@ async def generate_playlist( media_id = payload["search_id"] if media_type not in browse_media.squeezebox_id_by_type: - raise BrowseError(f"Media type not supported: {media_type}") + raise BrowseError( + translation_domain=DOMAIN, + translation_key="browse_media_type_not_supported", + translation_placeholders={ + "media_type": str(media_type), + }, + ) browse_id = (browse_media.squeezebox_id_by_type[media_type], media_id) if media_type.startswith("app-"): @@ -412,4 +425,11 @@ async def generate_playlist( if result and "items" in result: items: list = result["items"] return items - raise BrowseError(f"Media not found: {media_type} / {media_id}") + raise BrowseError( + translation_domain=DOMAIN, + translation_key="browse_media_not_found", + translation_placeholders={ + "type": str(media_type), + "id": str(media_id), + }, + ) diff --git a/homeassistant/components/squeezebox/coordinator.py b/homeassistant/components/squeezebox/coordinator.py index e5d78024ef0..9c7d00eae58 100644 --- a/homeassistant/components/squeezebox/coordinator.py +++ b/homeassistant/components/squeezebox/coordinator.py @@ -18,6 +18,7 @@ if TYPE_CHECKING: from . import SqueezeboxConfigEntry from .const import ( + DOMAIN, PLAYER_UPDATE_INTERVAL, SENSOR_UPDATE_INTERVAL, SIGNAL_PLAYER_REDISCOVERED, @@ -65,7 +66,10 @@ class LMSStatusDataUpdateCoordinator(DataUpdateCoordinator): data: dict | None = await self.lms.async_prepared_status() if not data: - raise UpdateFailed("No data from status poll") + raise UpdateFailed( + translation_domain=DOMAIN, + translation_key="coordinator_no_data", + ) _LOGGER.debug("Raw serverstatus %s=%s", self.lms.name, data) return data diff --git a/homeassistant/components/squeezebox/media_player.py b/homeassistant/components/squeezebox/media_player.py index 315ea46c811..c7c7b79fa89 100644 --- a/homeassistant/components/squeezebox/media_player.py +++ b/homeassistant/components/squeezebox/media_player.py @@ -471,7 +471,11 @@ class SqueezeBoxMediaPlayerEntity(SqueezeboxEntity, MediaPlayerEntity): if announce: if media_type not in MediaType.MUSIC: raise ServiceValidationError( - "Announcements must have media type of 'music'. Playlists are not supported" + translation_domain=DOMAIN, + translation_key="invalid_announce_media_type", + translation_placeholders={ + "media_type": str(media_type), + }, ) extra = kwargs.get(ATTR_MEDIA_EXTRA, {}) @@ -480,7 +484,11 @@ class SqueezeBoxMediaPlayerEntity(SqueezeboxEntity, MediaPlayerEntity): announce_volume = get_announce_volume(extra) except ValueError: raise ServiceValidationError( - f"{ATTR_ANNOUNCE_VOLUME} must be a number greater than 0 and less than or equal to 1" + translation_domain=DOMAIN, + translation_key="invalid_announce_volume", + translation_placeholders={ + "announce_volume": ATTR_ANNOUNCE_VOLUME, + }, ) from None else: self._player.set_announce_volume(announce_volume) @@ -489,7 +497,11 @@ class SqueezeBoxMediaPlayerEntity(SqueezeboxEntity, MediaPlayerEntity): announce_timeout = get_announce_timeout(extra) except ValueError: raise ServiceValidationError( - f"{ATTR_ANNOUNCE_TIMEOUT} must be a whole number greater than 0" + translation_domain=DOMAIN, + translation_key="invalid_announce_timeout", + translation_placeholders={ + "announce_timeout": ATTR_ANNOUNCE_TIMEOUT, + }, ) from None else: self._player.set_announce_timeout(announce_timeout) @@ -595,13 +607,21 @@ class SqueezeBoxMediaPlayerEntity(SqueezeboxEntity, MediaPlayerEntity): other_player = ent_reg.async_get(other_player_entity_id) if other_player is None: raise ServiceValidationError( - f"Could not find player with entity_id {other_player_entity_id}" + translation_domain=DOMAIN, + translation_key="join_cannot_find_other_player", + translation_placeholders={ + "other_player_entity_id": str(other_player_entity_id) + }, ) if other_player_id := other_player.unique_id: await self._player.async_sync(other_player_id) else: raise ServiceValidationError( - f"Could not join unknown player {other_player_entity_id}" + translation_domain=DOMAIN, + translation_key="join_cannot_join_unknown_player", + translation_placeholders={ + "other_player_entity_id": str(other_player_entity_id) + }, ) async def async_unjoin_player(self) -> None: diff --git a/homeassistant/components/squeezebox/strings.json b/homeassistant/components/squeezebox/strings.json index 8f0d45bd737..6a4e30119a0 100644 --- a/homeassistant/components/squeezebox/strings.json +++ b/homeassistant/components/squeezebox/strings.json @@ -156,5 +156,34 @@ } } } + }, + "exceptions": { + "invalid_announce_media_type": { + "message": "Only type 'music' can be played as announcement (received type {media_type})." + }, + "invalid_announce_volume": { + "message": "{announce_volume} must be a number greater than 0 and less than or equal to 1." + }, + "invalid_announce_timeout": { + "message": "{announce_timeout} must be a number greater than 0." + }, + "join_cannot_find_other_player": { + "message": "Could not find player with entity_id {other_player_entity_id}." + }, + "join_cannot_join_unknown_player": { + "message": "Could not join unknown player {other_player_entity_id}." + }, + "coordinator_no_data": { + "message": "No data from status poll." + }, + "browse_media_not_found": { + "message": "Media not found: {type} / {id}." + }, + "browse_media_type_not_supported": { + "message": "Media type not supported: {media_type}." + }, + "update_restart_failed": { + "message": "Error trying to update LMS Plugins: Restart failed." + } } } diff --git a/homeassistant/components/squeezebox/update.py b/homeassistant/components/squeezebox/update.py index 900eca97041..62579424d25 100644 --- a/homeassistant/components/squeezebox/update.py +++ b/homeassistant/components/squeezebox/update.py @@ -19,6 +19,7 @@ from homeassistant.helpers.event import async_call_later from . import SqueezeboxConfigEntry from .const import ( + DOMAIN, SERVER_MODEL, STATUS_QUERY_VERSION, STATUS_UPDATE_NEWPLUGINS, @@ -161,7 +162,8 @@ class ServerStatusUpdatePlugins(ServerStatusUpdate): self.restart_triggered = False self.async_write_ha_state() raise HomeAssistantError( - "Error trying to update LMS Plugins: Restart failed" + translation_domain=DOMAIN, + translation_key="update_restart_failed", ) async def _async_update_catchall(self, now: datetime | None = None) -> None: