goon/app/extractors/tubes/_vps_blocked_fallback.py
goon-foss a4486980a4 style: myslniki em/en z komentarzy i docstringow (calosc repo)
1745 wystapien w 291 plikach (backend, scripts, mobile). Dominowal jeden ksztalt,
' — ' laczace zdania, wiec poszedl przecinek; myslnik otwierajacy mysl zdjety;
zakresy 0–5 i A–Z na dywiz.

Podzial komentarz/kod robil skaner stanow, nie regex, zeby nie ruszyc myslnika
stojacego w stringu albo w wyrazeniu regularnym. Potwierdzone maszynowo: po wycieciu
komentarzy z wersji HEAD i z dysku obie sa identyczne we wszystkich 291 plikach,
czyli poza komentarzami nie zmienilo sie nic. 233 pliki .py parsuja sie bez bledu,
tsc ma te same 11 bledow w tych samych 3 plikach co przed zmiana.

Dwie rzeczy wymagaly poprawki po automacie: wyrownane listy definicji, gdzie myslnik
byl separatorem kolumny (37 miejsc, kolumna przywrocona), i trzy przeniesienia mysli
do nowej linii, gdzie zostawal wiszacy przecinek na poczatku (poprawione recznie).

Bundla nie republikuje: Hermes i tak nie niesie komentarzy, wiec dla uzytkownika
to zero zmiany.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 11:51:57 +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,
)
]