diff --git a/app/extractors/hosters/seekplayer_engine.py b/app/extractors/hosters/seekplayer_engine.py index 0296449..734ca22 100644 --- a/app/extractors/hosters/seekplayer_engine.py +++ b/app/extractors/hosters/seekplayer_engine.py @@ -139,7 +139,6 @@ def extract(page_url: str, *, timeout: float = 30.0) -> list[StreamSource] | Non raise HosterDead(f"seekplayer-engine {page_url}: {data['error']}") source = (data.get("source") or "").strip() - cf = (data.get("cf") or "").strip() # Source: m3u8 na CDN edge pod GOŁYM IP (np. `185.237.107.146/v4///…/master.m3u8`). # Token ma ~2,8 h TTL i NIE jest związany z IP (sprawdzone 2026-08-14), a węzły @@ -147,11 +146,27 @@ def extract(page_url: str, *, timeout: float = 30.0) -> list[StreamSource] | Non # padnięcie odtwarzania na tym źródle leczy się ponownym resolve, a nie WebView-em # (`BACKEND_RERESOLVE_ORIGINS` w PlayerScreen). # - # UWAGA: `proxy_no_verify` i `cf_fallback` niżej NIE SĄ przez nic czytane. Wcześniejszy - # komentarz twierdził, że `stream_proxy.py` ma gałąź `verify=False` dla hostów-IP — - # nie ma jej, w tym pliku nie występuje słowo `verify` ani razu. W praktyce certyfikaty - # tych węzłów przechodzą weryfikację (fetch przez proxy oddaje 200), więc to flagi - # informacyjne, nie działające przełączniki. + # `proxy_no_verify` NIE JEST przez nic czytane. Wcześniejszy komentarz twierdził, że + # `stream_proxy.py` ma gałąź `verify=False` dla hostów-IP — nie ma jej, w tym pliku nie + # występuje słowo `verify` ani razu. W praktyce certyfikaty tych węzłów przechodzą + # weryfikację (fetch przez proxy oddaje 200), więc flaga jest informacyjna. Zostaje, + # bo zapisuje realne ryzyko: gdyby któryś nod zaczął serwować cert niepasujący do IP, + # trzeba będzie tę gałąź dopisać. + # + # `cf` (fallback za Cloudflare) CELOWO NIE JEST PRZEKAZYWANY DALEJ. Sprawdzone + # 2026-08-14, sześć wariantów, wszystkie 403: + # + # httpx + Referer hostera · httpx + Referer galaxyporn.net + # curl_cffi chrome120 z Refererem · curl_cffi bez Referera (oddaje stronę CF) + # znacznik czasu bieżący · znacznik z linku głównego + # + # I to samo 403 z łącza RESIDENTIAL, więc to nie jest blokada datacenter. Adres jest + # najpewniej związany z sesją tego samego wywołania `/api/v1/video`, a my sięgamy po + # niego osobno i po czasie (znacznik w nazwie pliku bywa 5 dni stary). Podpięcie go + # jako zapasowego źródła dokładałoby request, który ZAWSZE pada, na ścieżce błędu. + # + # Padnięcie pojedynczego noda leczy ponowny resolve: kolejne wywołania wracają z + # różnymi adresami CDN (`BACKEND_RERESOLVE_ORIGINS` w PlayerScreen, commit 47547fe). sources: list[StreamSource] = [] if source: sources.append( @@ -162,7 +177,6 @@ def extract(page_url: str, *, timeout: float = 30.0) -> list[StreamSource] | Non referer=f"{host}/", raw={ "proxy_no_verify": True, - "cf_fallback": cf or None, "engine": "seekplayer", }, )