Add Arcam radio media browsing (#39593)
parent
b6630a48b2
commit
74fea6d306
|
@ -3,7 +3,7 @@
|
|||
"name": "Arcam FMJ Receivers",
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/arcam_fmj",
|
||||
"requirements": ["arcam-fmj==0.5.2"],
|
||||
"requirements": ["arcam-fmj==0.5.3"],
|
||||
"ssdp": [
|
||||
{
|
||||
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1",
|
||||
|
|
|
@ -8,6 +8,8 @@ from homeassistant import config_entries
|
|||
from homeassistant.components.media_player import MediaPlayerEntity
|
||||
from homeassistant.components.media_player.const import (
|
||||
MEDIA_TYPE_MUSIC,
|
||||
SUPPORT_BROWSE_MEDIA,
|
||||
SUPPORT_PLAY_MEDIA,
|
||||
SUPPORT_SELECT_SOUND_MODE,
|
||||
SUPPORT_SELECT_SOURCE,
|
||||
SUPPORT_TURN_OFF,
|
||||
|
@ -16,6 +18,7 @@ from homeassistant.components.media_player.const import (
|
|||
SUPPORT_VOLUME_SET,
|
||||
SUPPORT_VOLUME_STEP,
|
||||
)
|
||||
from homeassistant.components.media_player.errors import BrowseError
|
||||
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.helpers.typing import HomeAssistantType
|
||||
|
@ -72,6 +75,8 @@ class ArcamFmj(MediaPlayerEntity):
|
|||
self._uuid = uuid
|
||||
self._support = (
|
||||
SUPPORT_SELECT_SOURCE
|
||||
| SUPPORT_PLAY_MEDIA
|
||||
| SUPPORT_BROWSE_MEDIA
|
||||
| SUPPORT_VOLUME_SET
|
||||
| SUPPORT_VOLUME_MUTE
|
||||
| SUPPORT_VOLUME_STEP
|
||||
|
@ -238,6 +243,45 @@ class ArcamFmj(MediaPlayerEntity):
|
|||
"""Turn the media player off."""
|
||||
await self._state.set_power(False)
|
||||
|
||||
async def async_browse_media(self, media_content_type=None, media_content_id=None):
|
||||
"""Implement the websocket media browsing helper."""
|
||||
if media_content_id not in (None, "root"):
|
||||
raise BrowseError(
|
||||
f"Media not found: {media_content_type} / {media_content_id}"
|
||||
)
|
||||
|
||||
presets = self._state.get_preset_details()
|
||||
|
||||
radio = [
|
||||
{
|
||||
"title": preset.name,
|
||||
"media_content_id": f"preset:{preset.index}",
|
||||
"media_content_type": MEDIA_TYPE_MUSIC,
|
||||
"can_play": True,
|
||||
}
|
||||
for preset in presets.values()
|
||||
]
|
||||
|
||||
root = {
|
||||
"title": "Root",
|
||||
"media_content_id": "root",
|
||||
"media_content_type": "library",
|
||||
"can_play": False,
|
||||
"children": radio,
|
||||
}
|
||||
|
||||
return root
|
||||
|
||||
async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> None:
|
||||
"""Play media."""
|
||||
|
||||
if media_id.startswith("preset:"):
|
||||
preset = int(media_id[7:])
|
||||
await self._state.set_tuner_preset(preset)
|
||||
else:
|
||||
_LOGGER.error("Media %s is not supported", media_id)
|
||||
return
|
||||
|
||||
@property
|
||||
def source(self):
|
||||
"""Return the current input source."""
|
||||
|
@ -303,6 +347,21 @@ class ArcamFmj(MediaPlayerEntity):
|
|||
value = None
|
||||
return value
|
||||
|
||||
@property
|
||||
def media_content_id(self):
|
||||
"""Content type of current playing media."""
|
||||
source = self._state.get_source()
|
||||
if source in (SourceCodes.DAB, SourceCodes.FM):
|
||||
preset = self._state.get_tuner_preset()
|
||||
if preset:
|
||||
value = f"preset:{preset}"
|
||||
else:
|
||||
value = None
|
||||
else:
|
||||
value = None
|
||||
|
||||
return value
|
||||
|
||||
@property
|
||||
def media_channel(self):
|
||||
"""Channel currently playing."""
|
||||
|
|
|
@ -272,7 +272,7 @@ aprslib==0.6.46
|
|||
aqualogic==1.0
|
||||
|
||||
# homeassistant.components.arcam_fmj
|
||||
arcam-fmj==0.5.2
|
||||
arcam-fmj==0.5.3
|
||||
|
||||
# homeassistant.components.arris_tg2492lg
|
||||
arris-tg2492lg==1.0.0
|
||||
|
|
|
@ -161,7 +161,7 @@ apprise==0.8.8
|
|||
aprslib==0.6.46
|
||||
|
||||
# homeassistant.components.arcam_fmj
|
||||
arcam-fmj==0.5.2
|
||||
arcam-fmj==0.5.3
|
||||
|
||||
# homeassistant.components.dlna_dmr
|
||||
# homeassistant.components.upnp
|
||||
|
|
|
@ -62,7 +62,7 @@ async def test_powered_on(player, state):
|
|||
async def test_supported_features(player, state):
|
||||
"""Test supported features."""
|
||||
data = await update(player)
|
||||
assert data.attributes["supported_features"] == 69004
|
||||
assert data.attributes["supported_features"] == 200588
|
||||
|
||||
|
||||
async def test_turn_on(player, state):
|
||||
|
|
Loading…
Reference in New Issue