From a41cc38b7b180b167d29dbbcde3bfaf60ee61020 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Mon, 29 Jun 2026 01:36:34 +0100 Subject: [PATCH] fix(ui): deduplicate seek-blocked notification in video player Replace the per-handler boolean guard with a shared 300ms cooldown timestamp so all three Plyr seek-enforcement paths (progress-bar listener, seeking, seeked) produce at most one snackbar per skip attempt. --- .../media-player/players/plyr-player.svelte | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/ui/src/custom/media-player/players/plyr-player.svelte b/packages/ui/src/custom/media-player/players/plyr-player.svelte index d82e103f..61056adb 100644 --- a/packages/ui/src/custom/media-player/players/plyr-player.svelte +++ b/packages/ui/src/custom/media-player/players/plyr-player.svelte @@ -49,6 +49,9 @@ let youtubeInitGeneration = 0; const SEEK_TOLERANCE_SECONDS = 0.5; + const SEEK_BLOCK_COOLDOWN_MS = 300; + let seekBlockLastNotifiedAt = 0; + /** * Furthest watched position for the must-watch lock. Shared between the * progress-bar `seek` listener (set at Plyr construction) and the playback @@ -75,7 +78,11 @@ const targetSeconds = (Number(raw) / max) * duration; if (targetSeconds > seekLockFurthestSeconds + SEEK_TOLERANCE_SECONDS) { - policy.onSeekBlocked?.(); + const now = Date.now(); + if (now - seekBlockLastNotifiedAt >= SEEK_BLOCK_COOLDOWN_MS) { + seekBlockLastNotifiedAt = now; + policy.onSeekBlocked?.(); + } return false; } } @@ -118,7 +125,6 @@ let lastValidTime = element.currentTime; let isSeeking = false; let isReclamping = false; - let seekBlockNotified = false; let lastHeartbeatAt = 0; const heartbeatIntervalMs = 15_000; @@ -141,9 +147,10 @@ const isAheadOfLimit = () => player.currentTime > seekLockFurthestSeconds + SEEK_TOLERANCE_SECONDS; const notifySeekBlocked = () => { - if (seekBlockNotified) return; + const now = Date.now(); + if (now - seekBlockLastNotifiedAt < SEEK_BLOCK_COOLDOWN_MS) return; - seekBlockNotified = true; + seekBlockLastNotifiedAt = now; policy.onSeekBlocked?.(); }; @@ -164,7 +171,6 @@ if (isReclamping) { isReclamping = false; isSeeking = false; - seekBlockNotified = false; lastValidTime = player.currentTime; return; } @@ -177,7 +183,6 @@ } isSeeking = false; - seekBlockNotified = false; lastValidTime = player.currentTime; };