Prosba uzytkownika (zgloszenie 17376139). Backend mial juz parametr `min_quality_p`, ale w praktyce byl NIEUZYWALNY i to zajelo wiekszosc pracy. Wydajnosc, mierzona na produkcji przez EXPLAIN ANALYZE, prog 1080p: EXISTS na playback_sources (stan zastany) 32 s 3 556 612 odwiedzonych scen + indeks funkcyjny per-scena 24 s JOIN z DISTINCT po jakosci 1,1 s W IZOLACJI ten sam JOIN + reszta filtrow feedu 52 s planer wraca do skanu po dacie kolumna scenes.max_quality_p (0029) 2,0-2,6 s + indeksy czesciowe pod progi (0030) 0,09-0,11 s Wniosek, ktory kosztowal najwiecej: ksztaltem zapytania sie tego NIE dalo zalatwic. Koszt to LICZBA odwiedzonych scen, nie pojedynczy test, a przy `ORDER BY created_at DESC LIMIT 24` planer i tak wracal do przechodzenia scen po dacie, gdy tylko doszly pozostale filtry (bramka wertykalow, heurystyka szkieletow, prog dlugosci). Stad denormalizacja + indeksy czesciowe z predykatem progu, ktore daja gotowe sortowanie. Semantyka SUROWA, swiadomie: `quality` zapisujemy oportunistycznie, zna ja 6,5% scen (210 302 z 3 236 368), najlepsze zrodlo ma 26% pokrycia. Wariant lagodny, przepuszczajacy sceny o nieznanej jakosci, odrzucony po zmierzeniu: odsiewalby 88 647 z 3,2 mln, czyli nie realizowalby intencji "nie chce ogladac ziemniaka". Filtr pokazuje wiec tylko jakosc POTWIERDZONA, a UI mowi to wprost podpisem pod przelacznikiem, bo inaczej gwaltowny spadek liczby wynikow wyglada na zepsuta aplikacje. Warianty tekstowe 4K/UHD usuniete z warunku: 0 wystapien na 238 452 zywe zrodla, a `OR ilike` blokowal uzycie indeksu. Odswiezanie w taxonomy_counts (co 3h), z czyszczeniem do NULL gdy scena traci zrodlo z jakoscia. Backfill: 210 302 sceny w 2m56s. Zweryfikowane na emulatorze: sekcja MIN QUALITY renderuje sie z podpisem ostrzegawczym. Lista wyszla pusta, ale to build debugowy dostajacy 403 (podpis debug spoza allowlisty), nie blad filtra: ten sam URL z poprawnym podpisem oddaje 50 wynikow w 0,12 s. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| 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