fix(scrapers): krotka nazwa wykonawcy nie przypina go do wszystkich wynikow
Bramka nazwy w slugu zwracala True, gdy zaden czlon nazwy nie mial 3 znakow ("Wa A",
"Al B", "T P"), a wolajacy pomijali ja przy pustych tokenach. Performer-driven
dopinal wiec takiego wykonawce do kazdego wyniku wyszukiwarki tuba: 108 wykonawcow,
10,5 tys. blednych przypisan w 7,9 tys. scen. Teraz takie nazwy nic nie dopasowuja.
Na produkcji bledne przypisania usuniete (kopia w scene_performers_removed_20260924).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
e8fae54724
commit
9225ae95de
3 changed files with 26 additions and 9 deletions
|
|
@ -144,7 +144,11 @@ class BaseSearchScraper(BaseDirectTubeScraper):
|
||||||
if len(tok) >= BaseSearchScraper._query_token_min_len
|
if len(tok) >= BaseSearchScraper._query_token_min_len
|
||||||
]
|
]
|
||||||
if not toks:
|
if not toks:
|
||||||
return True
|
# Nazwa z samych krotkich czlonow ("Wa A", "Al B", "T P", "L A S") nie ma czego
|
||||||
|
# szukac w slugu. Kiedys zwracalismy tu True, wiec performer-driven doklejal
|
||||||
|
# takiego wykonawce do KAZDEGO wyniku wyszukiwarki tuba: "Wa A" 498 scen,
|
||||||
|
# "Al B" 485, "T P" 344 (zgloszenie 0982b000, 2026-09-24). Lepiej nic.
|
||||||
|
return False
|
||||||
phrase = r"[^a-z0-9]*".join(toks)
|
phrase = r"[^a-z0-9]*".join(toks)
|
||||||
# Dozwolone końcowe „s": slug gubi apostrof, więc dzierżawcze „TiffaniTime's"
|
# Dozwolone końcowe „s": slug gubi apostrof, więc dzierżawcze „TiffaniTime's"
|
||||||
# zapisuje jako „tiffanitimes". Nie luzuje to bramki, bo przed tym „s" i tak
|
# zapisuje jako „tiffanitimes". Nie luzuje to bramki, bo przed tym „s" i tak
|
||||||
|
|
@ -173,10 +177,6 @@ class BaseSearchScraper(BaseDirectTubeScraper):
|
||||||
log.debug("%s search %s status=%d", self.sitetag, url, r.status_code)
|
log.debug("%s search %s status=%d", self.sitetag, url, r.status_code)
|
||||||
return
|
return
|
||||||
|
|
||||||
query_tokens = {
|
|
||||||
tok for tok in query.lower().split() if len(tok) >= self._query_token_min_len
|
|
||||||
}
|
|
||||||
|
|
||||||
seen: set[str] = set()
|
seen: set[str] = set()
|
||||||
try:
|
try:
|
||||||
thumb_map = self._thumbnail_map(r.text)
|
thumb_map = self._thumbnail_map(r.text)
|
||||||
|
|
@ -216,7 +216,7 @@ class BaseSearchScraper(BaseDirectTubeScraper):
|
||||||
# To ma znaczenie, bo `all_performers` niżej dokleja szukanego performera
|
# To ma znaczenie, bo `all_performers` niżej dokleja szukanego performera
|
||||||
# BEZWARUNKOWO do każdej sceny, która tu przejdzie. Ten warunek jest jedyną
|
# BEZWARUNKOWO do każdej sceny, która tu przejdzie. Ten warunek jest jedyną
|
||||||
# bramką między wyszukiwarką tuba (dopasowuje rozmyto) a obsadą w bazie.
|
# bramką między wyszukiwarką tuba (dopasowuje rozmyto) a obsadą w bazie.
|
||||||
if query_tokens and not self._slug_matches_query(slug_lower, query):
|
if not self._slug_matches_query(slug_lower, query):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
title = self._title_from_slug(slug)
|
title = self._title_from_slug(slug)
|
||||||
|
|
|
||||||
|
|
@ -55,8 +55,7 @@ class HQPornerScraper(BaseDirectTubeScraper):
|
||||||
# token → sceny z setkami błędnych aktorek (do 503; hqporner = 5659/5897 takich scen,
|
# token → sceny z setkami błędnych aktorek (do 503; hqporner = 5659/5897 takich scen,
|
||||||
# bug-report 2026-06-07). `all` wymaga pełnego dopasowania nazwy → precyzja.
|
# bug-report 2026-06-07). `all` wymaga pełnego dopasowania nazwy → precyzja.
|
||||||
# Pojedyncze nazwy ("Belladonna") nadal działają (jeden token musi być).
|
# 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 tokenów bramki, więc
|
||||||
# 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'",
|
# 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ń
|
# 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
|
# z tube, z czego 115 tylko przez „lady", realnie o niej 1). Gdy nazwa ma taki
|
||||||
|
|
@ -82,7 +81,7 @@ class HQPornerScraper(BaseDirectTubeScraper):
|
||||||
# `all(tok in slug)` przepuszczał „tiffany" w „s-tiffany-love" i „time"
|
# `all(tok in slug)` przepuszczał „tiffany" w „s-tiffany-love" i „time"
|
||||||
# w „first-time" — zgłoszenie 2026-08-13, strona Tiffani Time).
|
# w „first-time" — zgłoszenie 2026-08-13, strona Tiffani Time).
|
||||||
slug_lower = slug_part.lower()
|
slug_lower = slug_part.lower()
|
||||||
if query_tokens and not BaseSearchScraper._slug_matches_query(slug_lower, query):
|
if not BaseSearchScraper._slug_matches_query(slug_lower, query):
|
||||||
continue
|
continue
|
||||||
if _needs_compact and _compact not in re.sub(r"[^a-z0-9]", "", slug_lower):
|
if _needs_compact and _compact not in re.sub(r"[^a-z0-9]", "", slug_lower):
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
18
tests/test_search_slug_gate.py
Normal file
18
tests/test_search_slug_gate.py
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
from app.connectors.direct_scrapers._search_base import BaseSearchScraper
|
||||||
|
|
||||||
|
gate = BaseSearchScraper._slug_matches_query
|
||||||
|
|
||||||
|
|
||||||
|
def test_short_only_names_never_match():
|
||||||
|
# Kiedys True dla kazdego slugu: "Wa A" trafial do 498 scen, "Al B" do 485.
|
||||||
|
for name in ("Wa A", "Al B", "T P", "Ms P", "L A S", "Cl O"):
|
||||||
|
assert not gate("tidy-up", name)
|
||||||
|
assert not gate("wa-a-hot-scene", name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_phrase_gate_unchanged_for_normal_names():
|
||||||
|
assert gate("tiffani-time-first-scene", "Tiffani Time")
|
||||||
|
assert not gate("first-time-with-tiffani", "Tiffani Time")
|
||||||
|
assert gate("violet_myers_prodigious", "Violet Myers")
|
||||||
|
# czlon < 3 znakow pomijany, reszta frazy dalej musi pasowac
|
||||||
|
assert gate("mia-li-in-the-shower", "Mia Li")
|
||||||
Loading…
Add table
Reference in a new issue