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:
--ffmpeg/ envHLS_DOT0_FFMPEG<cache-root>/ffmpeg.exeo<cache-root>/ffmpegPATH(where.exe ffmpeg/command -v ffmpeg)- 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
ffmpegellos 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.0y.key.0(las herramientas de búsqueda pueden mentir) - ffmpeg encontrado (búsqueda limitada) o usuario eligió A/B;
-versionbien; sin escaneo completo del disco - Si se instala: SO/arquitectura detectados; solo los comandos correspondientes en
references/ffmpeg-install.md - El plan
--dry-runse ve correcto (conteos, nombres de salida,SKIPen 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
.0es 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.linkfalla, copia (lento, disco extra). non-existing SPS 0 referenced in buffering periodsuele 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 psshen registros de DLEngine), no elusión de Widevine. - Sin ffmpeg → pregunta A/B primero. No hagas
winget/brew/aptsilenciosamente ni descargues un exe. - Los
01.mp4existentes se omiten, no son errores. Usa--forcesolo cuando el usuario quiera sobrescribir esos archivos.