fix(thumbs): degraduj chwiejne hosty miniaturek zamiast zerowac

Zgloszenie "Jakis problem z miniaturkami z fullporner" (36c33200).
fullporner NIE jest winowajca: pomiar 2026-08-13 dal 40/40 poprawnych
JPEG-ow i 0 z 68 414 zrodel bez URL-a. Winna byla KOLEJNOSC WYBORU.

Miniaturke wygrywal pierwszy origin alfabetycznie, a `tube:fullmoviesxxx`
sortuje sie PRZED `tube:fullporner`, wiec chwiejny host przykrywal zdrowy.
Pomiar (20-25 losowych URL-i na host):

    img.fullmovies.xxx    12/20 ok  (5x ReadTimeout, 3x 502)  54 019 zrodel
    img.hdporn.gg         16/20 ok  (3x 502, 1x ReadTimeout)  54 267 zrodel
    imgs.xiaoshenke.net   20/20 ok  (fullporner)              68 406 zrodel
    freshporno.org        20/20 ok

Nowy predykat `_is_flaky_thumb`: degraduje do tieru fallback w LISCIE, ale
w odroznieniu od `_is_rotting_thumb` NIE zeruje w SceneDetail. Zerowanie
powtorzyloby wpadke z sierpnia, gdzie sceny majace tylko fullporner
tracily obrazek calkowicie.

Dwie iteracje, obie z pomiaru, nie z zalozenia:

1. Degradacja samego fullmovies przesunela wybor na hdporn (44 z 60),
   czyli PRZENIOSLA problem. Stad hdporn dopisany.
2. Po zdegradowaniu obu fullmovies WROCIL (38 z 60): sceny majace tylko
   te dwa hosty laduja w fallbacku, a `setdefault` bral pierwszy
   alfabetycznie, czyli gorszy z dwoch. Stad `_FLAKY_RANK` — w obrebie
   fallbacku wybieramy mniejsze zlo.

Po zmianie w dwoch niezaleznych losowaniach fullmovies nie wygrywa nigdzie,
a sceny majace WYLACZNIE chwiejne hosty dostaja hdporn (40/40, zero bez
miniatury), wiec nic nie traci obrazka.
This commit is contained in:
goon-foss 2026-08-13 15:34:40 +02:00
parent 276fb4c24d
commit dde21f2e6e

View file

@ -712,6 +712,49 @@ def _is_rotting_thumb(url: str) -> bool:
return "fastpic.org" in url return "fastpic.org" in url
def _is_flaky_thumb(url: str) -> bool:
"""Host, który działa BYWA, ale zbyt często pada, żeby wygrywać wybór miniaturki.
W odróżnieniu od `_is_rotting_thumb` NIE zerujemy takiej miniatury w SceneDetail:
to nie jest martwy URL, tylko niepewny. Zerowanie powtórzyłoby wpadkę z fullpornerem
z sierpnia 2026, gdzie sceny mające tylko to źródło traciły obrazek całkowicie.
Problem był w kolejności wyboru: miniaturkę wygrywał pierwszy origin alfabetycznie,
a `tube:fullmoviesxxx` sortuje się PRZED `tube:fullporner`, więc chwiejny host
przykrywał zdrowy. 51 799 z 52 758 takich scen (98%) ma alternatywę, więc degradacja
niemal zawsze ma czym zastąpić.
Pomiar 2026-08-13, po 20-25 losowych URL-ach na host:
img.fullmovies.xxx 12/20 ok (5× ReadTimeout, 3× 502) 54 019 źródeł
img.hdporn.gg 16/20 ok (3× 502, 1× ReadTimeout) 54 267 źródeł
imgs.xiaoshenke.net 20/20 ok (fullporner) 68 406 źródeł
freshporno.org 20/20 ok
`img.hdporn.gg` dopisany po sprawdzeniu efektu pierwszej wersji: degradacja samego
fullmovies przesunęła wybór na hdporn (44 z 60 scen), czyli przeniosłaby problem
zamiast go rozwiązać. Po dopisaniu obu wygrywają hosty ze 100% skutecznością.
"""
return "img.fullmovies.xxx" in url or "img.hdporn.gg" in url
#: Im niżej, tym gorzej. Używane TYLKO wewnątrz tieru fallback, czyli gdy scena nie ma
#: żadnej zdrowej miniatury i trzeba wybrać mniejsze zło. Bez tego decydowała kolejność
#: alfabetyczna originu, przez co scena mająca fullmovies + hdporn dostawała fullmovies,
#: czyli host o 40% awaryjności zamiast tego o 20%.
_FLAKY_RANK = (
("img.hdporn.gg", 1), # 16/20 ok
("img.fullmovies.xxx", 2), # 12/20 ok
)
def _flaky_rank(url: str) -> int:
for host, rank in _FLAKY_RANK:
if host in url:
return rank
return 0 # nie-chwiejny (martwy rotting-thumb) — bez preferencji
def _needs_proxy(url: str) -> bool: def _needs_proxy(url: str) -> bool:
"""Wszystkie thumbnaile z playback_sources są proxowane przez backend. """Wszystkie thumbnaile z playback_sources są proxowane przez backend.
Większość CDN-ów porn-tube'ów wymaga Refera (hqporner, mypornerleak/58img, Większość CDN-ów porn-tube'ów wymaga Refera (hqporner, mypornerleak/58img,
@ -847,8 +890,15 @@ def _build_scenes_out_batch(
# Też tier fallback: statyczna miniatura z innego źródła jest tańsza. # Też tier fallback: statyczna miniatura z innego źródła jest tańsza.
thumb_fallback.setdefault(sid, (yp, page_url)) thumb_fallback.setdefault(sid, (yp, page_url))
elif thumb: elif thumb:
if _is_rotting_thumb(thumb): if _is_rotting_thumb(thumb) or _is_flaky_thumb(thumb):
thumb_fallback.setdefault(sid, (thumb, page_url)) # Martwe ORAZ chwiejne lądują w tierze fallback: użyte tylko wtedy,
# gdy scena nie ma stabilniejszej miniatury z innego źródła. W obrębie
# samego fallbacku wybieramy mniejsze zło wg `_FLAKY_RANK`, bo inaczej
# decydowałaby kolejność alfabetyczna originu i scena z fullmovies +
# hdporn dostawała gorszy z dwóch (pomiar: 38 z 60 takich scen).
prev = thumb_fallback.get(sid)
if prev is None or _flaky_rank(thumb) < _flaky_rank(prev[0]):
thumb_fallback[sid] = (thumb, page_url)
elif sid not in thumb_by_scene: elif sid not in thumb_by_scene:
thumb_by_scene[sid] = (thumb, page_url) thumb_by_scene[sid] = (thumb, page_url)
if sid not in anim_by_scene and anim: if sid not in anim_by_scene and anim: