Use saved volume when selecting preset in bluesound integration (#141079)

* Use load_preset to select preset as source

* Add tests

* Fix

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
This commit is contained in:
Louis Christ 2025-04-01 14:41:24 +02:00 committed by GitHub
parent 50c12d4487
commit 32ee31b8c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 35 additions and 9 deletions

View File

@ -501,18 +501,16 @@ class BluesoundPlayer(CoordinatorEntity[BluesoundCoordinator], MediaPlayerEntity
return
# presets and inputs might have the same name; presets have priority
url: str | None = None
for input_ in self._inputs:
if input_.text == source:
url = input_.url
await self._player.play_url(input_.url)
return
for preset in self._presets:
if preset.name == source:
url = preset.url
await self._player.load_preset(preset.id)
return
if url is None:
raise ServiceValidationError(f"Source {source} not found")
await self._player.play_url(url)
raise ServiceValidationError(f"Source {source} not found")
async def async_clear_playlist(self) -> None:
"""Clear players playlist."""

View File

@ -102,8 +102,8 @@ class PlayerMockData:
)
player.presets = AsyncMock(
return_value=[
Preset("preset1", "1", "url1", "image1", None),
Preset("preset2", "2", "url2", "image2", None),
Preset("preset1", 1, "url1", "image1", None),
Preset("preset2", 2, "url2", "image2", None),
]
)

View File

@ -17,12 +17,14 @@ from homeassistant.components.bluesound.media_player import (
SERVICE_SET_TIMER,
)
from homeassistant.components.media_player import (
ATTR_INPUT_SOURCE,
ATTR_MEDIA_VOLUME_LEVEL,
DOMAIN as MEDIA_PLAYER_DOMAIN,
SERVICE_MEDIA_NEXT_TRACK,
SERVICE_MEDIA_PAUSE,
SERVICE_MEDIA_PLAY,
SERVICE_MEDIA_PREVIOUS_TRACK,
SERVICE_SELECT_SOURCE,
SERVICE_VOLUME_DOWN,
SERVICE_VOLUME_MUTE,
SERVICE_VOLUME_SET,
@ -119,6 +121,32 @@ async def test_volume_down(
player_mocks.player_data.player.volume.assert_called_once_with(level=9)
async def test_select_input_source(
hass: HomeAssistant, setup_config_entry: None, player_mocks: PlayerMocks
) -> None:
"""Test the media player select input source."""
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_SELECT_SOURCE,
{ATTR_ENTITY_ID: "media_player.player_name1111", ATTR_INPUT_SOURCE: "input1"},
)
player_mocks.player_data.player.play_url.assert_called_once_with("url1")
async def test_select_preset_source(
hass: HomeAssistant, setup_config_entry: None, player_mocks: PlayerMocks
) -> None:
"""Test the media player select preset source."""
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_SELECT_SOURCE,
{ATTR_ENTITY_ID: "media_player.player_name1111", ATTR_INPUT_SOURCE: "preset1"},
)
player_mocks.player_data.player.load_preset.assert_called_once_with(1)
async def test_attributes_set(
hass: HomeAssistant,
setup_config_entry: None,