From 617dda0bbe3cfd4f7d0893169b3ab6fc49689587 Mon Sep 17 00:00:00 2001 From: goon-foss Date: Fri, 2 Oct 2026 11:30:51 +0200 Subject: [PATCH] fix(player): myvidplay/playmogo/doply graja natywnie, bez WebView Szablon playera playmogo zawsze zawiera ukryty (d-none) blok "Not Found", a resolver bral te slowa za usuniety film i poddawal sie od razu, wiec cala rodzina DoodStream szla do WebView z klikanym Cloudflare. pass_md5 jest w HTML, a adres gra bez weryfikacji. Teraz usuniety = tytul "not found" albo widoczny blok. Sprawdzone na emulatorze: ExoPlayer, ttff 4,2 s, postep rosnie. Bledy cichego resolvera ida do telemetrii (error_kind 'resolver'), poza ocena zrodel. Wpis changelogu dla OTA d5906704. Co-Authored-By: Claude Opus 5.5 --- app/scheduler/source_stats.py | 3 +++ mobile/src/changelog.ts | 10 ++++++++++ mobile/src/lib/doodstream.ts | 18 ++++++++++++++---- mobile/src/screens/PlayerScreen.tsx | 20 ++++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/app/scheduler/source_stats.py b/app/scheduler/source_stats.py index 817b4a6..9fbb01b 100644 --- a/app/scheduler/source_stats.py +++ b/app/scheduler/source_stats.py @@ -215,6 +215,9 @@ def run_source_stats() -> dict: FILTER (WHERE status='success' AND ttff_ms IS NOT NULL) AS p50_ttff FROM playback_events WHERE created_at > :win + -- cichy resolver w apce (np. DoodStream) pada, a WebView moze jeszcze + -- zagrac, wiec to nie jest porazka zrodla + AND error_kind IS DISTINCT FROM 'resolver' GROUP BY origin """ ), diff --git a/mobile/src/changelog.ts b/mobile/src/changelog.ts index 1ddaf4a..dc87f51 100644 --- a/mobile/src/changelog.ts +++ b/mobile/src/changelog.ts @@ -35,6 +35,16 @@ export type ChangelogEntry = { }; export const CHANGELOG: ChangelogEntry[] = [ + { + id: '2026-10-02a', + date: 'October 2026', + items: [ + 'Favorites: performers and studios with something new are listed first, and the badge says how many new scenes and how many new movies there are, instead of one number for both.', + 'Edge: a clip its creator deleted no longer leaves you on a black screen. The app skips to the next one and the clip is taken out of the feed for everyone. On a creator page the grid loads smaller previews, so it fills in faster.', + 'Movies on myvidplay, playmogo and doply: the app took every one of them for a deleted video, because the host page always carries a hidden "not found" block. It now tries the direct stream first and only falls back to the web page when that fails.', + 'A certificate error from a host is no longer reported as a deleted video, and the app no longer gets stuck when the phone fails to save its device key.', + ], + }, { id: '2026-09-17b', date: 'September 2026', diff --git a/mobile/src/lib/doodstream.ts b/mobile/src/lib/doodstream.ts index 0494333..b4ea3f1 100644 --- a/mobile/src/lib/doodstream.ts +++ b/mobile/src/lib/doodstream.ts @@ -174,13 +174,23 @@ async function _continueAfterFetch( // pass_md5, a CDN oddaje jakiś plik, więc bez tej detekcji resolver uznaje usunięte // wideo za sukces i user dostaje placeholder albo "Source error" z ExoPlayera. // `no_video_` to obrazek-zaślepka (i.doodcdn.io/img/no_video_3.svg), najpewniejszy marker. + // + // 2026-10-02: szablon playera playmogo ma ten sam blok „Not Found" ZAWSZE, tylko ukryty + // klasa `d-none` (

Not Found

). + // Stare sprawdzanie samych slow uznawalo wiec KAZDY film za usuniety, resolver poddawal + // sie od razu i cala rodzina (myvidplay, playmogo, doply) szla do WebView z klikanym + // Cloudflare, choc pass_md5 jest w HTML, a adres gra bez zadnej weryfikacji (206 + // video/mp4, sprawdzone z IP domowego). Naprawde usuniety film ma tytul „Video not + // found", blok bez `d-none` i nie ma pass_md5. const _low = html.toLowerCase(); + const notFoundHidden = /class="[^"]*\bd-none\b[^"]*"\s*>\s*]*no_video_/i.test(html); + const titleNotFound = /[^<]*not found/i.test(html); if ( - _low.includes('video not found') || - _low.includes('is not found') || - _low.includes('no_video_') || + titleNotFound || _low.includes('video has been deleted') || - _low.includes('file was deleted') + _low.includes('file was deleted') || + (!notFoundHidden && + (_low.includes('video not found') || _low.includes('is not found') || _low.includes('no_video_'))) ) { return { error: 'video_deleted' }; } diff --git a/mobile/src/screens/PlayerScreen.tsx b/mobile/src/screens/PlayerScreen.tsx index 3cf2f82..fd7dd01 100644 --- a/mobile/src/screens/PlayerScreen.tsx +++ b/mobile/src/screens/PlayerScreen.tsx @@ -1940,6 +1940,26 @@ function EmbedWebViewPlayer({ params }: { params: RouteParams }) { setResolveStatus('idle'); setResolveError(result.error || 'unknown'); setSkipResolve(true); + // Bez tego nie bylo wiadomo, czemu cichy resolver pada: ekran od razu przechodzi + // do WebView i blad znikal. myvidplay/playmogo przez miesiac szly do WebView, bo + // resolver bral ukryty szablon „Not Found" za usuniety film (2026-10-02). + // error_kind 'resolver' nie wchodzi do oceny zrodel (source_stats), bo WebView + // moze ten film jeszcze odtworzyc. + if (params.origin) { + let host = ''; + try { + host = new URL(url).hostname; + } catch { + host = ''; + } + client.reportPlaybackEvent({ + origin: params.origin, + status: 'error', + scene_id: sceneId, + error_kind: 'resolver', + error_detail: `${host}: ${result.error || 'unknown'}`.slice(0, 512), + }); + } } })(); }, [url, refererHost, sceneId, durationSec, resolveAttempted, skipResolve, nav]);