goon/app/extractors/tubes/_vps_blocked_fallback.py
goon-foss ad0284585b Initial commit
Goon — self-hosted aggregator for adult-content scene metadata.

Indexes scenes from TPDB, StashDB, and 30+ public adult tube sites.
Cross-source deduplication via perceptual hash + Levenshtein distance.
FastAPI backend + APScheduler worker + React Native (Expo) mobile client.

FOSS, ad-free, donation-funded. See README for details.
2026-05-20 10:10:22 +02:00

34 lines
1.4 KiB
Python

"""Hoster fallback dla tubes które blokują VPS IP ale działają z residential IP.
Wzorzec (potwierdzony 2026-05-15 przez Chrome DevTools MCP live debug):
- xhamster.com: HLS via xplayer.js + obfuscated URLs w window.initials JSON
- pornditt: KVS kt_player + license_code decoder client-side → <video.src>
- fpo.xxx: KVS kt_player jak pornditt — identyczny pattern
- sxylandcom → xtapes.porn → reelshdd.com: iframe redirect chain do direct mp4
WSZYSTKIE działają z desktop/mobile residential IP. Tylko Hetzner Cloud VPS IP
blocked (Cloudflare-level dla xhamster, CDN token IP-bound dla KVS hostów).
Strategia: extractor zwraca `type='hoster'` z scene URL jako embed → mobile
WebView fallback. WebView ma residential ISP IP, INJECTED_JS w PlayerScreen.tsx
skanuje DOM co 1s (linia 805) wyciągając `<video>.src` + XHR/fetch m3u8 — to
łapie URL po decode-ie player JS i posyła do RN przez postMessage. ExoPlayer
swap do native player z prawdziwym URL.
Bez tego fallbacku użytkownik widzi błąd "chwilowy problem z hosterem" (503)
zamiast działającego playera.
"""
from __future__ import annotations
from app.extractors._models import StreamSource
def extract(page_url: str, *, timeout: float = 60.0) -> list[StreamSource]:
return [
StreamSource(
link=page_url,
quality=None,
type="hoster",
referer=page_url,
)
]