fix(player): myvidplay/playmogo/doply graja natywnie, bez WebView
Some checks are pending
Backend tests / test (push) Waiting to run

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 <noreply@anthropic.com>
This commit is contained in:
goon-foss 2026-10-02 11:30:51 +02:00
parent 8753243e15
commit 617dda0bbe
4 changed files with 47 additions and 4 deletions

View file

@ -215,6 +215,9 @@ def run_source_stats() -> dict:
FILTER (WHERE status='success' AND ttff_ms IS NOT NULL) AS p50_ttff FILTER (WHERE status='success' AND ttff_ms IS NOT NULL) AS p50_ttff
FROM playback_events FROM playback_events
WHERE created_at > :win 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 GROUP BY origin
""" """
), ),

View file

@ -35,6 +35,16 @@ export type ChangelogEntry = {
}; };
export const CHANGELOG: 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', id: '2026-09-17b',
date: 'September 2026', date: 'September 2026',

View file

@ -174,13 +174,23 @@ async function _continueAfterFetch(
// pass_md5, a CDN oddaje jakiś plik, więc bez tej detekcji resolver uznaje usunięte // 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. // 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. // `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` (<div class="... d-none"><img src=".../no_video_3.svg"><h1>Not Found</h1>).
// 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 _low = html.toLowerCase();
const notFoundHidden = /class="[^"]*\bd-none\b[^"]*"\s*>\s*<img[^>]*no_video_/i.test(html);
const titleNotFound = /<title>[^<]*not found/i.test(html);
if ( if (
_low.includes('video not found') || titleNotFound ||
_low.includes('is not found') ||
_low.includes('no_video_') ||
_low.includes('video has been deleted') || _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' }; return { error: 'video_deleted' };
} }

View file

@ -1940,6 +1940,26 @@ function EmbedWebViewPlayer({ params }: { params: RouteParams }) {
setResolveStatus('idle'); setResolveStatus('idle');
setResolveError(result.error || 'unknown'); setResolveError(result.error || 'unknown');
setSkipResolve(true); 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]); }, [url, refererHost, sceneId, durationSec, resolveAttempted, skipResolve, nav]);