CommunityCodierung & Entwicklunggithub.com

dsh-bilibili-Untertitel

Extrahiert Untertitel aus Bilibili-Video-Links (BV/av/ep/ss, b23.tv-Kurzlinks) oder lokalen Videodateien und formatiert sie als Markdown/Word/PDF/TXT/SRT.

Was ist dsh-bilibili-Untertitel?

Dieses Skill für DSH (Desktop Shell) wandelt einen Bilibili-Video-Link in ein lesbares, durchsuchbares und auslieferbares Untertitel-Dokument um. Es folgt dem Prinzip „zuerst vorhandene Untertitel nutzen, dann ASR oder OCR“ – Bilibili-Plattform-Untertitel (inkl. KI-Untertitel) sind in der Regel qualitativ hochwertiger und schneller als eine vollständige Audio-Transkription. Das Skill unterstützt Bilibili-Video-URLs, BV/av-Nummern, Bangumi-Episoden/Staffeln, b23.tv-Kurzlinks, lokale Videodateien sowie externe Untertiteldateien. Es erstellt strukturierte Dokumente (Markdown, Word, PDF, TXT, SRT) und liefert einen Qualitätsbericht mit Deckungsgrad, Sprachabdeckung, Überlappungen und Warnhinweisen. Falls keine Plattform-Untertitel verfügbar sind (z. B. wegen fehlendem Login), kann es auf Whisper-ASR oder OCR zurückgreifen. Das Skill ist plattformunabhängig (Windows, macOS, Linux) und wird über die DSH-Schnittstelle oder direkt über `python main.py <URL>` ausgeführt. Es eignet sich besonders für Entwickler, die Bilibili-Inhalte archivieren, analysieren oder weiterverarbeiten möchten.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add Chenfan2/dsh-bilibili-subtitles

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht dsh-bilibili-Untertitel?

Wandelt einen Bilibili-Video-Link in ein lesbares, durchsuchbares und auslieferbares Untertitel-Dokument um.

Kernprinzip: Zuerst vorhandene Untertitel nutzen, dann Sprachtranskription oder OCR in Betracht ziehen. Nicht sofort Video/Audio herunterladen und Whisper ausführen; Bilibili-Plattform-Untertitel (inkl. KI-Untertitel) sind in der Regel qualitativ besser und schneller.

Verwendung

Geeignet:

  • Benutzer gibt einen Bilibili-Video-Link, eine BV-Nummer, av-Nummer, einen Bangumi ep/ss-Link oder einen b23.tv-Kurzlink an und fordert „Untertitel extrahieren / als Dokument aufbereiten / nach Word/Markdown exportieren“.
  • Benutzer hat lokale Videos + externe Untertitel und möchte sie batchweise in Dokumente umwandeln.
  • Benutzer benötigt Untertitel mit Zeitstempeln, zweisprachiger Gegenüberstellung oder zusammengeführten Kapiteln.
  • Benutzer benötigt einen Qualitätsbericht für Untertitel, um zu entscheiden, ob eine manuelle Korrektur sinnvoll ist.

Nicht geeignet:

  • Übersetzung von Untertiteln: Dieses Skill führt lediglich eine zweisprachige Ausrichtung durch, keine maschinelle Übersetzung.
  • Präzise Sprechertrennung: Automatische Diarisierung ist nicht aktiviert; es werden nur vorhandene [Sprecher]-Markierungen in den Untertiteln beibehalten.
  • Umgehung von Bilibili-Login/Bezahlung/Region: Benutzer müssen entweder ein gültiges Cookie bereitstellen oder lokale Dateien verwenden.

Installation & Aufruf

  • Plugin: https://github.com/Chenfan2/dsh-bilibili-subtitles (DSH-Desktop: „Plugins → Plugin hinzufügen“ URL einfügen, oder dsh plugin --profile web add github:Chenfan2/dsh-bilibili-subtitles).
  • Reines Skill: Gesamtes Verzeichnis in das DSH-Skills-Verzeichnis kopieren (oder install.ps1 ausführen).

Nach Installation im Verzeichnis ausführen:

python main.py "https://www.bilibili.com/video/BV1xx411c7mD" --format md,docx

Für den einmaligen Gebrauch kann auch direkt main.py im Skill-Verzeichnis ausgeführt werden.

Ein Befehl

python main.py "https://www.bilibili.com/video/BV1xx411c7mD" --format md,docx

Ausgabe in output/:

  • Titel_BV-Nummer.md
  • Titel_BV-Nummer.docx
  • Titel_BV-Nummer.quality.json (Qualitätsbericht)
  • Titel_BV-Nummer.segments.json (bereinigte, strukturierte Untertitel)
  • _manifest.json (Zusammenfassung des aktuellen Durchlaufs)

Eingabe-/Ausgabe-Vertrag

Eingabe

TypBeispiel
Bilibili-Videohttps://www.bilibili.com/video/BV1xx411c7mD?p=2
BV / av-NummerBV1xx411c7mD, av80433022
Bangumihttps://www.bilibili.com/bangumi/play/ep123456, .../ss28747
Kurzlinkhttps://b23.tv/xxxxxx
Lokales Videoinput.mp4, input.mkv
Externe Untertitel--subtitle input.srt (auch .ass/.vtt/.json/.txt)
Verzeichnis/Batchpython main.py ./videos --format md,docx

Ausgabe

  • Dokumentdateipfade (Markdown/Word/PDF/TXT/SRT).
  • Strukturierte Untertitel: [{start, end, text, speaker?, lang?, confidence?, translation?}].
  • Qualitätsbericht: Untertitelquelle, Sprache, Abdeckungsgrad, Segmente mit niedriger Konfidenz, Warnungen, Stichproben Anfang/Mitte/Ende.
  • Verarbeitungsversuche: Erfolg/Fehler/Überspringen jedes Providers mit Begründung.

Priorität der Untertitelquellen

Es wird in folgender Reihenfolge versucht; bei Fehler erfolgt automatisch ein Downgrade, es sei denn, dies wird explizit deaktiviert:

  1. Benutzerexterne Untertitel (--subtitle): Höchste Qualität, vollständig kontrollierbar.
  2. Bilibili-Plattform-Untertitel / KI-Untertitel: Über x/player/v2 abgerufen, benötigt SESSDATA.
  3. Lokale, in Video eingebettete Untertitel: ffprobe-Erkennung + ffmpeg-Extraktion als SRT.
  4. Hardcoded-Untertitel-OCR: Nur bei lokalen Videos, mit --ocr aktiviert; experimentell.
  5. Whisper-Sprachtranskription: Mit --asr aktiviert oder automatisch als Fallback; beim ersten Mal wird das Modell heruntergeladen.

Ohne Anmeldung gibt Bilibili in der Regel keine Untertitelliste zurück. Dann wird LOGIN_REQUIRED ausgegeben, mit dem Hinweis, ein Cookie bereitzustellen oder ASR zu aktivieren. Dies ist eine Plattformbeschränkung, kein Linkfehler.

Bilibili-Login (für Plattform-Untertitel erforderlich)

Die Plattform-Untertitel-Schnittstelle gibt subtitle_url nur für eingeloggte Sitzungen zurück. Empfehlung: Umgebungsvariable verwenden, um die Befehlszeile nicht zu verunreinigen:

$env:BILIBILI_SESSDATA = "Ihre SESSDATA"
python main.py "https://www.bilibili.com/video/BV1xx411c7mD" --format md,docx

Abruf: Browser bei bilibili.com anmelden → Entwicklertools → Anwendung/Application → Cookies → bilibili.com → Wert von SESSDATA kopieren.

Auch unterstützt:

python main.py URL --sessdata "Wert der SESSDATA"
python main.py URL --cookie "SESSDATA=...; bili_jct=..."
python main.py URL --cookies cookies.txt
  • Cookies sind gleichbedeutend mit Anmeldeinformationen. Nicht in Repositorys, Dokumente oder öffentliche Kanäle schreiben.
  • Dieses Skill verwendet Cookies nur im Arbeitsspeicher; Protokolle und Berichte werden maskiert.
  • Nach Ablauf der Cookies einfach erneut kopieren.

Häufige Parameter

ParameterFunktion
--format md,docx,pdf,txt,srt,jsonAusgabeformate, durch Komma getrennt; Standard md
-o, --output PFADBei einer Eingabe und einem Format: Ausgabedatei festlegen
--out-dir VERZAusgabeverzeichnis, Standard output
--title TEXTDokumenttitel überschreiben (Standard: Videotitel/Dateiname)
--subtitle PFADExterne Untertiteldatei oder -verzeichnis (höchste Priorität)
--language zhBevorzugte Untertitel-/Transkriptionssprache; Plattform-Untertitel nach Sprache abgleichen
--bilingualZweisprachige Gegenüberstellung; bei zwei Untertitelspuren zeitlich ausrichten, bei einer Spur zeilenweise aufteilen
--timestamps / --no-timestamps[00:12] im Text anzeigen, standardmäßig an
--merge-sentences / --no-merge-sentencesKurze Sätze zusammenführen, standardmäßig an
--no-auto-punctuationAutomatische Interpunktion bei ASR/OCR deaktivieren (standardmäßig an)
--pages auto/all/1,3-5Kapitelauswahl; standardmäßig nur das in der URL angegebene, bei keiner Angabe P1
--template default/minimal/Datei.mdMarkdown-Vorlage
--quality-report PFADPfad für Qualitätsbericht JSON
--no-qualityKeinen Qualitätsbericht erstellen
--glossary terms.jsonBegriffsersetzung, z. B. {"DeepSeek":"深度求索"}
--json-summaryMaschinenlesbare Zusammenfassung auf stdout (für Agenten)
--asr / --no-asrWhisper-Fallback erlauben/verbieten; standardmäßig automatisch (nur versuchen, wenn installiert)
--asr-model smalltiny/base/small/medium; Standard small
--model-dir VERZWhisper-Modell-Cache-Verzeichnis (Standard ./.vsub-models-cache)
--ocrOCR für lokale Video-Hardcoded-Untertitel (experimentell)
--ffmpeg PFADffmpeg/ffprobe-Pfad angeben
--strictBei Fehler oder Qualität fail einen Exit-Code ungleich 0 zurückgeben

Vollständige Parameter: python main.py --help.

Empfohlener Workflow (Agent)

  1. Eingabe prüfen:

    • Bilibili-Link/BV/av → direkt ausführen.
    • Lokales Video → nach gleichnamigen .srt/.vtt/.ass suchen, falls vorhanden --subtitle verwenden; sonst eingebettete Untertitel prüfen.
    • Nur Untertiteldatei → kann auch direkt als Eingabe dienen.
  2. Zuerst Standardausgabe ausführen, nicht ohne Qualitätsbericht ASR starten:

    python main.py "<Link>" --format md,docx --out-dir output
    
  3. Bei LOGIN_REQUIRED:

    • Dem Benutzer mitteilen, dass Plattform-Untertitel SESSDATA benötigen, und Anleitung geben; nicht wiederholt versuchen.
    • Wenn der Benutzer kein Cookie hat, --asr vorschlagen (mit Hinweis auf erstmaligen Modell-Download, Zeitaufwand, mögliche Erkennungsfehler).
  4. <Stamm>.quality.json prüfen:

    • status=ok: Direkt ausliefern.
    • status=warn: warnings ansehen, besonders Abdeckung, Überlappungen, niedrige Konfidenz; in der Auslieferung darauf hinweisen.
    • status=fail: Nicht so tun, als wäre es erfolgreich; Fehlerursache melden und externe Untertitel/ASR/OCR vorschlagen.
  5. Mit present die .md/.docx als endgültige Datei ausliefern; Qualitätsbericht nur bei Bedarf beifügen.

Ausführungsumgebung:

  • Vorzugsweise das von load_workspace_dependencies zurückgegebene Python verwenden (enthält python-docx).

  • Windows PowerShell-Aufrufbeispiel:

    & "C:\...\python.exe" main.py "<Link>" --format md,docx --out-dir output
    
  • Alle Ausgaben und temporären Dateien müssen im Sitzungsarbeitsbereich abgelegt werden; nicht das System-Temp-Verzeichnis verwenden (kann von der Sandbox abgelehnt werden).

Qualitätsbericht-Felder

{
  "status": "ok | warn | fail",
  "score": 96.5,
  "source": "bilibili",
  "language": "zh",
  "segments": 320,
  "paragraphs": 86,
  "duration": 1260.0,
  "duration_covered": 0.96,
  "coverage_span": 0.99,
  "overlaps": 0,
  "low_confidence_segments": 3,
  "duplicate_segments": 1,
  "gaps_over_10s": 2,
  "warnings": ["..."],
  "samples": {"head": [], "middle": [], "tail": []}
}
  • duration_covered: Relativ zur gesamten Videolänge; nach Bereinigung von Intro/Outro-Werbung kann niedriger sein.
  • coverage_span: Relativ zum Inhaltsbereich zwischen erstem und letztem Untertitel; gibt besser wieder, ob der „Sprechanteil“ abgedeckt ist.
  • samples: Anfang/Mitte/Ende, jeweils maximal 5 Segmente, für manuelle Stichproben.
  • Häufige Ursachen für status=fail: Keine Segmente, Abdeckung unter 30 %, alle Kapitel fehlgeschlagen.

Fehler & Downgrade

SituationVerhalten
Externe Untertitel-Analyse fehlgeschlagenFehler protokollieren, mit Plattform-/eingebetteten Untertiteln fortfahren
Plattform-Untertitel LOGIN_REQUIREDHinweis auf SESSDATA; wenn faster-whisper installiert und ASR erlaubt, automatisch transkribieren
Keine Untertitelspur auf PlattformNO_SUBTITLE; --asr oder --subtitle möglich
Eingebettete Untertitel sind PGS/VobSub-BitmapsKeine direkte Konvertierung zu SRT; Hinweis auf OCR/externe Untertitel
ASR nicht installiertÜberspringen und pip install faster-whisper vorschlagen; kein stilles Fehlschlagen
Ein Ausgabeformat fehlgeschlagenAndere Formate werden weiter erzeugt; quality.warnings protokolliert; nur bei vollständigem Fehler wird RENDER_FAILED gemeldet
Batch teilweise fehlgeschlagenErfolgreiche Ausgaben fortsetzen; _manifest.json und *.error.json protokollieren die Fehler

Exit-Codes:

  • 0: Erfolg (bei Batch: mindestens einer erfolgreich)
  • 2: Eingabe-/Link-/API-/Parse-Fehler
  • 3: Keine Untertitel, Login erforderlich, Qualität fehlgeschlagen
  • 4: Fehlende Abhängigkeit (ffmpeg/Whisper/docx usw.)
  • 5: Dokument-Rendering fehlgeschlagen
  • 1: Unerwarteter Fehler

Beispiele

# Basis: Plattform-Untertitel → Markdown + Word
python main.py "https://www.bilibili.com/video/BV1xx411c7mD" --format md,docx

# Nur Word, Dateiname angeben
python main.py "BV1xx411c7mD" --format docx -o "Notizen.docx"

# Mehrere Kapitel + Zeitstempel + Qualitätsbericht
python main.py "https://www.bilibili.com/video/BV1xx411c7mD?p=1" --pages all --format md

# Externe Untertitel priorisieren
python main.py "input.mp4" --subtitle "input.srt" --format md,docx

# Zweisprachig (bei zwei Plattform-Spuren automatisch ausrichten)
python main.py "BV1xx411c7mD" --bilingual --language zh --format md,docx

# Ohne Login, mit ASR-Fallback (erstmaliger Modell-Download)
python main.py "BV1xx411c7mD" --asr --asr-model small --format md,docx

# Batch-Verzeichnis
python main.py "./videos" --format md,docx --out-dir output/batch

# Lokale Hardcoded-Untertitel OCR (experimentell)
python main.py "input.mp4" --ocr --ocr-fps 2 --format md

Einschränkungen

  • Verfügbarkeit von Plattform-Untertiteln hängt von Video, Account, Region und UP-Einstellungen ab; dieses Skill kann Berechtigungen nicht umgehen.
  • KI-Untertitel können Fehler, fehlende Sätze oder zeitliche Abweichungen enthalten; der Qualitätsbericht kann nur hinweisen, nicht manuelle Korrektur ersetzen.
  • Zweisprachig ist „zeitliche Ausrichtung“, keine Übersetzung; zwei Spuren werden nur bei unterschiedlichen Sprachen gegenübergestellt.
  • Automatische Sprechertrennung nicht implementiert; es werden nur Markierungen wie [Zhang San], 【Zhang San】, Zhang San: in den Untertiteln erkannt.
  • OCR nur für lokale Videos, standardmäßig untere 30 % des Bildschirms; bei Animationen/Hochformat/verschobenen Untertiteln muss --ocr-crop oder --ocr-full-frame angepasst werden.
  • PDF benötigt LibreOffice oder reportlab; sonst wird ein deutlicher Fehler ausgegeben, md/docx bleiben davon unberührt.
  • ASR für lange Videos kann langsam sein; small-Modell beim ersten Download ca. 460 MB.

Urheberrecht & Datenschutz

  • Nur Videos/Untertitel verarbeiten, zu deren Nutzung der Benutzer berechtigt ist; dieses Skill nicht für massenhaftes Herunterladen urheberrechtlich geschützter Inhalte verwenden.
  • Die Untertitel-Dokumente behalten den Original-Videotitel, den UP-Namen und den Link zur Nachverfolgung.
  • Cookies, signierte CDN-URLs werden nicht in Protokolle/Qualitätsberichte geschrieben; es wird dennoch empfohlen, Cookies nicht öffentlich zu teilen.
  • Temporäre Audio-/Frame-Dateien werden standardmäßig im Ausgabeverzeichnis unter .vsub-tmp abgelegt und nach dem Lauf automatisch bereinigt; --keep-temp belässt sie zur Fehlersuche.

Dateistruktur

dsh-bilibili-subtitles/
├── SKILL.md
├── README.md
├── main.py                  # CLI-Einstieg
├── vsub/
│   ├── bilibili.py          # URL/API/Untertitel/Audio
│   ├── input_adapter.py     # Eingabeanpassung
│   ├── pipeline.py          # Fünfstufige Pipeline-Orchestrierung
│   ├── providers/           # external/bilibili/embedded/ocr/asr
│   ├── parsers/             # srt/vtt/ass/bilibili-json/plain
│   ├── cleaners/            # Bereinigung, Zusammenführung, Zweisprachigkeit, Begriffe
│   ├── renderers/           # md/docx/pdf/txt/srt/json
│   └── quality.py           # Qualitätsprüfung
├── templates/
├── tests/
└── requirements.txt

Verwandte Skills