fix(player): myvidplay/playmogo/doply graja natywnie, bez WebView
Some checks are pending
Backend tests / test (push) Waiting to run
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:
parent
8753243e15
commit
617dda0bbe
4 changed files with 47 additions and 4 deletions
|
|
@ -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
|
||||||
"""
|
"""
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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' };
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue