mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 07:07:28 +00:00
Bang & Olufsen add overlay/announce play_media functionality (#113434)
* Add overlay service * Convert custom service to play_media announce * Remove debugging
This commit is contained in:
parent
0aac4b26a4
commit
67e9e90346
@ -55,6 +55,7 @@ class BangOlufsenMediaType(StrEnum):
|
|||||||
DEEZER = "deezer"
|
DEEZER = "deezer"
|
||||||
RADIO = "radio"
|
RADIO = "radio"
|
||||||
TTS = "provider"
|
TTS = "provider"
|
||||||
|
OVERLAY_TTS = "overlay_tts"
|
||||||
|
|
||||||
|
|
||||||
class BangOlufsenModel(StrEnum):
|
class BangOlufsenModel(StrEnum):
|
||||||
@ -117,6 +118,7 @@ VALID_MEDIA_TYPES: Final[tuple] = (
|
|||||||
BangOlufsenMediaType.DEEZER,
|
BangOlufsenMediaType.DEEZER,
|
||||||
BangOlufsenMediaType.RADIO,
|
BangOlufsenMediaType.RADIO,
|
||||||
BangOlufsenMediaType.TTS,
|
BangOlufsenMediaType.TTS,
|
||||||
|
BangOlufsenMediaType.OVERLAY_TTS,
|
||||||
MediaType.MUSIC,
|
MediaType.MUSIC,
|
||||||
MediaType.URL,
|
MediaType.URL,
|
||||||
MediaType.CHANNEL,
|
MediaType.CHANNEL,
|
||||||
|
@ -12,6 +12,7 @@ from mozart_api.models import (
|
|||||||
Action,
|
Action,
|
||||||
Art,
|
Art,
|
||||||
OverlayPlayRequest,
|
OverlayPlayRequest,
|
||||||
|
OverlayPlayRequestTextToSpeechTextToSpeech,
|
||||||
PlaybackContentMetadata,
|
PlaybackContentMetadata,
|
||||||
PlaybackError,
|
PlaybackError,
|
||||||
PlaybackProgress,
|
PlaybackProgress,
|
||||||
@ -69,6 +70,7 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
BANG_OLUFSEN_FEATURES = (
|
BANG_OLUFSEN_FEATURES = (
|
||||||
MediaPlayerEntityFeature.BROWSE_MEDIA
|
MediaPlayerEntityFeature.BROWSE_MEDIA
|
||||||
| MediaPlayerEntityFeature.CLEAR_PLAYLIST
|
| MediaPlayerEntityFeature.CLEAR_PLAYLIST
|
||||||
|
| MediaPlayerEntityFeature.MEDIA_ANNOUNCE
|
||||||
| MediaPlayerEntityFeature.NEXT_TRACK
|
| MediaPlayerEntityFeature.NEXT_TRACK
|
||||||
| MediaPlayerEntityFeature.PAUSE
|
| MediaPlayerEntityFeature.PAUSE
|
||||||
| MediaPlayerEntityFeature.PLAY
|
| MediaPlayerEntityFeature.PLAY
|
||||||
@ -547,10 +549,10 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
|
|||||||
self,
|
self,
|
||||||
media_type: MediaType | str,
|
media_type: MediaType | str,
|
||||||
media_id: str,
|
media_id: str,
|
||||||
|
announce: bool | None = None,
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Play from: netradio station id, URI, favourite or Deezer."""
|
"""Play from: netradio station id, URI, favourite or Deezer."""
|
||||||
|
|
||||||
# Convert audio/mpeg, audio/aac etc. to MediaType.MUSIC
|
# Convert audio/mpeg, audio/aac etc. to MediaType.MUSIC
|
||||||
if media_type.startswith("audio/"):
|
if media_type.startswith("audio/"):
|
||||||
media_type = MediaType.MUSIC
|
media_type = MediaType.MUSIC
|
||||||
@ -574,7 +576,42 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
|
|||||||
if media_id.endswith(".m3u"):
|
if media_id.endswith(".m3u"):
|
||||||
media_id = media_id.replace(".m3u", "")
|
media_id = media_id.replace(".m3u", "")
|
||||||
|
|
||||||
if media_type in (MediaType.URL, MediaType.MUSIC):
|
if announce:
|
||||||
|
extra = kwargs.get(ATTR_MEDIA_EXTRA, {})
|
||||||
|
|
||||||
|
absolute_volume = extra.get("overlay_absolute_volume", None)
|
||||||
|
offset_volume = extra.get("overlay_offset_volume", None)
|
||||||
|
tts_language = extra.get("overlay_tts_language", "en-us")
|
||||||
|
|
||||||
|
# Construct request
|
||||||
|
overlay_play_request = OverlayPlayRequest()
|
||||||
|
|
||||||
|
# Define volume level
|
||||||
|
if absolute_volume:
|
||||||
|
overlay_play_request.volume_absolute = absolute_volume
|
||||||
|
|
||||||
|
elif offset_volume:
|
||||||
|
# Ensure that the volume is not above 100
|
||||||
|
if not self._volume.level or not self._volume.level.level:
|
||||||
|
_LOGGER.warning("Error setting volume")
|
||||||
|
else:
|
||||||
|
overlay_play_request.volume_absolute = min(
|
||||||
|
self._volume.level.level + offset_volume, 100
|
||||||
|
)
|
||||||
|
|
||||||
|
if media_type == BangOlufsenMediaType.OVERLAY_TTS:
|
||||||
|
# Bang & Olufsen cloud TTS
|
||||||
|
overlay_play_request.text_to_speech = (
|
||||||
|
OverlayPlayRequestTextToSpeechTextToSpeech(
|
||||||
|
lang=tts_language, text=media_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
overlay_play_request.uri = Uri(location=media_id)
|
||||||
|
|
||||||
|
await self._client.post_overlay_play(overlay_play_request)
|
||||||
|
|
||||||
|
elif media_type in (MediaType.URL, MediaType.MUSIC):
|
||||||
await self._client.post_uri_source(uri=Uri(location=media_id))
|
await self._client.post_uri_source(uri=Uri(location=media_id))
|
||||||
|
|
||||||
# The "provider" media_type may not be suitable for overlay all the time.
|
# The "provider" media_type may not be suitable for overlay all the time.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user