From 7cf338f812fe35076d4c119554ec1762c34419f6 Mon Sep 17 00:00:00 2001 From: goon-foss Date: Wed, 1 Jul 2026 10:37:19 +0200 Subject: [PATCH] fix(mobile): no false "Mark broken" while a video is still recovering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit eporner/sxyprn/fpoxxx resolve phone-side; the native player errors on initial load, then re-resolve swaps in a fresh URL ~1-3s later and plays fine — but the terminal error overlay with "Mark broken" rendered during that gap (report dafa8cdb). Added a recoveryPending flag (mirrors the telemetry's fallback-aware logic: re-resolve / in-place seek recovery / proxy / webview still in flight) that shows a "Reconnecting…" spinner instead, and only surfaces the terminal error + Mark broken when nothing is left to try. Co-Authored-By: Claude Opus 4.8 (1M context) --- mobile/src/screens/PlayerScreen.tsx | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/mobile/src/screens/PlayerScreen.tsx b/mobile/src/screens/PlayerScreen.tsx index f323269..efd2408 100644 --- a/mobile/src/screens/PlayerScreen.tsx +++ b/mobile/src/screens/PlayerScreen.tsx @@ -698,6 +698,18 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) { ? panSeekTarget : position; + // Czy jest jeszcze JAKAKOLWIEK ścieżka ratunku w toku? Gdy tak — NIE pokazuj + // terminalnego błędu z „Mark broken", bo za chwilę zagra (report dafa8cdb: eporner/ + // sxyprn/fpoxxx native pada na starcie, re-resolve podmienia URL ~1-3s później i gra; + // przez tę chwilę migało „Playback failed / Mark broken"). Lustro logiki telemetrii: + // re-resolve IP-bound, in-place seek-recovery, proxy albo WebView jeszcze nie próbowane. + const recoveryPending = + status === 'error' && + ((!!resolvePageUrl && !reResolveDone && !loadedOnceRef.current) || + (loadedOnceRef.current && seekRecoveryRef.current < 2 && !isGoneError(playerError?.message)) || + (!!fallbackProxyUrl && !didFallbackProxyRef.current && url !== fallbackProxyUrl) || + (!!fallbackEmbedUrl && !didFallbackWebViewRef.current)); + return ( {/* Hidden status bar — full-bleed video w landscape bez 24px paska systemu. */} @@ -817,7 +829,7 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) { {title ?? 'Loading…'} )} - {status === 'error' && !fallbackEmbedUrl && ( + {status === 'error' && !recoveryPending && ( {isGoneError(playerError?.message) ? 'Source no longer available' : 'Playback failed'} @@ -839,10 +851,14 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) { )} - {status === 'error' && fallbackEmbedUrl && ( + {recoveryPending && ( - Native player failed — switching to embed… + + {fallbackEmbedUrl && !didFallbackWebViewRef.current + ? 'Native player failed — switching to embed…' + : 'Reconnecting…'} + )}