From f70082e7dec827ad9be823e23837022098a7bf49 Mon Sep 17 00:00:00 2001 From: goon-foss Date: Fri, 14 Aug 2026 10:29:02 +0200 Subject: [PATCH] chore(seekplayer): przestan przekazywac martwy cf_fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zadanie bylo "podpiac albo usunac". Sprawdzone i NIE DA SIE podpiac. Fallback za Cloudflare (svb.professionalvisibility.cyou/...cf-master..txt) oddaje 403 w szesciu wariantach: httpx + Referer hostera httpx + Referer galaxyporn.net curl_cffi chrome120 z Ref curl_cffi bez Ref (oddaje strone CF) znacznik czasu biezacy znacznik z linku glownego I to samo 403 z lacza RESIDENTIAL, wiec to nie blokada datacenter. Adres jest najpewniej zwiazany z sesja tego samego wywolania /api/v1/video, a my siegamy po niego osobno i po czasie (znacznik w nazwie pliku bywa 5 dni stary). Podpiecie dokladaloby request, ktory ZAWSZE pada, na sciezce bledu — czyli opoznienie zamiast ratunku. Cel, ktoremu mial sluzyc (przezyc padniety nod CDN), jest juz osiagniety inaczej: ponowny resolve wraca z innym adresem CDN (47547fe). `proxy_no_verify` ZOSTAJE mimo ze nic go nie czyta: zapisuje realne ryzyko (cert niepasujacy do golego IP), a jego usuniecie skasowaloby te informacje. Falszywy komentarz o istniejacej galezi `verify=False` juz poprawiony. Wszystkie szesc prob zapisane w docstringu, zeby nikt ich nie powtarzal. Kontrola po zmianie: extractor oddaje m3u8, proxy 200. --- app/extractors/hosters/seekplayer_engine.py | 28 +++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) 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", }, )