Skip to content

Commit f7c41e6

Browse files
authored
Add media content id attribute to Bang & Olufsen (home-assistant#156597)
1 parent 9ee7ed5 commit f7c41e6

File tree

5 files changed

+192
-123
lines changed

5 files changed

+192
-123
lines changed

homeassistant/components/bang_olufsen/const.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717
class BangOlufsenSource:
1818
"""Class used for associating device source ids with friendly names. May not include all sources."""
1919

20+
DEEZER: Final[Source] = Source(name="Deezer", id="deezer")
2021
LINE_IN: Final[Source] = Source(name="Line-In", id="lineIn")
22+
NET_RADIO: Final[Source] = Source(name="B&O Radio", id="netRadio")
2123
SPDIF: Final[Source] = Source(name="Optical", id="spdif")
24+
TIDAL: Final[Source] = Source(name="Tidal", id="tidal")
25+
UNKNOWN: Final[Source] = Source(name="Unknown Source", id="unknown")
2226
URI_STREAMER: Final[Source] = Source(name="Audio Streamer", id="uriStreamer")
2327

2428

@@ -78,6 +82,16 @@ class BangOlufsenModel(StrEnum):
7882
BEOREMOTE_ONE = "Beoremote One"
7983

8084

85+
class BangOlufsenAttribute(StrEnum):
86+
"""Enum for extra_state_attribute keys."""
87+
88+
BEOLINK = "beolink"
89+
BEOLINK_PEERS = "peers"
90+
BEOLINK_SELF = "self"
91+
BEOLINK_LEADER = "leader"
92+
BEOLINK_LISTENERS = "listeners"
93+
94+
8195
# Physical "buttons" on devices
8296
class BangOlufsenButtons(StrEnum):
8397
"""Enum for device buttons."""

homeassistant/components/bang_olufsen/media_player.py

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
FALLBACK_SOURCES,
8383
MANUFACTURER,
8484
VALID_MEDIA_TYPES,
85+
BangOlufsenAttribute,
8586
BangOlufsenMediaType,
8687
BangOlufsenSource,
8788
WebsocketNotification,
@@ -224,7 +225,8 @@ def __init__(self, entry: ConfigEntry, client: MozartClient) -> None:
224225
# Beolink compatible sources
225226
self._beolink_sources: dict[str, bool] = {}
226227
self._remote_leader: BeolinkLeader | None = None
227-
# Extra state attributes for showing Beolink: peer(s), listener(s), leader and self
228+
# Extra state attributes:
229+
# Beolink: peer(s), listener(s), leader and self
228230
self._beolink_attributes: dict[str, dict[str, dict[str, str]]] = {}
229231

230232
async def async_added_to_hass(self) -> None:
@@ -436,7 +438,10 @@ async def _async_update_name_and_beolink(self) -> None:
436438
await self._async_update_beolink()
437439

438440
async def _async_update_beolink(self) -> None:
439-
"""Update the current Beolink leader, listeners, peers and self."""
441+
"""Update the current Beolink leader, listeners, peers and self.
442+
443+
Updates Home Assistant state.
444+
"""
440445

441446
self._beolink_attributes = {}
442447

@@ -445,18 +450,24 @@ async def _async_update_beolink(self) -> None:
445450

446451
# Add Beolink self
447452
self._beolink_attributes = {
448-
"beolink": {"self": {self.device_entry.name: self._beolink_jid}}
453+
BangOlufsenAttribute.BEOLINK: {
454+
BangOlufsenAttribute.BEOLINK_SELF: {
455+
self.device_entry.name: self._beolink_jid
456+
}
457+
}
449458
}
450459

451460
# Add Beolink peers
452461
peers = await self._client.get_beolink_peers()
453462

454463
if len(peers) > 0:
455-
self._beolink_attributes["beolink"]["peers"] = {}
464+
self._beolink_attributes[BangOlufsenAttribute.BEOLINK][
465+
BangOlufsenAttribute.BEOLINK_PEERS
466+
] = {}
456467
for peer in peers:
457-
self._beolink_attributes["beolink"]["peers"][peer.friendly_name] = (
458-
peer.jid
459-
)
468+
self._beolink_attributes[BangOlufsenAttribute.BEOLINK][
469+
BangOlufsenAttribute.BEOLINK_PEERS
470+
][peer.friendly_name] = peer.jid
460471

461472
# Add Beolink listeners / leader
462473
self._remote_leader = self._playback_metadata.remote_leader
@@ -477,7 +488,9 @@ async def _async_update_beolink(self) -> None:
477488
# Add self
478489
group_members.append(self.entity_id)
479490

480-
self._beolink_attributes["beolink"]["leader"] = {
491+
self._beolink_attributes[BangOlufsenAttribute.BEOLINK][
492+
BangOlufsenAttribute.BEOLINK_LEADER
493+
] = {
481494
self._remote_leader.friendly_name: self._remote_leader.jid,
482495
}
483496

@@ -514,9 +527,9 @@ async def _async_update_beolink(self) -> None:
514527
beolink_listener.jid
515528
)
516529
break
517-
self._beolink_attributes["beolink"]["listeners"] = (
518-
beolink_listeners_attribute
519-
)
530+
self._beolink_attributes[BangOlufsenAttribute.BEOLINK][
531+
BangOlufsenAttribute.BEOLINK_LISTENERS
532+
] = beolink_listeners_attribute
520533

521534
self._attr_group_members = group_members
522535

@@ -615,11 +628,18 @@ def is_volume_muted(self) -> bool | None:
615628
return None
616629

617630
@property
618-
def media_content_type(self) -> str:
631+
def media_content_type(self) -> MediaType | str | None:
619632
"""Return the current media type."""
620-
# Hard to determine content type
621-
if self._source_change.id == BangOlufsenSource.URI_STREAMER.id:
622-
return MediaType.URL
633+
content_type = {
634+
BangOlufsenSource.URI_STREAMER.id: MediaType.URL,
635+
BangOlufsenSource.DEEZER.id: BangOlufsenMediaType.DEEZER,
636+
BangOlufsenSource.TIDAL.id: BangOlufsenMediaType.TIDAL,
637+
BangOlufsenSource.NET_RADIO.id: BangOlufsenMediaType.RADIO,
638+
}
639+
# Hard to determine content type.
640+
if self._source_change.id in content_type:
641+
return content_type[self._source_change.id]
642+
623643
return MediaType.MUSIC
624644

625645
@property
@@ -632,6 +652,11 @@ def media_position(self) -> int | None:
632652
"""Return the current playback progress."""
633653
return self._playback_progress.progress
634654

655+
@property
656+
def media_content_id(self) -> str | None:
657+
"""Return internal ID of Deezer, Tidal and radio stations."""
658+
return self._playback_metadata.source_internal_id
659+
635660
@property
636661
def media_image_url(self) -> str | None:
637662
"""Return URL of the currently playing music."""

tests/components/bang_olufsen/const.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@
168168
title="Test title",
169169
total_duration_seconds=123,
170170
track=1,
171+
source_internal_id="123",
171172
)
172173
TEST_PLAYBACK_ERROR = PlaybackError(error="Test error")
173174
TEST_PLAYBACK_PROGRESS = PlaybackProgress(progress=123)

0 commit comments

Comments
 (0)