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()