feat(media): SmtcController.resume() stellt nur eigene Pausen wieder her

This commit is contained in:
2026-04-16 18:15:16 +02:00
parent 89edf23de9
commit 802e06acd9
2 changed files with 103 additions and 1 deletions
+79
View File
@@ -149,3 +149,82 @@ async def test_pause_logs_and_continues_when_session_fails(monkeypatch, caplog):
good.try_pause_async.assert_awaited_once() good.try_pause_async.assert_awaited_once()
assert controller._paused == ["Spotify"] assert controller._paused == ["Spotify"]
assert any("broken" in r.message for r in caplog.records) assert any("broken" in r.message for r in caplog.records)
@pytest.mark.asyncio
async def test_resume_with_empty_paused_list_is_noop(monkeypatch):
from whisper_local.media._smtc import SmtcController
controller = SmtcController()
controller._paused = []
ensure = AsyncMock()
monkeypatch.setattr(controller, "_ensure_manager", ensure)
await controller.resume()
ensure.assert_not_awaited()
@pytest.mark.asyncio
async def test_resume_plays_only_previously_paused(monkeypatch):
from whisper_local.media._smtc import SmtcController
spotify = _make_session("Spotify", PAUSED)
edge = _make_session("msedge", PAUSED)
controller = SmtcController()
controller._paused = ["Spotify"]
monkeypatch.setattr(
controller,
"_ensure_manager",
AsyncMock(return_value=_make_manager([spotify, edge])),
)
await controller.resume()
spotify.try_play_async.assert_awaited_once()
edge.try_play_async.assert_not_awaited()
assert controller._paused == []
@pytest.mark.asyncio
async def test_resume_skips_disappeared_session(monkeypatch, caplog):
from whisper_local.media._smtc import SmtcController
still_there = _make_session("Spotify", PAUSED)
controller = SmtcController()
controller._paused = ["gone_app", "Spotify"]
monkeypatch.setattr(
controller,
"_ensure_manager",
AsyncMock(return_value=_make_manager([still_there])),
)
with caplog.at_level("WARNING"):
await controller.resume()
still_there.try_play_async.assert_awaited_once()
assert controller._paused == []
assert any("gone_app" in r.message for r in caplog.records)
@pytest.mark.asyncio
async def test_resume_logs_and_continues_when_session_fails(monkeypatch, caplog):
from whisper_local.media._smtc import SmtcController
broken = _make_session("broken", PAUSED)
broken.try_play_async = AsyncMock(side_effect=RuntimeError("Verbindung verloren"))
good = _make_session("Spotify", PAUSED)
controller = SmtcController()
controller._paused = ["broken", "Spotify"]
monkeypatch.setattr(
controller,
"_ensure_manager",
AsyncMock(return_value=_make_manager([broken, good])),
)
with caplog.at_level("WARNING"):
await controller.resume()
good.try_play_async.assert_awaited_once()
assert controller._paused == []
assert any("broken" in r.message for r in caplog.records)
+24 -1
View File
@@ -67,4 +67,27 @@ class SmtcController:
self._paused = paused self._paused = paused
async def resume(self) -> None: async def resume(self) -> None:
pass if not self._paused:
return
try:
manager = await self._ensure_manager()
current = {
s.source_app_user_model_id: s for s in manager.get_sessions()
}
except Exception as e:
logger.warning("SMTC nicht erreichbar beim Fortsetzen: %s", e)
self._paused = []
return
to_resume = self._paused
self._paused = []
for aumid in to_resume:
session = current.get(aumid)
if session is None:
logger.warning(
"Session %s nicht mehr vorhanden, wird übersprungen", aumid
)
continue
try:
await session.try_play_async()
except Exception as e:
logger.warning("Konnte Session %s nicht fortsetzen: %s", aumid, e)