fix(galaxyporn): stary katalog NIE jest martwy, tylko iframe zwietrzal

Korekta mojej wczorajszej diagnozy. Twierdzilem, ze stary katalog galaxyporn padl po
stronie hostera: player wypisuje "Video is not ready yet", a /api/v1/video oddaje
payload BEZ jakiegokolwiek adresu wideo (75% probki 16 scen). Objawy sie zgadzaly,
wniosek byl zly.

Na TYCH SAMYCH stronach jest link do vikingfile, tylko nie w iframie, lecz w zwyklym
<a href>, wiec go nie widzielismy. Pliki tam zyja: sprawdzone trzy, 890 MB, 742 MB i
2,5 GB, nazwy zgodne ze scenami. Zwietrzaly byl iframe (news.upns.pro,
sport.seekplays.com, galaxy.4meplayer.pro), zostawiony po migracji.

Szukamy wiec vikingfile po calym HTML. Kolejnosc celowa: seekplayer PIERWSZY, bo
resolwuje sie po naszej stronie i gra bez CAPTCHA, vikingfile jako ratunek, ktory
kosztuje usera przejscie Turnstile w WebView. Martwy player potrafi RZUCIC
(HosterDead przy 404), nie tylko oddac pustke, wiec lapiemy tez wyjatek, inaczej
ratunek nigdy sie nie wykonuje.

Na 12 losowych scenach: bylo 0 rozwiazanych, jest 11. ZADNYCH scen nie kasujemy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
goon-foss 2026-08-21 12:00:30 +02:00
parent 83a6092d89
commit 95c51f78d2

View file

@ -27,6 +27,28 @@ _IFRAME_RE = re.compile(r'<iframe[^>]+src="([^"]+)"', re.IGNORECASE)
#: Hostery, ktorych NIE resolwujemy serwerowo, tylko oddajemy telefonowi do WebView.
_NEEDS_WEBVIEW_RE = re.compile(r"vikingfile\.", re.IGNORECASE)
#: Link do pliku na vikingfile, gdziekolwiek w HTML (iframe ALBO zwykly <a href>).
_VIKINGFILE_RE = re.compile(r"https?://vikingfile\.com/f/[A-Za-z0-9]+", re.IGNORECASE)
def _vikingfile_source(html_text: str, page_url: str) -> list[StreamSource] | None:
"""Link do vikingfile z DOWOLNEGO miejsca strony, nie tylko z iframe'a.
Na starszych stronach vikingfile siedzi w zwyklym `<a href>`, a iframe wskazuje
stary, martwy player. Dlatego szukamy po calym HTML, nie po samym iframie.
"""
mv = _VIKINGFILE_RE.search(html_text)
if not mv:
return None
return [
StreamSource(
link=mv.group(0),
quality="hoster",
type="hoster",
referer=page_url,
raw={"extractor": "galaxyporn", "hoster": "vikingfile"},
)
]
def extract(page_url: str, *, timeout: float = 60.0) -> list[StreamSource] | None:
@ -34,7 +56,7 @@ def extract(page_url: str, *, timeout: float = 60.0) -> list[StreamSource] | Non
m = _IFRAME_RE.search(html_text)
if not m:
log.info("galaxyporn: no iframe on %s", page_url)
return None
return _vikingfile_source(html_text, page_url)
iframe_src = m.group(1).strip()
if iframe_src.startswith("//"):
iframe_src = "https:" + iframe_src
@ -62,12 +84,26 @@ def extract(page_url: str, *, timeout: float = 60.0) -> list[StreamSource] | Non
)
]
try:
sources = seekplayer_engine.extract(iframe_src, timeout=timeout)
except Exception as e:
# Martwy player potrafi RZUCIC (HosterDead przy 404 z /api/v1/video), a nie tylko
# oddac pustke. Bez tego wyjatek wychodzil na zewnatrz i ratunek z vikingfile
# nigdy sie nie wykonywal.
log.info("galaxyporn: seekplayer rzucil dla %s (%s), probuje vikingfile", iframe_src, e)
return _vikingfile_source(html_text, page_url)
if not sources:
# Nie oddajemy iframe'a jako type='hoster', seekplayer to SPA, w WebView
# user zobaczy pusty player. Lepiej None (źródło jako nierozwiązane).
log.info("galaxyporn: seekplayer resolve failed for %s", iframe_src)
return None
# Iframe bywa ZWIETRZALY. Serwis przeniosl pliki na vikingfile, ale w starszych
# wpisach zostawil stary iframe (news.upns.pro, sport.seekplays.com,
# galaxy.4meplayer.pro), ktory dzis wypisuje "Video is not ready yet", a jego API
# oddaje payload BEZ jakiegokolwiek adresu wideo (75% probki 16 scen). Wygladalo to
# na skasowany katalog, ale na TYCH SAMYCH stronach jest link do vikingfile, a pliki
# tam zyja: sprawdzone trzy, 890 MB / 742 MB / 2,5 GB, nazwy zgodne ze scenami.
# Dlatego zamiast poddawac sie, siegamy po vikingfile. Kolejnosc jest celowa:
# seekplayer PIERWSZY, bo resolwuje sie po naszej stronie i gra bez CAPTCHA,
# a vikingfile to ratunek, ktory kosztuje usera przejscie Turnstile w WebView.
log.info("galaxyporn: seekplayer padl dla %s, probuje vikingfile", iframe_src)
return _vikingfile_source(html_text, page_url)
# Referer MUSI być hostem PLAYERA (np. https://galaxy.4meplayer.pro/), NIE
# galaxyporn.net, zweryfikowane: ten sam manifest z Refererem galaxyporn = 403,