fix(performers): czlon <3 znaki degenerowal filtr slug-matchu (over-attribution)
Some checks are pending
Backend tests / test (push) Waiting to run

Bug-report 986d3018 ('O co chodzi z tym Lady Vi? To wcale nie jest aktorka z tych
filmow'). Search-scrapery filtruja wyniki po tokenach nazwy >=3 znaki, wiec czlon
2-znakowy wypada: 'Lady Vi' -> {lady}, i  degeneruje sie do 'slug zawiera
lady' = KAZDA scena z tym slowem. Dla nazw gdzie WSZYSTKIE czlony sa krotkie
('Jj Jj', 'Mi Su') zbior tokenow jest PUSTY, a
przepuszcza wtedy absolutnie wszystko.

Audyt: Lady Vi miala 116 przypisan z tube, z czego 115 pasowalo tylko przez 'lady'
a realnie o niej byla 1. Wyczyszczone (zostaly kanoniczne stashdb + 1 trafione).

Fix: gdy nazwa ma czlon <3 znaki, wymagamy dodatkowo CALEJ nazwy sklejonej bez
separatorow ('lady-vi-...' -> 'ladyvi'). Zweryfikowane: lady-vi-hot-scene przyjmie,
lady-sonia-milf i busty-lady-next-door odrzuci.
This commit is contained in:
goon-foss 2026-07-28 09:52:41 +02:00
parent 140764bfc5
commit 7a40ff70ba
2 changed files with 17 additions and 0 deletions

View file

@ -49,6 +49,11 @@ class HDPorn92Scraper(BaseDirectTubeScraper):
return
query_tokens = {tok for tok in query.lower().split() if len(tok) >= 3}
# Człon <3 znaki ("Lady Vi", "Mia Li") wypada z tokenów → zostaje sam pospolity
# człon i filtr łapie każdą scenę z tym słowem (audit 2026-07-28, over-attribution
# Lady Vi). Wtedy wymagamy CAŁEJ nazwy sklejonej bez separatorów.
_compact = re.sub(r"[^a-z0-9]", "", query.lower())
_needs_compact = any(len(tok) < 3 for tok in query.lower().split()) and len(_compact) >= 4
seen: set[str] = set()
yielded = 0
@ -64,6 +69,8 @@ class HDPorn92Scraper(BaseDirectTubeScraper):
slug_lower = slug.lower()
if query_tokens and not any(tok in slug_lower for tok in query_tokens):
continue
if _needs_compact and _compact not in re.sub(r"[^a-z0-9]", "", slug_lower):
continue
title = slug.replace("-", " ").strip()

View file

@ -54,6 +54,14 @@ class HQPornerScraper(BaseDirectTubeScraper):
# bug-report 2026-06-07). `all` wymaga pełnego dopasowania nazwy → precyzja.
# Pojedyncze nazwy ("Belladonna") nadal działają (jeden token musi być).
query_tokens = {tok for tok in query.lower().split() if len(tok) >= 3}
# Człon <3 znaki ("Lady Vi", "Mia Li", "Ai Uehara") wypada z `query_tokens`, więc
# zostaje sam pospolity człon i `all` degeneruje się do „slug zawiera 'lady'" —
# czyli KAŻDA scena z tym słowem (audit 2026-07-28: Lady Vi miała 116 przypisań
# z tube, z czego 115 tylko przez „lady", realnie o niej 1). Gdy nazwa ma taki
# człon, wymagamy dodatkowo CAŁEJ nazwy sklejonej bez separatorów (slug
# „lady-vi-…" → „ladyvi…"), co przywraca precyzję bez gubienia trafień.
_compact = re.sub(r"[^a-z0-9]", "", query.lower())
_needs_compact = any(len(tok) < 3 for tok in query.lower().split()) and len(_compact) >= 4
seen_urls: set[str] = set()
yielded = 0
@ -69,6 +77,8 @@ class HQPornerScraper(BaseDirectTubeScraper):
slug_lower = slug_part.lower()
if query_tokens and not all(tok in slug_lower for tok in query_tokens):
continue
if _needs_compact and _compact not in re.sub(r"[^a-z0-9]", "", slug_lower):
continue
title = slug_part.replace("_", " ").replace("-", " ").strip()