fix(listy): prog dlugosci nie ukrywa juz scen o NIEZNANEJ dlugosci w drill-downach

Zgloszenia 2026-08-20 ("hentaimama dalej 0 scen", "porndish zaprzestal ingestu",
"czemu sexu ma tylko 38 scen"). Trzy razy ten sam pierwotny powod, i to NIE ingest.

`api.ts` doklejal `min_duration_sec=60` do KAZDEGO listScenes bez wlasnej wartosci.
W SQL `duration_sec >= 60` jest nieprawda takze dla NULL, wiec prog wycinal nie tylko
krotkie sceny, ale wszystkie o NIEZNANEJ dlugosci. Zmierzone na produkcji:

  supjav, hentaigasm, hentaimama, hentaiplay, javflix, xanimeporn   100% NULL
  xhamster 90,3% (360 709)   porndish 88,9% (37 736)   porntrex 76,8% (616 345)
  latestpornvideo 68,4%      xnxx 65,2% (226 217)      xvideos 63,8% (258 711)

Czyli wejscie w konkretny serwis ukrywalo ponad 1,5 mln scen i wygladalo jak martwy
albo zatrzymany tube. Ekrany drill-down (SiteScenes, PerformerScenes, StudioScenes,
TagScenes) przekazuja teraz 0: user wszedl JAWNIE w te pozycje, wiec ma zobaczyc jej
zawartosc. Glowny feed zostaje z progiem 60s, bo tam chroni przed teaserami.

Zweryfikowane na produkcji: hentaimama / supjav / xanimeporn 0 -> 50 pozycji.

Pulapka NULL opisana w api.ts, zeby ktos nie "uproscil" tego z powrotem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
goon-foss 2026-08-20 10:07:58 +02:00
parent 20c04698b1
commit ae3c4ac9bb
6 changed files with 31 additions and 0 deletions

View file

@ -134,6 +134,14 @@ export class GoonClient {
// "Takie sceny po 1 min to można wywalić". Pornapp/freshporno czasem
// zassuje teasery/trailery 30-50s, które są bezużyteczne na listach.
// Caller może override przez explicit 0 (lub null), np. admin browse.
//
// UWAGA, drugie dno: w SQL `duration_sec >= 60` jest NIEPRAWDĄ dla NULL, więc ten
// próg wycina też sceny o NIEZNANEJ długości, a nie tylko krótkie. Dla głównego
// feedu to akceptowalne, ale przy wejściu w KONKRETNY serwis/performera/tag ukrywał
// ogromne części katalogu i wyglądał jak zatrzymany ingest (zgłoszenia 2026-08-20:
// hentaimama 0 scen, porndish "zaprzestał ingestu"). Pomiar: 100% scen supjav,
// hentaigasm, hentaimama, hentaiplay, javflix i xanimeporn ma duration NULL, do tego
// xhamster 90%, porndish 89%, porntrex 77%. Ekrany drill-down przekazują więc 0.
const minDur = params.min_duration_sec ?? 60;
if (minDur > 0) qs.set('min_duration_sec', String(minDur));
if (params.max_duration_sec !== undefined)

View file

@ -16,6 +16,13 @@ export type ChangelogEntry = {
};
export const CHANGELOG: ChangelogEntry[] = [
{
id: '2026-08-20',
date: 'August 2026',
items: [
'Sites, performers, studios and tags were hiding a large part of the catalogue. The "minimum length" rule was also dropping every scene whose length we simply do not know, which is most of them on some sites: hentaimama, supjav, hentaigasm, hentaiplay, javflix and xanimeporn showed nothing at all, and xhamster, porndish and porntrex showed a fraction. Opening one of those now shows everything it has.',
],
},
{
id: '2026-08-18i',
date: 'August 2026',

View file

@ -148,6 +148,10 @@ export function PerformerScenesScreen() {
client.listScenes({
performer_ids: [id],
vertical: vertical ?? undefined,
// 0 = nie nakładaj progu długości. User wszedł JAWNIE w tę pozycję, więc
// ukrywanie scen o nieznanej długości (w SQL NULL nie przechodzi `>= 60`)
// wyglądało jak pusty albo zatrzymany serwis. Patrz komentarz w api.ts.
min_duration_sec: 0,
tags: selectedTag ? [selectedTag.slug] : undefined,
sort: 'release_date',
per_page: 200,

View file

@ -64,6 +64,10 @@ export function SiteScenesScreen() {
origin,
tags: selectedTags.length > 0 ? selectedTags : undefined,
sort: 'release_date',
// 0 = nie nakładaj progu długości. User wszedł JAWNIE w tę pozycję, więc
// ukrywanie scen o nieznanej długości (w SQL NULL nie przechodzi `>= 60`)
// wyglądało jak pusty albo zatrzymany serwis. Patrz komentarz w api.ts.
min_duration_sec: 0,
page: pageParam,
per_page: PER_PAGE,
}),

View file

@ -125,6 +125,10 @@ export function StudioScenesScreen() {
client.listScenes({
studio_slugs: [slug],
vertical: vertical ?? undefined,
// 0 = nie nakładaj progu długości. User wszedł JAWNIE w tę pozycję, więc
// ukrywanie scen o nieznanej długości (w SQL NULL nie przechodzi `>= 60`)
// wyglądało jak pusty albo zatrzymany serwis. Patrz komentarz w api.ts.
min_duration_sec: 0,
sort: 'release_date',
per_page: 200,
has_playback: true,

View file

@ -35,6 +35,10 @@ export function TagScenesScreen() {
queryFn: () =>
client.listScenes({
tags: [slug],
// 0 = nie nakładaj progu długości. User wszedł JAWNIE w tę pozycję, więc
// ukrywanie scen o nieznanej długości (w SQL NULL nie przechodzi `>= 60`)
// wyglądało jak pusty albo zatrzymany serwis. Patrz komentarz w api.ts.
min_duration_sec: 0,
// Wertykał przyniesiony ze sceny. Bez niego backend wycina wszystkie sekcje
// poboczne, więc tag kliknięty w anime pokazywał sceny spoza anime (e9de414c).
vertical: vertical ?? undefined,