fix(perverzija): powrot na natywny HLS + passthrough manifestu

Zmiana z 18.08 przestawila perverzije na embed-iframe na podstawie jednej
strony, ktora akurat miala mixdrop. Probka 30 stron: 90% dalej stoi na
xtremestream, a xs1.php oddaje poprawny #EXTM3U (8/8 na szesciu rotujacych
subdomenach). Bledy "Input does not start with #EXTM3U" braly sie ze zlego
Referera, ktory zwraca 403 z HTML-em, nie ze zmiany protokolu.

- registry: perverzijacom wraca na natywny ekstraktor
- brak xtremestream -> fallback na embed-iframe (mixdrop, playhydrax)
- mobile_direct_ok: przez VPS idzie sam manifest, segmenty telefon ciagnie
  prosto z CDN (zweryfikowane cross-IP: 200, sync 0x47 z domowego lacza)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
goon-foss 2026-08-20 11:55:08 +02:00
parent ae3c4ac9bb
commit cddf60acc2
2 changed files with 31 additions and 10 deletions

View file

@ -219,13 +219,14 @@ _REGISTRY: dict[str, Callable[[str], list[StreamSource] | None]] = {
# 0dayxx + pornditt + pornhat, USUNIĘTE CAŁKOWICIE 2026-06-22 (user request): orphan # 0dayxx + pornditt + pornhat, USUNIĘTE CAŁKOWICIE 2026-06-22 (user request): orphan
# factories (0-0.2% canonical match), zastępujemy lepszymi źródłami. Dane skasowane. # factories (0-0.2% canonical match), zastępujemy lepszymi źródłami. Dane skasowane.
# CF-protected tube, curl_cffi w fetch_tube_html bypassa JA3, embed-iframe pattern. # CF-protected tube, curl_cffi w fetch_tube_html bypassa JA3, embed-iframe pattern.
# perverzija: BYŁ natywny HLS przez xtremestream/xs1.php (2026-07-28), ale strona # perverzija: natywny HLS przez xtremestream/xs1.php. Uwaga na regresję z 2026-08-18:
# przeszła na mixdrop (2026-08-18: 520 błędów "Input does not start with #EXTM3U", # przestawiliśmy to wtedy na embed-iframe/mixdrop na podstawie JEDNEJ strony, która
# zero sukcesów, bo xs1.php oddaje już HTML zamiast manifestu). Teraz embed-iframe # akurat miała mixdrop. Sprawdzenie 8 losowych stron (2026-08-20) daje 8/8 działających
# wyłuskuje mixdrop i oddaje type='hoster' → telefon resolwuje w WebView (mixdrop # manifestów xs1.php, na SZEŚCIU różnych subdomenach (perv, j2, moviekh, pervl1,
# gejtuje reCAPTCHA v3 na IP datacenter, przechodzi dopiero z residential). Natywny # pervl3, pervm1) — host rotuje, regex w `perverzija.py` to obejmuje. Warunkiem 200 jest
# ekstraktor `perverzija.py` zostaje w drzewie, gdyby xtremestream wrócił. # Referer równy URL-owi playera; zły Referer daje 403 z HTML-em i to on wyglądał jak
"perverzijacom": _embed_iframe.extract, # "Input does not start with #EXTM3U". Zanim to znowu przełączysz: sprawdź PRÓBKĘ stron.
"perverzijacom": perverzija.extract,
# Special: WebView-only (Yii2 session-bound player). # Special: WebView-only (Yii2 session-bound player).
"paradisehillcc": paradisehill.extract, "paradisehillcc": paradisehill.extract,
# PornDoe, dołączony 2026-05-21 (theporndude audit). Stream URL nie inline w # PornDoe, dołączony 2026-05-21 (theporndude audit). Stream URL nie inline w

View file

@ -52,8 +52,18 @@ def extract(page_url: str, *, timeout: float = 60.0) -> list[StreamSource] | Non
m = _PLAYER_IFRAME_RE.search(html) m = _PLAYER_IFRAME_RE.search(html)
if not m: if not m:
log.info("perverzija: brak iframe xtremestream na %s", page_url) # ~10% katalogu siedzi na innym playerze niż xtremestream (próbka 30 stron
return None # 2026-08-20: 27 xtremestream, 1 mixdrop, 1 playhydrax, 1 nie do pobrania).
# Oddajemy je generycznemu embed-iframe: wychodzi type='hoster', czyli telefon
# resolwuje je po swojej stronie, zamiast żeby scena wyglądała na martwą.
log.info("perverzija: brak xtremestream na %s, probuje embed-iframe", page_url)
from app.extractors.tubes import _embed_iframe
try:
return _embed_iframe.extract(page_url, timeout=timeout)
except Exception as e:
log.info("perverzija: embed-iframe fallback tez padl %s: %s", page_url, e)
return None
host, vid = m.group("host"), m.group("id") host, vid = m.group("host"), m.group("id")
player_url = f"https://{host}/player/index.php?data={vid}" player_url = f"https://{host}/player/index.php?data={vid}"
@ -66,7 +76,17 @@ def extract(page_url: str, *, timeout: float = 60.0) -> list[StreamSource] | Non
quality=f"{q}p", quality=f"{q}p",
type="m3u8", type="m3u8",
referer=player_url, referer=player_url,
raw={"extractor": "perverzija", "player": player_url, "q": q}, raw={
"extractor": "perverzija",
"player": player_url,
"q": q,
# Segmenty NIE są IP-bound i nie potrzebują Referera: segment pobrany
# z domowego łącza po manifeście wziętym na VPS oddał 200 i 76 kB
# zaczynające się od 0x47 (sync MPEG-TS), test 2026-08-20. Dzięki temu
# przez VPS idzie sam manifest (~16 kB) przez /proxy/hls, a segmenty
# telefon ciągnie prosto z xspcdn. Bez tej flagi całe wideo szło proxy.
"mobile_direct_ok": True,
},
) )
) )
return out or None return out or None