diff --git a/mobile/src/changelog.ts b/mobile/src/changelog.ts index dc87f51..660b6ab 100644 --- a/mobile/src/changelog.ts +++ b/mobile/src/changelog.ts @@ -35,6 +35,13 @@ export type ChangelogEntry = { }; export const CHANGELOG: ChangelogEntry[] = [ + { + id: '2026-10-02b', + date: 'October 2026', + items: [ + 'Galaxyporn: about half of the plays ended with "Playback failed". The app grabbed the address of an ad on the vikingfile page and tried to play it as the video. It now waits for the real file.', + ], + }, { id: '2026-10-02a', date: 'October 2026', diff --git a/mobile/src/screens/PlayerScreen.tsx b/mobile/src/screens/PlayerScreen.tsx index fd7dd01..848de04 100644 --- a/mobile/src/screens/PlayerScreen.tsx +++ b/mobile/src/screens/PlayerScreen.tsx @@ -1281,6 +1281,18 @@ const INJECTED_JS = ` // podsluchujemy POST zwracajacy bezposredni link. NICZEGO nie chowamy: pierwsza // wersja chowala oprawe strony i przy nierenderujacym sie widgecie zostawal // czarny ekran, gorzej niz przed zmiana. + // + // Host sprawdzamy NA POCZATKU i wychodzimy POZA blokiem try. Wczesniej wyjscie + // siedzialo w tym samym try co oswajanie strony, a skrypt rusza, zanim powstanie + // : appendChild na null rzucal, catch polykal blad i omijal return. Na + // vikingfile szedl wiec caly skrypt ponizej, a podsluch fetch bral zapytanie + // reklamy Adcash (adexchangerapid.com/...&cbtitle=.mp4) za film. + // Telemetria: ~155 bledow "None of the available extractors" i ~50 "adexchangerapid" + // tygodniowo, polowa odtworzen galaxyporn. Dowod z emulatora 2026-10-02. + var goonTurnstileHost = false; + try { + goonTurnstileHost = /vik[i1]ngfile\\.|playmogo\\.|dood|d0000d|dooood|do0od|do7go|ds2play|doply\\.|myvidplay\\./i.test(location.hostname); + } catch (e) {} try { if (/vik[i1]ngfile\\./i.test(location.hostname)) { // UWAGA: NIE chowamy tu reszty strony. Pierwsza wersja robila dokladnie to i user @@ -1288,6 +1300,12 @@ const INJECTED_JS = ` // wyrenderuje, na czarnym tle nie zostaje juz nic. Gorsze niz stan wyjsciowy. Teraz // tylko podswietlamy wlasciwe miejsce i przewijamy do niego, wiec najgorszy przypadek // to normalna strona hostera, czyli to, co user widzial przed ta zmiana. + var vkSent = false; + var vkSendUrl = function(u) { + if (vkSent || !/^https?:/i.test(u || '') || !window.ReactNativeWebView) return; + vkSent = true; + window.ReactNativeWebView.postMessage(JSON.stringify({ type: 'video_url', url: u })); + }; var vkCss = document.createElement('style'); vkCss.textContent = [ '#captcha-download{outline:2px solid #e05a6d!important;border-radius:10px!important;', @@ -1295,9 +1313,17 @@ const INJECTED_JS = ` '#goon-vk-hint{color:#e05a6d;font:600 15px system-ui,sans-serif;text-align:center;', 'padding:8px 0}', ].join(''); - (document.head || document.documentElement).appendChild(vkCss); var vkScrolled = false; var vkReady = function() { + // Styl dokladamy dopiero tutaj: na starcie skryptu nie ma jeszcze ani , + // ani (patrz komentarz przy goonTurnstileHost). + if (!vkCss.parentNode) { + var vkRoot = document.head || document.documentElement; + if (vkRoot) vkRoot.appendChild(vkCss); + } + // Zapas dla podsluchu nizej: strona sama wpisuje link do