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>
34 lines
1.4 KiB
Python
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,
|
|
)
|
|
]
|