From 3236a7cc1bc9370d57d88c5381ee019f8e537242 Mon Sep 17 00:00:00 2001 From: Aniket Tuli Date: Sat, 13 Jun 2026 19:50:49 -0700 Subject: [PATCH] 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 },