Zgloszenie Jana: myvidplay i easyvidplayer na filmach dalej nie dzialaly, mimo wczorajszych poprawek backendu. Backend byl OK, sprawdzone na zywo: myvidplay resolwuje sie teraz na playmogo.com, a easyvidplayer oddaje 410 i znika z listy. Problem byl PO STRONIE APLIKACJI. Playmogo (tam laduja myvidplay i doply) zmienil zabezpieczenie. Nasza notatka mowila, ze to niewidzialny Turnstile przechodzacy automatycznie. To juz NIEPRAWDA: ich strona wola turnstile.render z size flexible, czyli WIDOCZNY widget, i to dopiero po kliknieciu w przycisk play, a po weryfikacji przeladowuje strone i dopiero wtedy pojawia sie pass_md5. Nasz wstrzykiwany skrypt psul dokladnie ten przeplyw. Widget siedzi w kontenerze o klasie captcha-player z z-index 100000, czyli w tym, co nasz usuwacz nakladek traktuje jak reklame, a nasze auto-klikniecie w plakat odpalalo brame, zanim widget zdazyl sie wyrenderowac. Do tego patchujemy prototypy HTMLMediaElement, co Turnstile potrafi uznac za podejrzane srodowisko (dokladnie ten sam objaw mielismy na vikingfile). Straz, ktora dotad obejmowala tylko vikingfile, obejmuje teraz cala rodzine bramkowana Cloudflare. Na stronie pliku i tak nie potrzebujemy ani wyciszania autoplay, ani ad-blocka. Pulapka po drodze, warta zapamietania: komentarz z backtickami wewnatrz literalu szablonowego INJECTED_JS przerywa ten literal i wywala parsowanie calego pliku. Zweryfikowane: regex po rozwinieciu szablonu pomija playmogo/myvidplay/doply/vikingfile/ d0000d/ds2play, a zostawia dzialajacy skrypt na galaxyporn, sxyprn i eporner; podobnie brzmiacy goodplay.com sie nie lapie. Typecheck wrocil do bazowych 11 bledow. NIE mam na to dowodu z urzadzenia: przejscie Turnstile trzeba potwierdzic na telefonie. |
||
|---|---|---|
| .. | ||
| android | ||
| assets | ||
| src | ||
| .gitignore | ||
| app.json | ||
| App.tsx | ||
| babel.config.js | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
goon mobile (Expo / React Native)
Mobile client do self-hosted goon backendu. iOS/Android jeden codebase.
Setup
cd mobile
npm install
npx expo start
Następnie:
- Expo Go (iOS/Android): zeskanuj QR z terminala
- Android emulator:
npm run android - iOS simulator:
npm run ios(tylko macOS) - Web preview:
npm run web
Konfiguracja
Po pierwszym uruchomieniu zobaczysz ekran logowania:
- Backend URL — adres twojego goon backendu, np.:
http://192.168.1.10:8000(LAN)https://goon.tvojadomena.dev(przez Cloudflare Tunnel/Caddy)http://100.x.x.x:8000(przez Tailscale)
- API Key — klucz wygenerowany dla backendu, ustawiony w
.env:
Generowanie:API_KEYS=<klucz>python -c "import secrets; print(secrets.token_urlsafe(32))"
Klucz jest trzymany w expo-secure-store (Keychain na iOS, Keystore na Androidzie).
Ekrany
- Login — backend URL + API key, weryfikacja przez
/healthz+/scenes - Scenes — lista scen z search; pull-to-refresh
- Scene detail — performerzy, tagi, źródła, opis
- Merge queue — pending merge candidates, sortowane po score (desc)
- Merge detail — side-by-side dwóch scen + reasons + akcje:
- Merge → keep LEFT (default — left to wcześniejsza/kanoniczna)
- Merge → keep RIGHT (gdy nowsza wersja ma lepsze metadane)
- Reject (keep both) — to nie jest duplikat, zostawiamy oddzielnie
Stack
- Expo SDK 52 + React Native 0.76 (new architecture)
- TypeScript strict
- React Navigation 7 (native stack)
- TanStack Query 5 (cache, optimistic invalidation)
- expo-secure-store (credentials)
Build .apk (sideload na Androida)
npx eas build --profile preview --platform android
Wymaga konta Expo. Bez niego można użyć expo prebuild + gradlew assembleRelease.
Dlaczego nie PWA
Wybrany RN+Expo zamiast PWA bo:
- swipe gestures pasują do triage merge queue
- secure-store jest natywny (Keychain/Keystore) zamiast localStorage
- pull-to-refresh i FlatList virtualization out-of-the-box
- Jeden .apk można rozdać testerom bez App Store