Communitygithub.com

zimodzh/hls-dot0-to-mp4-skill

Habilidad para convertir la caché `.0` de descarga por olfateo del navegador Huawei (aq.m3u8.0 · *.ts.0 · *.key.0) a MP4 reproducible en escritorio. Solo remux local, sin extracción de URLs ni DRM.

¿Qué es hls-dot0-to-mp4-skill?

Esta es una habilidad especializada para agentes de IA (como Claude Code, Cursor, Codex) que permite convertir archivos de video HLS almacenados en caché por el navegador Huawei (con extensión `.0` añadida) a un formato MP4 estándar reproducible en computadoras de escritorio. La habilidad resuelve un problema específico: el navegador Huawei, al descargar videos por olfateo, guarda cada archivo HLS (playlist, segmentos TS, clave AES-128) con un sufijo `.0`, lo que hace que reproductores de PC y herramientas como FFmpeg no puedan reconocerlos. El flujo de trabajo implica localizar la carpeta UUID de cada video, enlazar físicamente los archivos `.ts.0` y `.key.0` a sus nombres originales (sin `.0`), y luego ejecutar FFmpeg con una copia directa (sin recodificar) del playlist para generar el MP4. También incluye pasos para buscar FFmpeg (o instalarlo si es necesario), planificar la conversión de múltiples carpetas, manejar errores como advertencias SPS, y limpiar los archivos temporales creados. No está diseñado para descargar desde URLs m3u8 ni para manipular DRM de Widevine.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

HLS caché .0 → MP4

La descarga por olfateo del navegador Huawei almacena cada video como una carpeta UUID de HLS encriptado y luego añade .0 a cada nombre de archivo. El reproductor del teléfono lee su propia base de datos junto con estos nombres. Los reproductores de PC y FFmpeg no lo hacen.

Esta habilidad convierte esa caché enlazando físicamente .ts.0 → .ts y .key.0 → .key, alimentando el playlist original a FFmpeg (-c copy), y luego eliminando solo los nombres temporales. Verificado en cachés del navegador Huawei. Otros navegadores no están probados.

Cuándo usarlo

Actívala si se cumple alguna de estas condiciones:

  • Los nombres de carpeta parecen 64f1723d-421b-495c-8a10-85ab7d74ddab
  • Archivos nombrados aq.m3u8.0, *.ts.0, *.key.0
  • El usuario dice 嗅探下载 / 华为浏览器 / VideoData / 手机能播电脑不能
  • Las líneas de registro mencionan DLEngine, DLSegMgr, download_content_

No usar para: descargar una URL m3u8 (eso es N_m3u8DL-RE / 猫抓), DRM Widevine/PSSH, o remuxificar .mp4 ya sin encriptar.

Estructura (no confíes en la búsqueda del espacio de trabajo)

Cursor/ripgrep omiten archivos binarios *.0. Glob **/*.ts.0 devuelve 0 incluso cuando existen 73 segmentos. Comprueba los archivos con un listado de directorio (Get-ChildItem / dir / Path.iterdir), o leyendo una ruta nombrada como playlist (error de lectura binaria = el archivo existe).

Cada carpeta de video:

<uuid>/
  aq.m3u8.0          # playlist; referencia foo.ts y foo.key (sin .0)
  <digits>.ts.0      # AES-128 MPEG-TS, ~10s cada uno
  <digits>.key.0     # Clave HLS de 16 bytes

El archivo opcional hermano log/<uuid>.txt es texto de DLEngine, no contenido multimedia.

Lee references/layout.md si el árbol es diferente (falta clave, directorios anidados, sin aq.m3u8.0).

Flujo de trabajo

Puerta estricta: haz esto antes de cualquier conversión o descarga.

0. Encontrar ffmpeg, o detenerse y preguntar

Búsqueda limitada solamente (nunca recorrer todo un disco). scripts/convert.py usa el mismo orden:

  1. --ffmpeg / env HLS_DOT0_FFMPEG
  2. <cache-root>/ffmpeg.exe o <cache-root>/ffmpeg
  3. PATH (where.exe ffmpeg / command -v ffmpeg)
  4. Algunos directorios comunes si aún falta: %LOCALAPPDATA%\Microsoft\WinGet\Links\ffmpeg.exe, %USERPROFILE%\scoop\shims\ffmpeg.exe, C:\ffmpeg\bin\ffmpeg.exe, /opt/homebrew/bin/ffmpeg, /usr/local/bin/ffmpeg

Ejecuta ffmpeg -version (o esa ruta absoluta). Éxito → ve al paso 1.

Si no se encuentra, detente. Pregunta al usuario exactamente estas dos opciones; no instales ni conviertas hasta que respondan:

  • A. Que instalen o coloquen ffmpeg ellos mismos, y luego te digan cuando estén listos — vuelve a ejecutar esta búsqueda + -version.
  • B. Que lo instales tú — detecta primero el SO y la arquitectura (win32 + PROCESSOR_ARCHITECTURE / uname -s + uname -m). Luego sigue solo el valor predeterminado correspondiente en references/ffmpeg-install.md.

Reglas de instalación: un comando predeterminado, un plan de respaldo si falla, luego preguntar de nuevo. No instales Homebrew / Chocolatey / Scoop solo para obtener ffmpeg a menos que el usuario esté de acuerdo. No comprometas un binario descargado en este repositorio de habilidad. Después de una instalación exitosa, verifica -version en un nuevo shell o mediante la ruta del instalador (el PATH de Windows a menudo está desactualizado).

1. Planificar (imprimir, luego convertir)

Lista los directorios UUID (hex 8-4-4-4-12). Para cada uno, cuenta *.ts.0, *.key.0, y si existe aq.m3u8.0. Omite carpetas con 0 segmentos o sin clave.

Orden predeterminado: nombre de carpeta A–Z. Numera las salidas 01.mp4, 02.mp4, … en --out-dir (predeterminado <cache-root>/mp4) desde --start (predeterminado 1). El script omite un nombre cuando ese mp4 ya existe (JSON skipped: true) a menos que se use --force. Vuelve a ejecutar el mismo comando después de un lote parcial — los números ya hechos se mantienen, el resto se convierte. No inventes un segundo esquema de numeración.

2. Ejecutar el script incluido (no reinventes)

Desde la raíz de esta habilidad:

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

Siempre pasa --dry-run primero en un árbol nuevo. La salida estándar del script es JSON; el progreso va a stderr.

No reescribas el playlist a *.ts.0. FFmpeg rechaza esa extensión incluso con -allowed_extensions ALL (not in allowed_segment_extensions). Enlaza físicamente/copia a los nombres que ya están en aq.m3u8.0.

No sondes las salidas con PowerShell $ErrorActionPreference = "Stop" más ffmpeg -i file -f null -. FFmpeg escribe el banner a stderr; PowerShell lo trata como un error de terminación y un catch que elimina el mp4 borrará una conversión exitosa.

Flags exactos de FFmpeg (frágil — no los elimines):

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

3. Limpiar e informar

El script elimina solo los nombres temporales que creó en esta ejecución (más los enlaces físicos sobrantes que ya apuntan a los archivos .0) y siempre elimina play.m3u8. Los archivos originales *.ts.0 / *.key.0 / aq.m3u8.0 se conservan. No elimina un .ts / .key preexistente que no sea un enlace físico al archivo .0.

Informa una tabla: número, tamaño, duración si se conoce, sps_warning. Consulta references/troubleshooting.md para SPS y otros fallos.

Si el usuario pide recodificar un archivo con advertencia SPS: ffmpeg -i 04.mp4 -c:v libx264 -crf 18 -c:a copy 04_fixed.mp4 — solo esos archivos, no todo el lote.

Lista de verificación

  • El listado del directorio muestra .ts.0 y .key.0 (las herramientas de búsqueda pueden mentir)
  • ffmpeg encontrado (búsqueda limitada) o usuario eligió A/B; -version bien; sin escaneo completo del disco
  • Si se instala: SO/arquitectura detectados; solo los comandos correspondientes en references/ffmpeg-install.md
  • El plan --dry-run se ve correcto (conteos, nombres de salida, SKIP en mp4 existentes)
  • Una carpeta convertida y el usuario puede reproducirla (a menos que diga convertir todo)
  • JSON del lote ok / skipped / errores por elemento; enlaces temporales eliminados
  • Menciona los números de advertencia SPS para que el usuario pueda verificar

Formato de salida

Convertidos N/M videos → <out-dir>
01.mp4  101 MB  (~12:10)  bien
04.mp4  251 MB  (~23:59)  Advertencia SPS — verifica el inicio y cortes de ~10s
FALLO  <uuid>  falta key.0

Errores comunes

  • .0 es el medio real. Glob/index que omite binarios no es "archivos faltantes".
  • En el playlist URI="….key" y ….ts — en disco son ….key.0 / ….ts.0.
  • Los enlaces físicos deben permanecer en el mismo volumen; si os.link falla, copia (lento, disco extra).
  • non-existing SPS 0 referenced in buffering period suele ser cosmético en -c copy. Verifica los límites de 10s; recodifica solo si la reproducción está rota.
  • Herramientas GUI (N_m3u8DL-RE, m3u8-to-mp4) esperan extensiones estándar. Funcionan después del cambio de nombre/enlace físico, no con los nombres originales de Huawei.
  • Esto es HLS AES-128 estándar con una clave local (no pssh en registros de DLEngine), no elusión de Widevine.
  • Sin ffmpeg → pregunta A/B primero. No hagas winget/brew/apt silenciosamente ni descargues un exe.
  • Los 01.mp4 existentes se omiten, no son errores. Usa --force solo cuando el usuario quiera sobrescribir esos archivos.

Skills relacionados