From 7a40ff70ba4295193052708bc99dfdf249274e10 Mon Sep 17 00:00:00 2001 From: goon-foss Date: Tue, 28 Jul 2026 09:52:41 +0200 Subject: [PATCH] fix(performers): czlon <3 znaki degenerowal filtr slug-matchu (over-attribution) 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. --- app/connectors/direct_scrapers/hdporn92.py | 7 +++++++ app/connectors/direct_scrapers/hqporner.py | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/app/connectors/direct_scrapers/hdporn92.py b/app/connectors/direct_scrapers/hdporn92.py index f2d30a9..13b89e7 100644 --- a/app/connectors/direct_scrapers/hdporn92.py +++ b/app/connectors/direct_scrapers/hdporn92.py @@ -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() diff --git a/app/connectors/direct_scrapers/hqporner.py b/app/connectors/direct_scrapers/hqporner.py index 7139af2..10dc8b3 100644 --- a/app/connectors/direct_scrapers/hqporner.py +++ b/app/connectors/direct_scrapers/hqporner.py @@ -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()