From 3236a7cc1bc9370d57d88c5381ee019f8e537242 Mon Sep 17 00:00:00 2001 From: Aniket Tuli Date: Sat, 13 Jun 2026 19:50:49 -0700 Subject: [PATCH 1/2] fix(player): clamp skip-outro seekTo against actual duration Prevents a Long overflow when the last AnimSkip segment carries Double.MAX_VALUE as its endTime sentinel. The seek target is now capped to playbackSnapshot.durationMs so ExoPlayer always receives a valid millisecond position. Co-Authored-By: Claude Sonnet 4.6 --- .../com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt index bd6446fb0..4a39312b6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt @@ -333,7 +333,10 @@ private fun BoxScope.RenderPlaybackOverlays( skipIntervalDismissed = skipIntervalDismissed, controlsVisible = controlsVisible, onSkipInterval = { interval -> - playerController?.seekTo((interval.endTime * 1000).toLong()) + val rawMs = (interval.endTime * 1000.0).toLong() + val durationMs = playbackSnapshot.durationMs + val seekMs = if (durationMs > 0L) rawMs.coerceAtMost(durationMs) else rawMs + playerController?.seekTo(seekMs) scheduleProgressSyncAfterSeek() skipIntervalDismissed = true }, From 31420a88bf26c455543bf862da68fb0636b38e4e Mon Sep 17 00:00:00 2001 From: Aniket Tuli Date: Sun, 14 Jun 2026 21:10:56 -0700 Subject: [PATCH 2/2] fix(player): clamp skip-outro seek below the duration boundary --- .../com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt index 4a39312b6..9bd018caa 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeUi.kt @@ -335,7 +335,7 @@ private fun BoxScope.RenderPlaybackOverlays( onSkipInterval = { interval -> val rawMs = (interval.endTime * 1000.0).toLong() val durationMs = playbackSnapshot.durationMs - val seekMs = if (durationMs > 0L) rawMs.coerceAtMost(durationMs) else rawMs + val seekMs = if (durationMs > 0L) rawMs.coerceAtMost(durationMs - 1) else rawMs playerController?.seekTo(seekMs) scheduleProgressSyncAfterSeek() skipIntervalDismissed = true