From a4486980a49df0db567a1ef30ec03d00bcd90276 Mon Sep 17 00:00:00 2001
From: goon-foss ]+(?:src|data-src|data-original|data-lazy-src|data-lazy)=["\']'
@@ -53,7 +53,7 @@ class BaseSearchScraper(BaseDirectTubeScraper):
#: Regex matchujący scene URL w search HTML. Wymagana grupa `url` (full scene URL),
#: opcjonalna grupa `slug` (do title derivation gdy dostępny w URL).
- _scene_url_re: re.Pattern[str] = re.compile(r"$^") # placeholder — subclass override
+ _scene_url_re: re.Pattern[str] = re.compile(r"$^") # placeholder, subclass override
#: Minimalna długość tokena query do filtrowania wyników (krótsze ignorujemy żeby
#: nie matchowały niezwiązanych slugów).
@@ -74,12 +74,12 @@ class BaseSearchScraper(BaseDirectTubeScraper):
})
#: Window (chars) wokół scene URL match, w którym szukamy `
` jako thumbnail.
- #: WordPress-like tubes mają thumb w `
` —
+ #: WordPress-like tubes mają thumb w `
`,
#: ±800 chars łapie ten pattern niezawodnie.
_thumbnail_window: int = 800
def _scene_url_from_match(self, m: re.Match[str]) -> str:
- """Domyślnie group(1) — subclass override gdy regex używa named groups inaczej."""
+ """Domyślnie group(1), subclass override gdy regex używa named groups inaczej."""
try:
return m.group("url")
except IndexError:
@@ -103,17 +103,17 @@ class BaseSearchScraper(BaseDirectTubeScraper):
def _format_query_for_url(self, query: str) -> str:
"""Default: URL-encode (spaces → `+`). Subclass override gdy tube wymaga
- innego formatu — np. KVS-style sites użyją slug (spaces → `-`).
+ innego formatu, np. KVS-style sites użyją slug (spaces → `-`).
"""
return urllib.parse.quote_plus(query.strip())
def _fetch_scene_metadata(
self, scene_url: str
) -> tuple[RawStudio | None, list[RawPerformer], list[RawTag]] | None:
- """Optional hook — subclass może override żeby fetch'ować scene detail page
+ """Optional hook, subclass może override żeby fetch'ować scene detail page
i wyciągnąć studio/performerów/tagi. Default zwraca None (skip detail fetch).
- Wywoływane PER SCENE w `search()` — dodaje +1 HTTP request per match. Subclass
+ Wywoływane PER SCENE w `search()`, dodaje +1 HTTP request per match. Subclass
powinien rzucić wyjątki swobodnie, base łapie i kontynuuje bez metadata.
Returns: (studio, performers, tags). Każde może być None / pusta lista.
@@ -153,7 +153,7 @@ class BaseSearchScraper(BaseDirectTubeScraper):
if scene_url.startswith("//"):
scene_url = "https:" + scene_url
elif scene_url.startswith("/"):
- # Relative URL — prefix host z search URL.
+ # Relative URL, prefix host z search URL.
base = urllib.parse.urlparse(url)
scene_url = f"{base.scheme}://{base.netloc}{scene_url}"
if scene_url in seen:
@@ -165,11 +165,11 @@ class BaseSearchScraper(BaseDirectTubeScraper):
if slug_lower in self._nav_slug_blacklist:
continue
# Strict: WSZYSTKIE query tokens muszą być w slug. Wcześniej `any()`
- # przepuszczał scenę gdy choć jeden token był w slug — dla performera
+ # przepuszczał scenę gdy choć jeden token był w slug, dla performera
# "Ava Koxxx" (query="ava koxxx") wszystkie sceny z "ava-*" slug
# (Ava Devine, Ava Addams itp.) były labelowane jako "Ava Koxxx",
# bo `any("ava" in slug)` =True. User reports: scena "ava devine
- # gangbanged..." miała Ava Koxxx w DB. Fix: `all()` — slug musi
+ # gangbanged..." miała Ava Koxxx w DB. Fix: `all()`, slug musi
# zawierać każdy ≥3-char token z imienia performera.
if query_tokens and not all(tok in slug_lower for tok in query_tokens):
continue
@@ -178,7 +178,7 @@ class BaseSearchScraper(BaseDirectTubeScraper):
# Thumbnail: search ±N chars around scene_url match for nearest .
# Większość tubes ma `
` lub flat
- # `
` — window 800 obejmuje oba.
+ # `
`, window 800 obejmuje oba.
window_start = max(0, m.start() - self._thumbnail_window)
window_end = min(len(r.text), m.end() + self._thumbnail_window)
window_html = r.text[window_start:window_end]
@@ -193,7 +193,7 @@ class BaseSearchScraper(BaseDirectTubeScraper):
thumb_url = f"{base.scheme}://{base.netloc}{thumb_url}"
# Opcjonalny metadata fetch (studio/dodatkowi performerzy/tagi). Default
- # zwraca None — większość tube'ów ma tylko search HTML bez metadata.
+ # zwraca None, większość tube'ów ma tylko search HTML bez metadata.
# PornHat ma `data-setup='{...}'` w `js-ajax-{dvd,model,tag}` divach.
studio: RawStudio | None = None
extra_performers: list[RawPerformer] = []
@@ -212,7 +212,7 @@ class BaseSearchScraper(BaseDirectTubeScraper):
description = meta[3]
# Performer z query zawsze obecny (driver scraping). Extra performers
- # z detail page dorzucamy — dedupe po slug/name w resolverze.
+ # z detail page dorzucamy, dedupe po slug/name w resolverze.
all_performers = [RawPerformer(name=query.strip()), *extra_performers]
yield RawScene(
diff --git a/app/connectors/direct_scrapers/base.py b/app/connectors/direct_scrapers/base.py
index aba2391..4561eb8 100644
--- a/app/connectors/direct_scrapers/base.py
+++ b/app/connectors/direct_scrapers/base.py
@@ -1,4 +1,4 @@
-"""BaseDirectTubeScraper — kontrakt dla bezpośrednich scraperów tube'ów."""
+"""BaseDirectTubeScraper, kontrakt dla bezpośrednich scraperów tube'ów."""
from __future__ import annotations
import abc
@@ -13,7 +13,7 @@ class BaseDirectTubeScraper(abc.ABC):
żeby dziedziczyć logikę resolvera + idempotent merge per external_id."""
sitetag: str
- """Stabilny ID tube'a — używany w external_id `f"{sitetag}:{url}"`. Zgodny
+ """Stabilny ID tube'a, używany w external_id `f"{sitetag}:{url}"`. Zgodny
z porn-app sitetag (hqpornercom, sxylandcom, itp.)."""
@abc.abstractmethod
diff --git a/app/connectors/direct_scrapers/eporner.py b/app/connectors/direct_scrapers/eporner.py
index 26b0ab7..2954642 100644
--- a/app/connectors/direct_scrapers/eporner.py
+++ b/app/connectors/direct_scrapers/eporner.py
@@ -1,4 +1,4 @@
-"""eporner.com — direct HTML scrape search results.
+"""eporner.com, direct HTML scrape search results.
Search: `https://www.eporner.com/search/
/
]*>\s*([^<]+?)\s*
")
-# `1785081937