Fix timer finished sound not looping

Check if player is actually playing before calling stop(for_replacement=True)
in MpvMediaPlayer.play(). When the player was already idle,
stop(for_replacement=True) would set _suppress_end_event=True with no
end-file event to consume it. The next track's end-file callback would
then be incorrectly suppressed, breaking the timer loop.

- Import PlayerState to check player state
- Only call stop(for_replacement=True) when player is not IDLE
This commit is contained in:
Ethan Kiczek committed 2026-02-18 18:13:51 -05:00
1 parent cf5494642e
commit 3834f51179
1 file changed
+10 -9
+10 -9
View File
@@ -3,6 +3,7 @@ import logging
from typing import Union, List, Callable, Optional
from .player.libmpv import LibMpvPlayer
from .player.state import PlayerState
class MpvMediaPlayer:
@@ -39,13 +40,13 @@ class MpvMediaPlayer:
self._log.debug("Received URL list, using first entry")
url = url[0]
# Track is changing
# Track is changing - only stop for replacement if actually playing
if self._done_callback is not None:
self._log.debug(
"Stopping active playback before starting new media"
)
# Not self.stop() → this would call done_callback
self._player.stop(for_replacement=True)
if self._player.state() != PlayerState.IDLE:
self._log.debug(
"Stopping active playback before starting new media"
)
self._player.stop(for_replacement=True)
self._done_callback = None
self._log.info("Playing media: %s", url)
@@ -87,7 +88,7 @@ class MpvMediaPlayer:
Set playback volume.
Args:
volume: Volume in percent (0.0–100.0).
volume: Volume in percent (0.0-100.0).
"""
self._log.debug("set_volume(volume=%.2f)", volume)
self._player.set_volume(volume)
@@ -97,7 +98,7 @@ class MpvMediaPlayer:
Temporarily reduce volume.
Args:
factor: Volume multiplier (0.0–1.0).
factor: Volume multiplier (0.0-1.0).
"""
self._log.debug("duck(factor=%.2f)", factor)
self._player.duck(factor)
@@ -105,4 +106,4 @@ class MpvMediaPlayer:
def unduck(self) -> None:
"""Restore volume after ducking."""
self._log.debug("unduck() called")
self._player.unduck()
self._player.unduck()