Skip to content

Extraktoren DE

TheMRX13 edited this page Jul 3, 2026 · 4 revisions

Extraktoren

🌐 English · Deutsch

Extraktoren lösen die Embed-URL eines Video-Hosters in einen direkten Stream-Link (meist HLS/MP4) auf, den yt-dlp/FFmpeg herunterladen kann.

Status der Hoster

Aktiv geschaltet (SUPPORTED_PROVIDERS in config.py):

Hoster Modul Besonderheiten
VOE voe.py Mehrstufige Deobfuskation (ROT13, Junk-Patterns, Base64), Captcha-Unterstützung
Vidmoly vidmoly.py Referer https://vidmoly.biz erforderlich
Vidoza vidoza.py
VeeV veev.py Eigene Header (Referer/Origin veev.to), Verfügbarkeits-Check via /api/veev/check

Vorhanden, aber deaktiviert (auskommentiert in SUPPORTED_PROVIDERS): Doodstream, Filemoon, LoadX, Luluvdo, Streamtape, Vidara.

Auto-Discovery

extractors/__init__.py lädt beim Import alle Module aus extractors/provider/ und registriert jede Funktion, deren Name mit get_direct_link_from_ oder get_preview_image_link_from_ beginnt, im Dict provider_functions:

provider_functions["get_direct_link_from_voe"](embed_url)

Beim App-Start probt _get_working_providers() (web/app.py) jeden Eintrag aus SUPPORTED_PROVIDERS mit einem leeren URL-String: Wirft der Extraktor NotImplementedError, gilt er als nicht implementiert; jede andere Exception heißt „implementiert“ (er hat die leere URL korrekt abgelehnt). Nur funktionsfähige Provider erscheinen in der UI (WORKING_PROVIDERS).

Neuen Extraktor hinzufügen

  1. Datei anlegen: src/mediaforge/extractors/provider/<hoster>.py
  2. Funktion implementieren (Namenskonvention beachten — <hoster> klein geschrieben):
import logging
logger = logging.getLogger(__name__)

try:
    from ...config import GLOBAL_SESSION, is_source_unavailable
except ImportError:
    from mediaforge.config import GLOBAL_SESSION, is_source_unavailable


def get_direct_link_from_<hoster>(embed_url: str) -> str:
    if not embed_url:
        raise ValueError("Empty URL")
    resp = GLOBAL_SESSION.get(embed_url)
    if is_source_unavailable(resp.text, resp.status_code):
        raise ValueError("Source removed")
    # ... HTML/JS parsen, Stream-URL extrahieren ...
    return direct_link
  1. Provider aktivieren: Namen in SUPPORTED_PROVIDERS (config.py) eintragen — die Schreibweise muss func_name = f"get_direct_link_from_{p.lower()}" entsprechen.
  2. Header definieren: Falls der Hoster spezielle Header braucht, in PROVIDER_HEADERS_D (Download) und ggf. PROVIDER_HEADERS_W (Watch) in config.py ergänzen — diese werden beim yt-dlp-/FFmpeg-Aufruf mitgegeben.
  3. Optional: get_preview_image_link_from_<hoster>() für Vorschaubilder.

Hilfsmittel aus config.py

Funktion Zweck
GLOBAL_SESSION Thread-sichere niquests-Session mit realistischen Headern und DoH-DNS
is_source_unavailable(html, status) Erkennt entfernte Videos (404/410/451 + HTML-Marker) ohne zusätzlichen Request
check_redirect_available(url) Folgt dem Redirect der Streaming-Seite und prüft, ob der Hoster das Video noch hat (curl_cffi mit Chrome-Impersonation gegen Cloudflare)
resolve_redirect_url(url) Liefert die finale Hoster-URL hinter einem Redirect

Captcha-Integration

Erkennt ein Extraktor eine Captcha-Seite (is_captcha_page aus playwright/captcha.py), kann er solve_captcha(...) aufrufen. Läuft der Aufruf im Queue-Worker, ist über Thread-Local die queue_id gesetzt — dadurch wird die Lösung interaktiv in der WebUI angeboten (Live-Screenshot + Klick-Weiterleitung). Der Chromium läuft mit Stealth-Patches, Netzwerk-Adblock und Schutz gegen Ad-Overlays.

Clone this wiki locally