diff --git a/src/linkplay/bridge.py b/src/linkplay/bridge.py index bd174d4..01c25b0 100644 --- a/src/linkplay/bridge.py +++ b/src/linkplay/bridge.py @@ -149,6 +149,12 @@ async def set_play_mode(self, mode: PlayingMode) -> None: LinkPlayCommand.SWITCH_MODE.format(PLAY_MODE_SEND_MAP[mode]) ) # type: ignore[str-format] + async def play_preset(self, preset_number: int) -> None: + """Play a preset.""" + if not 0 < preset_number <= 10: + raise ValueError("Preset must be between 1 and 10.") + await self.bridge.request(LinkPlayCommand.PLAY_PRESET.format(preset_number)) + @property def muted(self) -> bool: """Returns if the player is muted.""" diff --git a/src/linkplay/consts.py b/src/linkplay/consts.py index bf17970..b310699 100644 --- a/src/linkplay/consts.py +++ b/src/linkplay/consts.py @@ -89,6 +89,7 @@ class LinkPlayCommand(StrEnum): MULTIROOM_MUTE = "setPlayerCmd:slave_mute:mute" MULTIROOM_UNMUTE = "setPlayerCmd:slave_mute:unmute" MULTIROOM_JOIN = "ConnectMasterAp:JoinGroupMaster:eth{}:wifi0.0.0.0" + PLAY_PRESET = "MCUKeyShortClick:{}" class SpeakerType(StrEnum): diff --git a/tests/linkplay/test_bridge.py b/tests/linkplay/test_bridge.py index 158ada2..0af91b8 100644 --- a/tests/linkplay/test_bridge.py +++ b/tests/linkplay/test_bridge.py @@ -233,6 +233,35 @@ async def test_player_set_play_mode(): ) +@pytest.mark.parametrize("preset_number", range(1, 11)) +async def test_player_play_preset(preset_number: int): + """Tests if a player is able to play a preset.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + await player.play_preset(preset_number) + + bridge.request.assert_called_once_with( + LinkPlayCommand.PLAY_PRESET.format(preset_number) + ) + + +@pytest.mark.parametrize( + "preset_number", + [ + 0, + 11, + ], +) +async def test_player_play_preset_raises_value_error(preset_number: int): + """Tests that a player fails in an expected way if play preset input is incorrect.""" + bridge = AsyncMock() + player = LinkPlayPlayer(bridge) + + with pytest.raises(ValueError): + await player.play_preset(preset_number) + + async def test_multiroom_setup(): """Tests if multiroom sets up correctly.""" leader = AsyncMock()