Communitygithub.com

zimodzh/hls-dot0-to-mp4-skill

Agent-Fertigkeit: Huawei Browser Sniff-Download / Ressourcenschnüffeln – HLS `.0`-Cache (aq.m3u8.0 · *.ts.0 · *.key.0) → desktop-abspielbares MP4. Handy spielt ab, PC nicht – nur lokales Remux, kein URL-Scrape, kein DRM.

Was ist hls-dot0-to-mp4-skill?

Diese Fertigkeit konvertiert den verschlüsselten HLS-Cache, der vom Huawei-Browser-Sniff-Download erstellt wird (Dateien mit der Erweiterung `.0`), in normale MP4-Dateien, die auf dem Desktop abgespielt werden können. Der Huawei-Browser hängt bei jedem Segment `.0` an, sodass PC-Player und FFmpeg die Wiedergabe verweigern, obwohl das Handy die Dateien über seine eigene Datenbank abspielen kann. Die Fertigkeit erstellt Hardlinks von `.ts.0` → `.ts` und `.key.0` → `.key`, übergibt die ursprüngliche Playlist an FFmpeg mit `-c copy` (keine Neucodierung) und entfernt anschließend die temporären Namen. Sie eignet sich ausschließlich für lokale Huawei-Caches und nicht für das Herunterladen von m3u8-URLs oder DRM-geschützte Inhalte. Die Fertigkeit unterstützt Cursor, Codex und andere Agenten, die Python-Skripte ausführen können, und ist als plattformunabhängiges Tool konzipiert. Die Konvertierung erfolgt über das gebündelte Skript `scripts/convert.py`, das eine JSON-Ausgabe erzeugt. Vor der Konvertierung muss FFmpeg auf dem System vorhanden sein – die Fertigkeit sucht danach und bietet dem Benutzer die Wahl zwischen eigener Installation oder automatisierter Installation per Paketmanager. Besondere Vorsicht ist geboten bei der Fehlerbehandlung, da FFmpeg-Fehlermeldungen auf stderr ausgegeben werden, die in PowerShell als schwerwiegende Fehler interpretiert werden können. Die Fertigkeit erkennt SPS-Warnungen und bietet eine optionale Neucodierung an, falls die Wiedergabe gestört ist.

Funktioniert mit~Claude Code~Codex CLI✓Cursor
npx skills add zimodzh/hls-dot0-to-mp4-skill

In Ihrer bevorzugten KI fragen

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

Dokumentation

HLS .0-Cache → MP4

Der Huawei-Browser-Sniff-Download speichert jedes Video als UUID-Ordner von verschlüsseltem HLS und hängt .0 an jeden Dateinamen an. Der Handy-Player liest seine eigene Datenbank + diese Namen. PC-Player und FFmpeg tun dies nicht.

Diese Fertigkeit konvertiert diesen Cache, indem sie Hardlinks von .ts.0→.ts und .key.0→.key erstellt, die originale Playlist an FFmpeg übergibt (-c copy) und dann nur die temporären Namen löscht. Verifiziert für Huawei-Browser-Caches. Andere Anbieter sind nicht getestet.

Wann verwenden

Aktivieren, wenn eine der folgenden Bedingungen zutrifft:

  • Ordnernamen sehen aus wie 64f1723d-421b-495c-8a10-85ab7d74ddab
  • Dateien heißen aq.m3u8.0, *.ts.0, *.key.0
  • Benutzer sagt 嗅探下载 / 华为浏览器 / VideoData / Handy spielt ab, PC nicht
  • Log-Zeilen erwähnen DLEngine, DLSegMgr, download_content_

Nicht verwenden für: Herunterladen einer m3u8-URL (das ist N_m3u8DL-RE / 猫抓), Widevine/PSSH DRM oder Remux bereits normaler .mp4-Dateien.

Aufbau (Workspace-Suche nicht vertrauen)

Cursor/ripgrep ignorieren binäre *.0-Dateien. Glob **/*.ts.0 liefert 0 zurück, obwohl 73 Segmente existieren. Dateien mit einer Verzeichnisliste nachweisen (Get-ChildItem / dir / Path.iterdir) oder durch Lesen eines playlist-benannten Pfads (binärer Lesefehler = Datei existiert).

Jeder Video-Ordner:

<uuid>/
  aq.m3u8.0          # Playlist; referenziert foo.ts und foo.key (ohne .0)
  <ziffern>.ts.0      # AES-128 MPEG-TS, ~10s jede
  <ziffern>.key.0     # 16-Byte HLS-Schlüssel

Optionaler Geschwisterordner log/<uuid>.txt ist DLEngine-Text, kein Medium.

Lies references/layout.de.md falls die Baumstruktur abweicht (fehlender Schlüssel, verschachtelte Verzeichnisse, keine aq.m3u8.0).

Arbeitsablauf

Feste Hürde – dies vor jeder Konvertierung oder jedem Download tun.

0. FFmpeg finden oder stoppen und fragen

Begrenzte Suche nur (niemals ein ganzes Laufwerk rekursiv durchsuchen). scripts/convert.py verwendet dieselbe Reihenfolge:

  1. --ffmpeg / Umgebungsvariable HLS_DOT0_FFMPEG
  2. <cache-root>/ffmpeg.exe oder <cache-root>/ffmpeg
  3. PATH (where.exe ffmpeg / command -v ffmpeg)
  4. Einige häufige Verzeichnisse falls noch fehlend: %LOCALAPPDATA%\Microsoft\WinGet\Links\ffmpeg.exe, %USERPROFILE%\scoop\shims\ffmpeg.exe, C:\ffmpeg\bin\ffmpeg.exe, /opt/homebrew/bin/ffmpeg, /usr/local/bin/ffmpeg

Führe ffmpeg -version aus (oder diesen absoluten Pfad). Erfolg → gehe zu Schritt 1.

Wenn nicht gefunden, stoppen. Frage den Benutzer genau diese zwei Optionen ab; nicht installieren oder konvertieren, bis er antwortet:

  • A. Er installiert ffmpeg selbst oder legt es ab, dann melden, wenn bereit – führe diese Suche + -version erneut aus.
  • B. Du installierst es – erkenne zuerst Betriebssystem und Architektur (win32 + PROCESSOR_ARCHITECTURE / uname -s + uname -m). Folge dann nur der passenden Standardanweisung in references/ffmpeg-install.de.md.

Installationsregeln: ein Standardbefehl, ein Ausweichbefehl falls er fehlschlägt, dann erneut fragen. Installiere nicht Homebrew / Chocolatey / Scoop nur für ffmpeg, es sei denn, der Benutzer stimmt zu. Übertrage keine heruntergeladene Binärdatei in dieses Skill-Repository. Nach erfolgreicher Installation überprüfe -version in einer neuen Shell oder über den Installationspfad (Windows PATH ist oft veraltet).

1. Planen (ausgeben, dann konvertieren)

Liste UUID-Verzeichnisse auf (8-4-4-4-12 hex). Zähle für jedes *.ts.0, *.key.0 und ob aq.m3u8.0 existiert. Überspringe Ordner mit 0 Segmenten oder fehlendem Schlüssel.

Standardreihenfolge: Ordnername A–Z. Nummeriere Ausgaben 01.mp4, 02.mp4, … in --out-dir (Standard <cache-root>/mp4) ab --start (Standard 1). Das Skript überspringt einen Namen, wenn diese mp4 bereits existiert (JSON skipped: true), außer mit --force. Nach einem Teilbatch denselben Befehl erneut ausführen – bereits erledigte Nummern bleiben, der Rest wird konvertiert. Kein zweites Nummerierungsschema erfinden.

2. Das gebündelte Skript ausführen (nicht neu erfinden)

Aus diesem Skill-Stammverzeichnis:

python scripts/convert.py --root <cache-root> --dry-run
python scripts/convert.py --root <cache-root> --out-dir <cache-root>/mp4 --start 1
python scripts/convert.py --root <cache-root> --folder <uuid> --name 01 --force

Immer zuerst --dry-run auf einem neuen Verzeichnisbaum ausführen. Skript-Stdout ist JSON; Fortschritt geht an stderr.

Schreibe die Playlist nicht auf *.ts.0 um. FFmpeg lehnt diese Erweiterung selbst mit -allowed_extensions ALL ab (not in allowed_segment_extensions). Hardlink/Kopie auf die Namen, die bereits in aq.m3u8.0 stehen.

Prüfe Ausgaben nicht mit PowerShell $ErrorActionPreference = "Stop" plus ffmpeg -i datei -f null -. FFmpeg schreibt Banner auf stderr; PowerShell behandelt dies als schwerwiegenden Fehler und ein catch, das die mp4 löscht, würde eine erfolgreiche Konvertierung löschen.

Exakte FFmpeg-Flags (fragil – nicht weglassen):

ffmpeg -y -hide_banner -loglevel warning -stats -allowed_extensions ALL -protocol_whitelist file,crypto,data -i play.m3u8 -c copy out.mp4

3. Bereinigen und Bericht

Das Skript entfernt nur temporäre Namen, die es in diesem Durchlauf erstellt hat (plus übrig gebliebene Hardlinks, die bereits auf die .0-Dateien zeigen) und entfernt immer play.m3u8. Ursprüngliche *.ts.0 / *.key.0 / aq.m3u8.0 bleiben erhalten. Es löscht kein bereits vorhandenes .ts / .key, das kein Hardlink zur .0-Datei ist.

Berichte eine Tabelle: Nummer, Größe, Dauer falls bekannt, sps_warning. Siehe references/troubleshooting.de.md für SPS und andere Fehler.

Wenn der Benutzer bittet, eine SPS-Warnungsdatei neu zu codieren: ffmpeg -i 04.mp4 -c:v libx264 -crf 18 -c:a copy 04_fixed.mp4 – nur diese Dateien, nicht den gesamten Batch.

Checkliste

  • Verzeichnisliste zeigt .ts.0 und .key.0 (Suchwerkzeuge können lügen)
  • ffmpeg gefunden (begrenzte Suche) oder Benutzer wählte A/B; -version okay; kein vollständiger Datenträgerscan
  • Bei Installation: OS/Arch erkannt; nur die passenden Befehle in references/ffmpeg-install.de.md
  • --dry-run-Plan sieht richtig aus (Anzahlen, Ausgabenamen, SKIP bei vorhandenen mp4s)
  • Ein Ordner konvertiert und Benutzer kann ihn abspielen (es sei denn, er sagte „alle konvertieren")
  • Batch-JSON ok / skipped / Pro-Element-Fehler; temporäre Links verschwunden
  • SPS-Warnungsnummern erwähnen, damit der Benutzer stichprobenartig prüfen kann

Ausgabeformat

Converted N/M videos → <out-dir>
01.mp4  101 MB  (~12:10)  ok
04.mp4  251 MB  (~23:59)  SPS warning — check start and ~10s cuts
FAIL  <uuid>  missing key.0

Fallstricke

  • .0 ist das echte Medium. Das Überspringen von Binärdateien mit Glob/Index ist nicht „Dateien fehlen".
  • Playlist URI="….key" und ….ts – auf der Festplatte sind sie ….key.0 / ….ts.0.
  • Hardlinks müssen auf demselben Volume bleiben; wenn os.link fehlschlägt, kopieren (langsam, zusätzlicher Speicherplatz).
  • non-existing SPS 0 referenced in buffering period ist normalerweise kosmetisch bei -c copy. Prüfe 10s-Grenzen; nur neucodieren, wenn die Wiedergabe unterbrochen ist.
  • GUI-Werkzeuge (N_m3u8DL-RE, m3u8-to-mp4) erwarten Standarderweiterungen. Sie funktionieren nach Umbenennung/Hardlink, nicht mit rohen Huawei-Namen.
  • Dies ist Standard-HLS AES-128 mit einem lokalen Schlüssel (no pssh in DLEngine-Logs), keine Widevine-Umgehung.
  • Kein ffmpeg → frage A/B zuerst. Nicht stillschweigend winget/brew/apt ausführen oder eine exe herunterladen.
  • Vorhandene 01.mp4… werden übersprungen, keine Fehler. --force nur verwenden, wenn der Benutzer diese Dateien überschreiben möchte.

Verwandte Skills