From d17423fa5bdadc11b4955717d9c7f788fb79d231 Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Sun, 2 Aug 2026 15:39:28 +0200 Subject: [PATCH] Fix autoplay countdown showing in repeat one queue mode When queue mode was set to repeat one, the "Playing in N seconds" countdown still appeared after a video ended, showing the next queued video - then restarting the current one anyway. The video-end path never consulted the queue mode; only playNext() did, after the countdown had already run. - PlayerService.backendDidFinishPlaying: restart immediately in repeat one mode, regardless of queue contents, player visibility, background, or PiP. This also fixes repeat one never looping with an empty queue. - ExpandedPlayerSheet.isAutoPlayEnabled: false in repeat one mode, which gates all countdown triggers (start on ended, overlay render, re-arm on appear) on iOS/macOS. - TVPlayerView.handleVideoEnded: early-return in repeat one mode so tvOS shows neither the countdown nor the replay controls. --- Yattee/Services/Player/PlayerService.swift | 9 +++++++++ Yattee/Views/Player/ExpandedPlayerSheet.swift | 3 ++- Yattee/Views/Player/tvOS/TVPlayerView.swift | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Yattee/Services/Player/PlayerService.swift b/Yattee/Services/Player/PlayerService.swift index 96fb07a7..7933010a 100644 --- a/Yattee/Services/Player/PlayerService.swift +++ b/Yattee/Services/Player/PlayerService.swift @@ -3126,6 +3126,15 @@ extension PlayerService: PlayerBackendDelegate { saveProgressAsCompleted() delegate?.playerServiceDidFinishPlaying(self) + // Repeat one: restart immediately - no countdown, independent of queue contents + // and the auto-play-next setting (that setting governs advancing to the next video) + if state.queueMode == .repeatOne { + Task { + await playNext() + } + return + } + // Auto-play immediately if player is not visible (no point showing countdown) // UI (ExpandedPlayerSheet) will handle countdown when player is visible let autoPlayEnabled = settingsManager?.queueAutoPlayNext ?? true diff --git a/Yattee/Views/Player/ExpandedPlayerSheet.swift b/Yattee/Views/Player/ExpandedPlayerSheet.swift index 9f45899b..80432a2c 100644 --- a/Yattee/Views/Player/ExpandedPlayerSheet.swift +++ b/Yattee/Views/Player/ExpandedPlayerSheet.swift @@ -134,7 +134,8 @@ struct ExpandedPlayerSheet: View { var isAutoPlayEnabled: Bool { (appEnvironment?.settingsManager.queueEnabled ?? true) && - (appEnvironment?.settingsManager.queueAutoPlayNext ?? true) + (appEnvironment?.settingsManager.queueAutoPlayNext ?? true) && + playerState?.queueMode != .repeatOne } var autoPlayCountdownDuration: Int { diff --git a/Yattee/Views/Player/tvOS/TVPlayerView.swift b/Yattee/Views/Player/tvOS/TVPlayerView.swift index 120c6652..1d24693c 100644 --- a/Yattee/Views/Player/tvOS/TVPlayerView.swift +++ b/Yattee/Views/Player/tvOS/TVPlayerView.swift @@ -1046,6 +1046,11 @@ struct TVPlayerView: View { controlsVisible = false } + // Repeat one: PlayerService restarts the video itself - no countdown, no replay controls + if playerState?.queueMode == .repeatOne { + return + } + // Check if autoplay is enabled and there's a next video let autoPlayEnabled = appEnvironment?.settingsManager.queueAutoPlayNext ?? true let hasNextVideo = playerState?.hasNext ?? false