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:
Markus Jacobsen 2024-06-04 13:48:22 +02:00 committed by GitHub
parent 0aac4b26a4
commit 67e9e90346
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 41 additions and 2 deletions

View File

@ -55,6 +55,7 @@ class BangOlufsenMediaType(StrEnum):
DEEZER = "deezer"
RADIO = "radio"
TTS = "provider"
OVERLAY_TTS = "overlay_tts"
class BangOlufsenModel(StrEnum):
@ -117,6 +118,7 @@ VALID_MEDIA_TYPES: Final[tuple] = (
BangOlufsenMediaType.DEEZER,
BangOlufsenMediaType.RADIO,
BangOlufsenMediaType.TTS,
BangOlufsenMediaType.OVERLAY_TTS,
MediaType.MUSIC,
MediaType.URL,
MediaType.CHANNEL,

View File

@ -12,6 +12,7 @@ from mozart_api.models import (
Action,
Art,
OverlayPlayRequest,
OverlayPlayRequestTextToSpeechTextToSpeech,
PlaybackContentMetadata,
PlaybackError,
PlaybackProgress,
@ -69,6 +70,7 @@ _LOGGER = logging.getLogger(__name__)
BANG_OLUFSEN_FEATURES = (
MediaPlayerEntityFeature.BROWSE_MEDIA
| MediaPlayerEntityFeature.CLEAR_PLAYLIST
| MediaPlayerEntityFeature.MEDIA_ANNOUNCE
| MediaPlayerEntityFeature.NEXT_TRACK
| MediaPlayerEntityFeature.PAUSE
| MediaPlayerEntityFeature.PLAY
@ -547,10 +549,10 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
self,
media_type: MediaType | str,
media_id: str,
announce: bool | None = None,
**kwargs: Any,
) -> None:
"""Play from: netradio station id, URI, favourite or Deezer."""
# Convert audio/mpeg, audio/aac etc. to MediaType.MUSIC
if media_type.startswith("audio/"):
media_type = MediaType.MUSIC
@ -574,7 +576,42 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
if media_id.endswith(".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))
# The "provider" media_type may not be suitable for overlay all the time.