diff --git a/app/api/stream_proxy.py b/app/api/stream_proxy.py index b41b349..2bef574 100644 --- a/app/api/stream_proxy.py +++ b/app/api/stream_proxy.py @@ -761,6 +761,20 @@ async def proxy_hls_manifest(token: str, _basename: str) -> Response: raise HTTPException(status_code=502, detail="manifest fetch failed") from e if r.status_code >= 400: return _upstream_error_response(r.status_code, dict(r.headers), target) + + # Hoster potrafi oddac 200 z trescia, ktora manifestem NIE jest (strona bledu albo + # reklama zamiast playlisty). Bez tej kontroli przepuszczalismy takie cos dalej jako + # `application/vnd.apple.mpegurl` ze statusem 200, a odtwarzacz konczyl komunikatem + # "Input does not start with the #EXTM3U header" (perverzija, 203 zdarzenia/14 dni). + # Gorsze od samego bledu bylo to, ze przy statusie 200 apka uznawala odpowiedz za + # dobra i nie probowala odswiezyc zrodla. Oddajemy 502, zeby wlaczyla sie normalna + # sciezka ponowienia. + if not r.text.lstrip(" \t\r\n").startswith("#EXTM3U"): + log.info( + "proxy-hls: odpowiedz 200 nie jest manifestem (%dB) dla %s", len(r.content), target + ) + raise HTTPException(status_code=502, detail="upstream returned non-manifest body") + rewritten = _absolutize_m3u8(r.text, base_url=str(r.url)) return Response( content=rewritten, diff --git a/mobile/src/screens/PlayerScreen.tsx b/mobile/src/screens/PlayerScreen.tsx index d9a60f3..aebfc16 100644 --- a/mobile/src/screens/PlayerScreen.tsx +++ b/mobile/src/screens/PlayerScreen.tsx @@ -394,7 +394,18 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) { // pojedynczy reset od razu spychał na WebView, który ładował zdławioną stronę tube'a // (stąd 502/429 w zgłoszeniu). Re-resolve otwiera świeże połączenie na tym samym URL-u, // co ratuje transient reset, a gate wstrzymuje WebView-fallback póki nie skończy. - const BACKEND_RERESOLVE_ORIGINS = ['tube:watchporn', 'tube:galaxyporncom', 'tube:naughtymachinima']; + // 8kporner i perverzija dopisane 2026-08-27: ten sam objaw co watchporn, czyli zapisany + // adres wietrzeje. Sprawdzone na scenach, ktore realnie padly u userow: stary adres dawal + // 502/400, a swiezy resolve tych samych czterech scen oddal 206 z trescia. Przy perverzija + // dochodzi manifest, ktory przestaje byc manifestem, i to teraz konczy sie 502 z proxy + // zamiast cichego 200, wiec ponowienie ma na czym zadzialac. + const BACKEND_RERESOLVE_ORIGINS = [ + 'tube:watchporn', + 'tube:galaxyporncom', + 'tube:naughtymachinima', + 'tube:8kpornercom', + 'tube:perverzijacom', + ]; const canBackendReresolve = !!sceneId && !!params.playbackId && BACKEND_RERESOLVE_ORIGINS.includes(playOrigin ?? ''); // Seek/decode recovery (bug f6c86847: doply/playmogo „invalid NAL length” przy