goon/app/extractors/tubes/javflix.py
jtrzupek 18057e46d9
Some checks are pending
Backend tests / test (push) Waiting to run
feat(jav): javflix.cc scraper + extractor (first JAV source, gated off main feed)
First site of the JAV vertical (user request, separate section). javflix.cc is a
WordPress JAV aggregator, VPS-reachable and server-rendered. Scraper parses itemprop
metadata (title, thumbnail, uploadDate; no duration) and the JAV code (BKD-368 style)
as a tag. Playback: server buttons are <a class="myLink" href="<embed>"> (streamtape,
voe, doodstream, emturbovid) whose href sits in the raw HTML; the generic _embed_iframe
extractor already resolves those via its anchor-hoster pattern, so javflix registers
under sitetag "javflix" with a thin wrapper that drops the players.mp4 placeholder.
Added emturbovid to the anchor-hoster host list.

Verified end-to-end on prod: scrape a listing -> RawScene with metadata + code tag,
resolve -> emturbovid/voe/doodstream hoster sources (all Goon-playable).

NOT registered in ALL_BROWSE_SCRAPERS yet. JAV is a separate vertical (user decision)
that must be gated out of the main scenes feed before ingest so it does not flood the
western catalog. Next: feed gating (exclude JAV origins by default) + a mobile JAV tab
+ on-device playback test, then enable scheduled ingest. jav.guru / vjav / supjav
follow the same pattern.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 10:58:34 +02:00

19 lines
779 B
Python

"""javflix.cc extractor — cienki wrapper na generyczny _embed_iframe.
javflix trzyma hostery w `<a class="myLink" href="<embed>">` (streamtape/voe/doodstream/
emturbovid), które _embed_iframe łapie anchor-hoster patternem. Wrapper odsiewa tylko
placeholder `players.mp4` (pusty iframe zanim JS podmieni src) — bez tego trafiał jako
martwe pierwsze źródło type='mp4'.
"""
from __future__ import annotations
from app.extractors._models import StreamSource
from app.extractors.tubes import _embed_iframe
def extract(page_url: str, *, timeout: float = 60.0) -> list[StreamSource] | None:
srcs = _embed_iframe.extract(page_url, timeout=timeout)
if not srcs:
return None
srcs = [s for s in srcs if "players.mp4" not in s.link]
return srcs or None