fix(watchporn): nowy motyw strony, obsada tylko z bloku castrow, studio z /sites/, chipy jako tagi
Stary globalny regex /models/ gubil prawdziwa obsade (nazwa w spanie, pusty tekst linku) i dopinal performerow z kart related (srednio 12 na scene). Kategorie to teraz gatunki, nie studio; tagi bez przedrostka #.
This commit is contained in:
parent
cbec97fc79
commit
1ad16ceae9
1 changed files with 55 additions and 12 deletions
|
|
@ -32,6 +32,21 @@ _SCENE_URL_RE = re.compile(r'href="(https://watchporn\.to/video/\d+/[a-z0-9\-]+/
|
||||||
_MODEL_RE = re.compile(r'href="https://watchporn\.to/models/([a-z0-9\-]+)/"[^>]*>([^<]+)', re.IGNORECASE)
|
_MODEL_RE = re.compile(r'href="https://watchporn\.to/models/([a-z0-9\-]+)/"[^>]*>([^<]+)', re.IGNORECASE)
|
||||||
_TAG_RE = re.compile(r'href="https://watchporn\.to/tags/([a-z0-9\-]+)/"[^>]*>([^<]+)', re.IGNORECASE)
|
_TAG_RE = re.compile(r'href="https://watchporn\.to/tags/([a-z0-9\-]+)/"[^>]*>([^<]+)', re.IGNORECASE)
|
||||||
_CAT_RE = re.compile(r'href="https://watchporn\.to/categories/([a-z0-9\-]+)/"[^>]*>([^<]+)', re.IGNORECASE)
|
_CAT_RE = re.compile(r'href="https://watchporn\.to/categories/([a-z0-9\-]+)/"[^>]*>([^<]+)', re.IGNORECASE)
|
||||||
|
# Nowy motyw od ok. 2026-10-10 (prefiks klas `wp-`). Obsada sceny siedzi TYLKO w bloku
|
||||||
|
# `<div class="wp-castrow">`, nazwa w `<span class="wp-cast__n">` (nie w tekscie linku),
|
||||||
|
# a karty "related" ponizej maja wlasne linki `/models/` z nazwa w tekscie. Stary globalny
|
||||||
|
# regex gubil prawdziwa obsade (pusty tekst linku) i dokladal performerow z kart related:
|
||||||
|
# srednio 12,5 na scene zamiast 2 (10 do 13.10, 193 sceny). Kategorie to teraz gatunki
|
||||||
|
# (chipy `wp-vchip`), studio jest w linku `/sites/<slug>/` i w JSON-LD "publisher".
|
||||||
|
_NEW_THEME_MARK = 'class="wp-vi__panel"'
|
||||||
|
_CASTROW_RE = re.compile(r'<div class="wp-castrow">(.*?)</div>', re.IGNORECASE | re.DOTALL)
|
||||||
|
_CAST_RE = re.compile(
|
||||||
|
r'href="https://watchporn\.to/models/([a-z0-9\-]+)/"[^>]*>.*?<span class="wp-cast__n">([^<]+)</span>',
|
||||||
|
re.IGNORECASE | re.DOTALL,
|
||||||
|
)
|
||||||
|
_CHIPS_RE = re.compile(r'<div class="wp-chips">(.*?)</div>', re.IGNORECASE | re.DOTALL)
|
||||||
|
_SITE_RE = re.compile(r'href="https://watchporn\.to/sites/([a-z0-9\-]+)/"', re.IGNORECASE)
|
||||||
|
_PUBLISHER_RE = re.compile(r'"publisher"\s*:\s*\{[^}]*?"name"\s*:\s*"([^"]+)"', re.DOTALL)
|
||||||
_DUR_RE = re.compile(r'"duration"\s*:\s*"([^"]+)"')
|
_DUR_RE = re.compile(r'"duration"\s*:\s*"([^"]+)"')
|
||||||
_UPLOAD_RE = re.compile(r'"uploadDate"\s*:\s*"([^"]+)"')
|
_UPLOAD_RE = re.compile(r'"uploadDate"\s*:\s*"([^"]+)"')
|
||||||
_VIDEO_ID_RE = re.compile(r"/video/(\d+)/")
|
_VIDEO_ID_RE = re.compile(r"/video/(\d+)/")
|
||||||
|
|
@ -74,9 +89,18 @@ class WatchPornScraper(BaseBrowseScraper):
|
||||||
um = _UPLOAD_RE.search(detail_html)
|
um = _UPLOAD_RE.search(detail_html)
|
||||||
release_date = _parse_iso_date(um.group(1)) if um else None
|
release_date = _parse_iso_date(um.group(1)) if um else None
|
||||||
|
|
||||||
|
new_theme = _NEW_THEME_MARK in detail_html
|
||||||
|
|
||||||
performers: list[RawPerformer] = []
|
performers: list[RawPerformer] = []
|
||||||
seen_p: set[str] = set()
|
seen_p: set[str] = set()
|
||||||
for m in _MODEL_RE.finditer(detail_html):
|
if new_theme:
|
||||||
|
# Tylko blok obsady; brak bloku = scena bez obsady, NIE wracamy do globalnego
|
||||||
|
# regexu, bo ten zbiera karty related.
|
||||||
|
crm = _CASTROW_RE.search(detail_html)
|
||||||
|
cast_iter = _CAST_RE.finditer(crm.group(1)) if crm else iter(())
|
||||||
|
else:
|
||||||
|
cast_iter = _MODEL_RE.finditer(detail_html)
|
||||||
|
for m in cast_iter:
|
||||||
slug = m.group(1)
|
slug = m.group(1)
|
||||||
name = html.unescape(m.group(2)).strip()
|
name = html.unescape(m.group(2)).strip()
|
||||||
if slug.isdigit() or slug in seen_p or not name:
|
if slug.isdigit() or slug in seen_p or not name:
|
||||||
|
|
@ -86,19 +110,38 @@ class WatchPornScraper(BaseBrowseScraper):
|
||||||
|
|
||||||
tags: list[RawTag] = []
|
tags: list[RawTag] = []
|
||||||
seen_t: set[str] = set()
|
seen_t: set[str] = set()
|
||||||
for m in _TAG_RE.finditer(detail_html):
|
|
||||||
slug = m.group(1)
|
def _add_tag(slug: str, raw_name: str) -> None:
|
||||||
name = html.unescape(m.group(2)).strip()
|
name = html.unescape(raw_name).strip().lstrip("#").strip()
|
||||||
if slug in seen_t or not name:
|
if slug in seen_t or not name:
|
||||||
continue
|
return
|
||||||
seen_t.add(slug)
|
seen_t.add(slug)
|
||||||
tags.append(RawTag(external_id=f"{self.sitetag}:tag:{slug}", name=name, slug=slug))
|
tags.append(RawTag(external_id=f"{self.sitetag}:tag:{slug}", name=name, slug=slug))
|
||||||
|
|
||||||
|
for m in _TAG_RE.finditer(detail_html):
|
||||||
|
_add_tag(m.group(1), m.group(2))
|
||||||
|
if new_theme:
|
||||||
|
# Kategorie-chipy sceny (Blowjob, MILF...) to gatunki, ida do tagow.
|
||||||
|
chm = _CHIPS_RE.search(detail_html)
|
||||||
|
if chm:
|
||||||
|
for m in _CAT_RE.finditer(chm.group(1)):
|
||||||
|
_add_tag(m.group(1), m.group(2))
|
||||||
|
|
||||||
thumbnail_url = (
|
thumbnail_url = (
|
||||||
meta_content(detail_html, property="og:image") or _derive_thumb(scene_url)
|
meta_content(detail_html, property="og:image") or _derive_thumb(scene_url)
|
||||||
)
|
)
|
||||||
|
|
||||||
studio: RawStudio | None = None
|
studio: RawStudio | None = None
|
||||||
|
if new_theme:
|
||||||
|
sm = _SITE_RE.search(detail_html)
|
||||||
|
if sm:
|
||||||
|
pm = _PUBLISHER_RE.search(detail_html)
|
||||||
|
cname = html.unescape(pm.group(1)).strip() if pm else sm.group(1).replace("-", " ").title()
|
||||||
|
if cname:
|
||||||
|
studio = RawStudio(
|
||||||
|
external_id=f"{self.sitetag}:studio:{slugify(cname)}", name=cname, slug=slugify(cname)
|
||||||
|
)
|
||||||
|
else:
|
||||||
cm = _CAT_RE.search(detail_html)
|
cm = _CAT_RE.search(detail_html)
|
||||||
if cm:
|
if cm:
|
||||||
cname = html.unescape(cm.group(2)).strip()
|
cname = html.unescape(cm.group(2)).strip()
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue