diff --git a/tests/test_media_mpris.py b/tests/test_media_mpris.py index e8dc1bd..57c097d 100644 --- a/tests/test_media_mpris.py +++ b/tests/test_media_mpris.py @@ -61,3 +61,39 @@ async def test_pause_pauses_only_playing_players(monkeypatch): playing.call_pause.assert_awaited_once() paused.call_pause.assert_not_awaited() assert controller._paused == ["org.mpris.MediaPlayer2.spotify"] + + +@pytest.mark.asyncio +async def test_resume_plays_only_previously_paused(monkeypatch): + from whisper_local.media._mpris import MprisController + + spotify = _make_player("Paused") + vlc = _make_player("Paused") + + async def fake_get_player(name: str): + return {"org.mpris.MediaPlayer2.spotify": spotify, + "org.mpris.MediaPlayer2.vlc": vlc}[name] + + controller = MprisController() + controller._paused = ["org.mpris.MediaPlayer2.spotify"] + monkeypatch.setattr(controller, "_get_player_interface", fake_get_player) + + await controller.resume() + + spotify.call_play.assert_awaited_once() + vlc.call_play.assert_not_awaited() + assert controller._paused == [] + + +@pytest.mark.asyncio +async def test_resume_with_empty_paused_list_is_noop(monkeypatch): + from whisper_local.media._mpris import MprisController + + controller = MprisController() + controller._paused = [] + get_player = AsyncMock() + monkeypatch.setattr(controller, "_get_player_interface", get_player) + + await controller.resume() + + get_player.assert_not_awaited() diff --git a/whisper_local/media/_mpris.py b/whisper_local/media/_mpris.py index 8f102b7..4f9e16f 100644 --- a/whisper_local/media/_mpris.py +++ b/whisper_local/media/_mpris.py @@ -61,5 +61,16 @@ class MprisController: if isinstance(name, str) ] + async def _resume_player(self, bus_name: str) -> None: + player = await self._get_player_interface(bus_name) + await player.call_play() + async def resume(self) -> None: - return None + if not self._paused: + return + to_resume = self._paused + self._paused = [] + await asyncio.gather( + *(self._resume_player(n) for n in to_resume), + return_exceptions=True, + )