From 88b3ca4992e8278e1d43dbe5cc7607d4890c0eda Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Tue, 26 Dec 2023 00:46:20 +0400
Subject: [PATCH] fix(YouTube - SponsorBlock): Do not auto skip end segments
 more than once if using a slow playback speed

---
 .../SegmentPlaybackController.java            | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/app/src/main/java/app/revanced/integrations/sponsorblock/SegmentPlaybackController.java b/app/src/main/java/app/revanced/integrations/sponsorblock/SegmentPlaybackController.java
index ba214009..c8edbdfc 100644
--- a/app/src/main/java/app/revanced/integrations/sponsorblock/SegmentPlaybackController.java
+++ b/app/src/main/java/app/revanced/integrations/sponsorblock/SegmentPlaybackController.java
@@ -510,15 +510,18 @@ public class SegmentPlaybackController {
             SponsorBlockViewController.hideSkipHighlightButton();
             SponsorBlockViewController.hideSkipSegmentButton();
 
-            // If trying to seek to end of the video, YouTube can seek just before of the actual end.
-            // (especially if the video does not end on a whole second boundary).
-            // This causes additional segment skip attempts, even though it cannot seek any closer to the desired time.
-            // Check for and ignore repeated skip attempts of the same segment over a small time period.
             final long now = System.currentTimeMillis();
-            final long minimumMillisecondsBetweenSkippingSameSegment = 500;
-            if ((lastSegmentSkipped == segmentToSkip) && (now - lastSegmentSkippedTime < minimumMillisecondsBetweenSkippingSameSegment)) {
-                LogHelper.printDebug(() -> "Ignoring skip segment request (already skipped as close as possible): " + segmentToSkip);
-                return;
+            if (lastSegmentSkipped == segmentToSkip) {
+                // If trying to seek to end of the video, YouTube can seek just before of the actual end.
+                // (especially if the video does not end on a whole second boundary).
+                // This causes additional segment skip attempts, even though it cannot seek any closer to the desired time.
+                // Check for and ignore repeated skip attempts of the same segment over a small time period.
+                final long minTimeBetweenSkippingSameSegment = Math.max(500,
+                        (long) (500 / VideoInformation.getPlaybackSpeed()));
+                if (now - lastSegmentSkippedTime < minTimeBetweenSkippingSameSegment) {
+                    LogHelper.printDebug(() -> "Ignoring skip segment request (already skipped as close as possible): " + segmentToSkip);
+                    return;
+                }
             }
 
             LogHelper.printDebug(() -> "Skipping segment: " + segmentToSkip);