Fix Bang & Olufsen enum naming (#113022)

This commit is contained in:
Joost Lekkerkerker 2024-03-11 04:16:05 +01:00 committed by GitHub
parent 23f9aea64d
commit 0ea91515cf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 67 additions and 64 deletions

View File

@ -10,27 +10,27 @@ from mozart_api.models import Source, SourceArray, SourceTypeEnum
from homeassistant.components.media_player import MediaPlayerState, MediaType from homeassistant.components.media_player import MediaPlayerState, MediaType
class SOURCE_ENUM(StrEnum): class BangOlufsenSource(StrEnum):
"""Enum used for associating device source ids with friendly names. May not include all sources.""" """Enum used for associating device source ids with friendly names. May not include all sources."""
uriStreamer = "Audio Streamer" # noqa: N815 URI_STREAMER = "Audio Streamer"
bluetooth = "Bluetooth" BLUETOOTH = "Bluetooth"
airPlay = "AirPlay" # noqa: N815 AIR_PLAY = "AirPlay"
chromeCast = "Chromecast built-in" # noqa: N815 CHROMECAST = "Chromecast built-in"
spotify = "Spotify Connect" SPOTIFY = "Spotify Connect"
generator = "Tone Generator" GENERATOR = "Tone Generator"
lineIn = "Line-In" # noqa: N815 LINE_IN = "Line-In"
spdif = "Optical" SPDIF = "Optical"
netRadio = "B&O Radio" # noqa: N815 NET_RADIO = "B&O Radio"
local = "Local" LOCAL = "Local"
dlna = "DLNA" DLNA = "DLNA"
qplay = "QPlay" QPLAY = "QPlay"
wpl = "Wireless Powerlink" WPL = "Wireless Powerlink"
pl = "Powerlink" PL = "Powerlink"
tv = "TV" TV = "TV"
deezer = "Deezer" DEEZER = "Deezer"
beolink = "Networklink" BEOLINK = "Networklink"
tidalConnect = "Tidal Connect" # noqa: N815 TIDAL_CONNECT = "Tidal Connect"
BANG_OLUFSEN_STATES: dict[str, MediaPlayerState] = { BANG_OLUFSEN_STATES: dict[str, MediaPlayerState] = {
@ -48,7 +48,7 @@ BANG_OLUFSEN_STATES: dict[str, MediaPlayerState] = {
# Media types for play_media # Media types for play_media
class BANG_OLUFSEN_MEDIA_TYPE(StrEnum): class BangOlufsenMediaType(StrEnum):
"""Bang & Olufsen specific media types.""" """Bang & Olufsen specific media types."""
FAVOURITE = "favourite" FAVOURITE = "favourite"
@ -57,7 +57,7 @@ class BANG_OLUFSEN_MEDIA_TYPE(StrEnum):
TTS = "provider" TTS = "provider"
class MODEL_ENUM(StrEnum): class BangOlufsenModel(StrEnum):
"""Enum for compatible model names.""" """Enum for compatible model names."""
BEOLAB_8 = "BeoLab 8" BEOLAB_8 = "BeoLab 8"
@ -72,7 +72,7 @@ class MODEL_ENUM(StrEnum):
# Dispatcher events # Dispatcher events
class WEBSOCKET_NOTIFICATION(StrEnum): class WebsocketNotification(StrEnum):
"""Enum for WebSocket notification types.""" """Enum for WebSocket notification types."""
PLAYBACK_ERROR: Final[str] = "playback_error" PLAYBACK_ERROR: Final[str] = "playback_error"
@ -94,14 +94,14 @@ class WEBSOCKET_NOTIFICATION(StrEnum):
DOMAIN: Final[str] = "bang_olufsen" DOMAIN: Final[str] = "bang_olufsen"
# Default values for configuration. # Default values for configuration.
DEFAULT_MODEL: Final[str] = MODEL_ENUM.BEOSOUND_BALANCE DEFAULT_MODEL: Final[str] = BangOlufsenModel.BEOSOUND_BALANCE
# Configuration. # Configuration.
CONF_SERIAL_NUMBER: Final = "serial_number" CONF_SERIAL_NUMBER: Final = "serial_number"
CONF_BEOLINK_JID: Final = "jid" CONF_BEOLINK_JID: Final = "jid"
# Models to choose from in manual configuration. # Models to choose from in manual configuration.
COMPATIBLE_MODELS: list[str] = [x.value for x in MODEL_ENUM] COMPATIBLE_MODELS: list[str] = [x.value for x in BangOlufsenModel]
# Attribute names for zeroconf discovery. # Attribute names for zeroconf discovery.
ATTR_TYPE_NUMBER: Final[str] = "tn" ATTR_TYPE_NUMBER: Final[str] = "tn"
@ -113,10 +113,10 @@ ATTR_FRIENDLY_NAME: Final[str] = "fn"
BANG_OLUFSEN_ON: Final[str] = "on" BANG_OLUFSEN_ON: Final[str] = "on"
VALID_MEDIA_TYPES: Final[tuple] = ( VALID_MEDIA_TYPES: Final[tuple] = (
BANG_OLUFSEN_MEDIA_TYPE.FAVOURITE, BangOlufsenMediaType.FAVOURITE,
BANG_OLUFSEN_MEDIA_TYPE.DEEZER, BangOlufsenMediaType.DEEZER,
BANG_OLUFSEN_MEDIA_TYPE.RADIO, BangOlufsenMediaType.RADIO,
BANG_OLUFSEN_MEDIA_TYPE.TTS, BangOlufsenMediaType.TTS,
MediaType.MUSIC, MediaType.MUSIC,
MediaType.URL, MediaType.URL,
MediaType.CHANNEL, MediaType.CHANNEL,

View File

@ -51,16 +51,16 @@ from homeassistant.util.dt import utcnow
from . import BangOlufsenData from . import BangOlufsenData
from .const import ( from .const import (
BANG_OLUFSEN_MEDIA_TYPE,
BANG_OLUFSEN_STATES, BANG_OLUFSEN_STATES,
CONF_BEOLINK_JID, CONF_BEOLINK_JID,
CONNECTION_STATUS, CONNECTION_STATUS,
DOMAIN, DOMAIN,
FALLBACK_SOURCES, FALLBACK_SOURCES,
HIDDEN_SOURCE_IDS, HIDDEN_SOURCE_IDS,
SOURCE_ENUM,
VALID_MEDIA_TYPES, VALID_MEDIA_TYPES,
WEBSOCKET_NOTIFICATION, BangOlufsenMediaType,
BangOlufsenSource,
WebsocketNotification,
) )
from .entity import BangOlufsenEntity from .entity import BangOlufsenEntity
@ -145,7 +145,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
self.async_on_remove( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.PLAYBACK_ERROR}", f"{self._unique_id}_{WebsocketNotification.PLAYBACK_ERROR}",
self._update_playback_error, self._update_playback_error,
) )
) )
@ -153,7 +153,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
self.async_on_remove( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.PLAYBACK_METADATA}", f"{self._unique_id}_{WebsocketNotification.PLAYBACK_METADATA}",
self._update_playback_metadata, self._update_playback_metadata,
) )
) )
@ -161,35 +161,35 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
self.async_on_remove( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.PLAYBACK_PROGRESS}", f"{self._unique_id}_{WebsocketNotification.PLAYBACK_PROGRESS}",
self._update_playback_progress, self._update_playback_progress,
) )
) )
self.async_on_remove( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.PLAYBACK_STATE}", f"{self._unique_id}_{WebsocketNotification.PLAYBACK_STATE}",
self._update_playback_state, self._update_playback_state,
) )
) )
self.async_on_remove( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.REMOTE_MENU_CHANGED}", f"{self._unique_id}_{WebsocketNotification.REMOTE_MENU_CHANGED}",
self._update_sources, self._update_sources,
) )
) )
self.async_on_remove( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.SOURCE_CHANGE}", f"{self._unique_id}_{WebsocketNotification.SOURCE_CHANGE}",
self._update_source_change, self._update_source_change,
) )
) )
self.async_on_remove( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.VOLUME}", f"{self._unique_id}_{WebsocketNotification.VOLUME}",
self._update_volume, self._update_volume,
) )
) )
@ -335,7 +335,10 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
self._source_change = data self._source_change = data
# Check if source is line-in or optical and progress should be updated # Check if source is line-in or optical and progress should be updated
if self._source_change.id in (SOURCE_ENUM.lineIn, SOURCE_ENUM.spdif): if self._source_change.id in (
BangOlufsenSource.LINE_IN,
BangOlufsenSource.SPDIF,
):
self._playback_progress = PlaybackProgress(progress=0) self._playback_progress = PlaybackProgress(progress=0)
async def _update_volume(self, data: VolumeState) -> None: async def _update_volume(self, data: VolumeState) -> None:
@ -367,7 +370,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
def media_content_type(self) -> str: def media_content_type(self) -> str:
"""Return the current media type.""" """Return the current media type."""
# Hard to determine content type # Hard to determine content type
if self.source == SOURCE_ENUM.uriStreamer: if self.source == BangOlufsenSource.URI_STREAMER:
return MediaType.URL return MediaType.URL
return MediaType.MUSIC return MediaType.MUSIC
@ -425,21 +428,21 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
# Try to fix some of the source_change chromecast weirdness. # Try to fix some of the source_change chromecast weirdness.
if hasattr(self._playback_metadata, "title"): if hasattr(self._playback_metadata, "title"):
# source_change is chromecast but line in is selected. # source_change is chromecast but line in is selected.
if self._playback_metadata.title == SOURCE_ENUM.lineIn: if self._playback_metadata.title == BangOlufsenSource.LINE_IN:
return SOURCE_ENUM.lineIn return BangOlufsenSource.LINE_IN
# source_change is chromecast but bluetooth is selected. # source_change is chromecast but bluetooth is selected.
if self._playback_metadata.title == SOURCE_ENUM.bluetooth: if self._playback_metadata.title == BangOlufsenSource.BLUETOOTH:
return SOURCE_ENUM.bluetooth return BangOlufsenSource.BLUETOOTH
# source_change is line in, bluetooth or optical but stale metadata is sent through the WebSocket, # source_change is line in, bluetooth or optical but stale metadata is sent through the WebSocket,
# And the source has not changed. # And the source has not changed.
if self._source_change.id in ( if self._source_change.id in (
SOURCE_ENUM.bluetooth, BangOlufsenSource.BLUETOOTH,
SOURCE_ENUM.lineIn, BangOlufsenSource.LINE_IN,
SOURCE_ENUM.spdif, BangOlufsenSource.SPDIF,
): ):
return SOURCE_ENUM.chromeCast return BangOlufsenSource.CHROMECAST
# source_change is chromecast and there is metadata but no artwork. Bluetooth does support metadata but not artwork # source_change is chromecast and there is metadata but no artwork. Bluetooth does support metadata but not artwork
# So i assume that it is bluetooth and not chromecast # So i assume that it is bluetooth and not chromecast
@ -449,9 +452,9 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
): ):
if ( if (
len(self._playback_metadata.art) == 0 len(self._playback_metadata.art) == 0
and self._source_change.name == SOURCE_ENUM.bluetooth and self._source_change.name == BangOlufsenSource.BLUETOOTH
): ):
return SOURCE_ENUM.bluetooth return BangOlufsenSource.BLUETOOTH
return self._source_change.name return self._source_change.name
@ -494,7 +497,7 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
async def async_media_seek(self, position: float) -> None: async def async_media_seek(self, position: float) -> None:
"""Seek to position in ms.""" """Seek to position in ms."""
if self.source == SOURCE_ENUM.deezer: if self.source == BangOlufsenSource.DEEZER:
await self._client.seek_to_position(position_ms=int(position * 1000)) await self._client.seek_to_position(position_ms=int(position * 1000))
# Try to prevent the playback progress from bouncing in the UI. # Try to prevent the playback progress from bouncing in the UI.
self._attr_media_position_updated_at = utcnow() self._attr_media_position_updated_at = utcnow()
@ -568,14 +571,14 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
# 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.
# Use it for now. # Use it for now.
elif media_type == BANG_OLUFSEN_MEDIA_TYPE.TTS: elif media_type == BangOlufsenMediaType.TTS:
await self._client.post_overlay_play( await self._client.post_overlay_play(
overlay_play_request=OverlayPlayRequest( overlay_play_request=OverlayPlayRequest(
uri=Uri(location=media_id), uri=Uri(location=media_id),
) )
) )
elif media_type == BANG_OLUFSEN_MEDIA_TYPE.RADIO: elif media_type == BangOlufsenMediaType.RADIO:
await self._client.run_provided_scene( await self._client.run_provided_scene(
scene_properties=SceneProperties( scene_properties=SceneProperties(
action_list=[ action_list=[
@ -587,10 +590,10 @@ class BangOlufsenMediaPlayer(BangOlufsenEntity, MediaPlayerEntity):
) )
) )
elif media_type == BANG_OLUFSEN_MEDIA_TYPE.FAVOURITE: elif media_type == BangOlufsenMediaType.FAVOURITE:
await self._client.activate_preset(id=int(media_id)) await self._client.activate_preset(id=int(media_id))
elif media_type == BANG_OLUFSEN_MEDIA_TYPE.DEEZER: elif media_type == BangOlufsenMediaType.DEEZER:
try: try:
if media_id == "flow": if media_id == "flow":
deezer_id = None deezer_id = None

View File

@ -24,7 +24,7 @@ from homeassistant.helpers.dispatcher import async_dispatcher_send
from .const import ( from .const import (
BANG_OLUFSEN_WEBSOCKET_EVENT, BANG_OLUFSEN_WEBSOCKET_EVENT,
CONNECTION_STATUS, CONNECTION_STATUS,
WEBSOCKET_NOTIFICATION, WebsocketNotification,
) )
from .entity import BangOlufsenBase from .entity import BangOlufsenBase
from .util import get_device from .util import get_device
@ -93,17 +93,17 @@ class BangOlufsenWebsocket(BangOlufsenBase):
) -> None: ) -> None:
"""Send notification dispatch.""" """Send notification dispatch."""
if notification.value: if notification.value:
if WEBSOCKET_NOTIFICATION.REMOTE_MENU_CHANGED in notification.value: if WebsocketNotification.REMOTE_MENU_CHANGED in notification.value:
async_dispatcher_send( async_dispatcher_send(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.REMOTE_MENU_CHANGED}", f"{self._unique_id}_{WebsocketNotification.REMOTE_MENU_CHANGED}",
) )
def on_playback_error_notification(self, notification: PlaybackError) -> None: def on_playback_error_notification(self, notification: PlaybackError) -> None:
"""Send playback_error dispatch.""" """Send playback_error dispatch."""
async_dispatcher_send( async_dispatcher_send(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.PLAYBACK_ERROR}", f"{self._unique_id}_{WebsocketNotification.PLAYBACK_ERROR}",
notification, notification,
) )
@ -113,7 +113,7 @@ class BangOlufsenWebsocket(BangOlufsenBase):
"""Send playback_metadata dispatch.""" """Send playback_metadata dispatch."""
async_dispatcher_send( async_dispatcher_send(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.PLAYBACK_METADATA}", f"{self._unique_id}_{WebsocketNotification.PLAYBACK_METADATA}",
notification, notification,
) )
@ -121,7 +121,7 @@ class BangOlufsenWebsocket(BangOlufsenBase):
"""Send playback_progress dispatch.""" """Send playback_progress dispatch."""
async_dispatcher_send( async_dispatcher_send(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.PLAYBACK_PROGRESS}", f"{self._unique_id}_{WebsocketNotification.PLAYBACK_PROGRESS}",
notification, notification,
) )
@ -129,7 +129,7 @@ class BangOlufsenWebsocket(BangOlufsenBase):
"""Send playback_state dispatch.""" """Send playback_state dispatch."""
async_dispatcher_send( async_dispatcher_send(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.PLAYBACK_STATE}", f"{self._unique_id}_{WebsocketNotification.PLAYBACK_STATE}",
notification, notification,
) )
@ -137,7 +137,7 @@ class BangOlufsenWebsocket(BangOlufsenBase):
"""Send source_change dispatch.""" """Send source_change dispatch."""
async_dispatcher_send( async_dispatcher_send(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.SOURCE_CHANGE}", f"{self._unique_id}_{WebsocketNotification.SOURCE_CHANGE}",
notification, notification,
) )
@ -145,7 +145,7 @@ class BangOlufsenWebsocket(BangOlufsenBase):
"""Send volume dispatch.""" """Send volume dispatch."""
async_dispatcher_send( async_dispatcher_send(
self.hass, self.hass,
f"{self._unique_id}_{WEBSOCKET_NOTIFICATION.VOLUME}", f"{self._unique_id}_{WebsocketNotification.VOLUME}",
notification, notification,
) )