feat(media): MprisController fängt Player- und Bus-Fehler sauber ab

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-15 18:58:42 +02:00
parent f23ee1249d
commit b5d6ae6ecc
2 changed files with 99 additions and 14 deletions
+23 -14
View File
@@ -43,27 +43,36 @@ class MprisController:
"""Pausiert einen Player, wenn er im Status 'Playing' ist.
Gibt den Bus-Namen zurück, wenn pausiert wurde, sonst None.
"""
player = await self._get_player_interface(bus_name)
status = await player.get_playback_status()
if status != "Playing":
try:
player = await self._get_player_interface(bus_name)
status = await player.get_playback_status()
if status != "Playing":
return None
await player.call_pause()
return bus_name
except Exception as e:
logger.warning("Konnte Player %s nicht pausieren: %s", bus_name, e)
return None
await player.call_pause()
return bus_name
async def _resume_player(self, bus_name: str) -> None:
try:
player = await self._get_player_interface(bus_name)
await player.call_play()
except Exception as e:
logger.warning("Konnte Player %s nicht fortsetzen: %s", bus_name, e)
async def pause(self) -> None:
names = await self._list_player_names()
try:
names = await self._list_player_names()
except Exception as e:
logger.warning("D-Bus nicht erreichbar, überspringe Media-Pause: %s", e)
self._paused = []
return
results = await asyncio.gather(
*(self._pause_player(n) for n in names),
return_exceptions=True,
)
self._paused = [
name for name in results
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()
self._paused = [name for name in results if isinstance(name, str)]
async def resume(self) -> None:
if not self._paused: