English ·
简体中文 ·
繁體中文 ·
日本語 ·
हिन्दी ·
Español ·
العربية ·
Français
বাংলা ·
Português ·
Bahasa Indonesia ·
اردو ·
Русский ·
Deutsch ·
Naijá ·
مصري
Un descargador de vídeo y audio por línea de comandos, pensado tanto para personas como para agentes de IA.
Dale un enlace. Elige tus pistas. Obtén vídeo, audio, subtítulos, capítulos y portada en un solo archivo.
Instalación · Inicio rápido · Sitios compatibles · Guía para agentes · Opciones · Versiones
| ↓ Tu contenido, a tu manera | ⌘ Un binario, cualquier escritorio | { } Listo para automatizar |
|---|---|---|
| Elige calidad, códecs, páginas y nombres de archivo con el mismo vocabulario en cinco sitios | Un único binario Go para macOS, Linux y Windows, con descargas paralelas por rangos que se reanudan | Un documento JSON en stdout, registros en stderr, códigos de salida con significado y ninguna pregunta sin terminal |
| 01 / INSPECCIONAR | 02 / ELEGIR | 03 / DESCARGAR | 04 / COMBINAR |
|---|---|---|---|
| Todas las pistas a la vista | Define tus prioridades | Llévatelo a casa | Todo junto |
| Páginas, códecs y tamaños | Calidad, audio y páginas | Por rangos o por segmentos | Pistas, subtítulos y portada |
haul info "<url>" |
-q 720p -c avc,m4a |
haul "<url>" |
ffmpeg / MP4Box |
Echa un vistazo al terminal
$ haul info -q 720p "https://youtu.be/DdCEmlAydcw"
haul v1.0.0
Inside Anthropic's molecular biology lab
channel Anthropic · 2026-09-24 · 00:01:15
Video
▶ 0 720p 1190×720 AVC 24fps 755 kbps 6.8 MB
1 720p 1190×720 VP9 24fps 528 kbps 4.7 MB
2 720p 1190×720 AV1 24fps 388 kbps 3.5 MB
3 1080p 2048×1240 VP9 24fps 5827 kbps 52.3 MB
…
19 144p 238×144 AVC 24fps 50 kbps 459.0 KB
Audio
▶ 0 OPUS 131 kbps 1.2 MB
1 M4A 130 kbps 1.2 MB
…Para uso personal, de investigación y otros fines no comerciales. Eres responsable de respetar los derechos de autor y las condiciones de cada sitio.
haul funciona en macOS, Linux y Windows (amd64 y arm64). Necesita ffmpeg para combinar pistas; YouTube y X también necesitan yt-dlp, y los desafíos del reproductor de YouTube requieren deno:
brew install ffmpeg yt-dlp deno # macOS
sudo apt install ffmpeg pipx unzip curl # Linux (Debian / Ubuntu)
pipx install "yt-dlp[default]" && pipx ensurepath
curl -fsSL https://deno.land/install.sh | sh -s -- -y
winget install Gyan.FFmpeg # Windows, un paquete cada vez
winget install yt-dlp.yt-dlp
winget install DenoLand.DenoEn Linux, instala yt-dlp con pipx o con el binario yt-dlp_linux de sus versiones (yt-dlp_linux_aarch64 en arm64), no desde tu distribución: YouTube cambia a menudo y los paquetes se quedan atrás. Después de instalar, abre una terminal nueva para que las herramientas estén en tu PATH.
Descarga el archivo comprimido para tu sistema desde Releases —haul-<version>-<os>-<arch>.tar.gz (.zip en Windows)— y coloca haul en cualquier directorio de tu PATH:
tar -xzf haul-*-darwin-arm64.tar.gz
mkdir -p ~/.local/bin && mv haul-*/haul ~/.local/bin/El flujo actual firma las versiones de macOS y obtiene su notarización de Apple. El instalador haul-<version>-darwin-<arch>.pkg incluye el comprobante e instala haul en /usr/local/bin. El archivo comprimido contiene el mismo ejecutable firmado, pero la primera verificación puede necesitar internet. Las versiones antiguas pueden no estar firmadas.
Compilar desde el código fuente · Go 1.26+
go install github.com/ac1982/haul/cmd/haul@latesto bien, desde un clon del repositorio:
go build -o haul ./cmd/haulEmpieza con un enlace. haul elige por defecto las mejores pistas disponibles.
haul "https://youtu.be/DdCEmlAydcw"Consulta la información antes de descargar, o elige una calidad y un códec:
haul info "https://youtu.be/DdCEmlAydcw"
haul -q 720p -c avc,m4a "https://youtu.be/DdCEmlAydcw" # H.264 + AAC para QuickTimeReferencia de comandos
| Comando | Significado |
|---|---|
haul <url> [options] |
Descargar; equivale a haul download <url> |
haul info <url> [--urls] |
Mostrar el elemento, sus páginas y pistas sin descargar nada |
haul login bilibili |
Iniciar sesión en bilibili para obtener calidades superiores |
haul templates |
Variables de las plantillas de nombres de archivo |
haul --help |
Sitios, uso por agentes, códigos de salida y ejemplos |
haul download --help |
Todas las opciones |
| Sitio | Enlaces | Requiere |
|---|---|---|
| YouTube | youtube.com/watch?v=…, youtu.be/…, /shorts/…, /embed/…, /live/… |
yt-dlp, deno |
| X | x.com/<user>/status/<id>, twitter.com/…; /video/<n> selecciona un vídeo de la publicación |
yt-dlp |
weibo.com/<uid>/<id>, weibo.com/tv/show/…, video.weibo.com/show?fid=…, m.weibo.cn/status/…, t.cn/… |
yt-dlp | |
| bilibili | vídeos, bangumi, cursos, colecciones, series, favoritos, espacios de usuario, b23.tv e identificadores sueltos BV… av… ep… ss… md… |
– |
| Xiaoyuzhou | xiaoyuzhoufm.com/episode/<id>, /podcast/<id> |
– |
| Apple Podcasts | podcasts.apple.com/<cc>/podcast/<name>/id<show>, con ?i=<episode> para un solo episodio |
– |
Solo el audio
haul --audio-only "https://youtu.be/DdCEmlAydcw"
haul --audio-only -c m4a "https://youtu.be/DdCEmlAydcw" # AAC en lugar de OpusAlgunas partes, una temporada completa o el último episodio
# Partes seleccionadas, guardadas en tu carpeta Movies
haul -p 1-3,10 -w ~/Movies "https://www.bilibili.com/video/BV1Wv411h7kN"
# Todos los episodios de una temporada
haul -p ALL "https://www.bilibili.com/bangumi/play/ss33073"
# El episodio de pódcast más reciente
haul -p LAST "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
# Todos los vídeos de una publicación de X
haul -p ALL "https://x.com/<user>/status/<id>"Archivos organizados, subtítulos o una elección interactiva
haul -o "<uploader>/<title> [<quality>]" "https://youtu.be/DdCEmlAydcw"
haul --sub-lang en,zh "https://youtu.be/DdCEmlAydcw" # solo estos idiomas de subtítulos
haul -i "BV1qt4y1X7TW" # elige las pistas con las teclas de flechahaul --help incluye todo lo que necesita un agente; llms.txt es la misma guía en forma de archivo. En resumen:
haul info --json "<url>" # 1. consultar
haul --json --video-stream 2 --audio-stream 0 "<url>" # 2. descargar exactamente esas pistas
haul --json -q 720p -c avc,m4a "<url>" # o dejar que decidan las prioridades- Con
--json, stdout contiene solo un documento JSON; el progreso y los registros van a stderr. Su campofilesenumera los archivos de salida, nuevos o ya existentes. - Sin terminal no hay nada interactivo.
-isin terminal falla con el código de salida 2 e indica las opciones que deben usarse en su lugar. - Los índices de pista de
infosiguen el orden en que elige haul; pasa los mismos-q/-cainfoy a la descarga. - En una lista de reproducción, temporada, programa o publicación con varios vídeos,
infoenumera sus páginas;-p <n>añade las pistas y los subtítulos de esa página. - Las páginas que ya están en disco se indican como
"status": "skipped", "reason": "exists", así que repetir la ejecución es seguro.
Ejemplo de respuesta JSON · una descarga correcta
Una descarga imprime:
{
"ok": true,
"command": "download",
"site": "youtube",
"input": "https://youtu.be/DdCEmlAydcw",
"title": "Inside Anthropic's molecular biology lab",
"uploader": "Anthropic",
"published": "2026-09-23T18:01:32Z",
"description": "…",
"pageCount": 1,
"files": ["/Users/me/Movies/Inside Anthropic's molecular biology lab.mp4"],
"pages": [
{
"index": 1,
"id": "DdCEmlAydcw",
"title": "Inside Anthropic's molecular biology lab",
"durationSeconds": 75,
"published": "2026-09-23T18:01:32Z",
"selected": true,
"status": "downloaded",
"file": "/Users/me/Movies/Inside Anthropic's molecular biology lab.mp4",
"sizeBytes": 3434260,
"selectedVideo": 0,
"selectedAudio": 0,
"video": [{ "index": 0, "quality": "360p", "resolution": "594x360", "codec": "AVC", "fps": 24, "bitrateKbps": 214, "sizeBytes": 2014782 }],
"audio": [{ "index": 0, "codec": "M4A", "bitrateKbps": 130, "sizeBytes": 1220994 }],
"subtitles": [{ "lang": "en" }]
}
]
}Es la salida de haul --json -q 360p -c avc,m4a …. Aquí las claves siguen el orden de lectura y las listas de pistas se recortan a las elegidas; el documento real ordena sus claves alfabéticamente e incluye todas las pistas.
Un fallo imprime "ok": false con "error": {"kind", "message", "exitCode"} y conserva las páginas completadas antes del error.
| Código de salida | Significado | error.kind |
|---|---|---|
| 0 | completado | – |
| 1 | la descarga o la extracción falló | failed |
| 2 | enlace no compatible o valor de opción incorrecto | input |
| 3 | falta una herramienta necesaria (ffmpeg, yt-dlp) | dependency |
| 4 | inicio de sesión necesario o caducado | auth |
| 64 | línea de comandos incorrecta (opción desconocida, argumento ausente) | – |
| 130 | cancelado | cancelled |
haul download --help las enumera todas. Las principales:
| Grupo | Opciones |
|---|---|
| General | --json, --config <file>, --debug |
| Pistas | -q, --quality <list>, -c, --codec <list>, --video-stream <n>, --audio-stream <n>, -i, --interactive, --video-ascending, --audio-ascending |
| Páginas | -p, --pages <spec>, --show-all, --hide-streams |
| Contenido | --audio-only, --video-only, --subtitle-only, --cover-only, --skip-subtitle, --sub-lang <list>, --auto-subtitles, --skip-cover, --skip-mux |
| Salida | -o, --output <template>, --multi-output <template>, -w, --work-dir <dir>, --lang <code>, --no-tags, --archive, --delay <seconds> |
| bilibili | --api web|tv|app|intl, --danmaku, --danmaku-only, --danmaku-format xml,ass, --cookie, --token; más opciones con --help-hidden |
| Herramientas | --ffmpeg, --yt-dlp, --use-mp4box, --mp4box, --use-aria2c, --aria2c, --aria2c-args, --single-connection |
Prioridades de calidad y códecs
Calidades y códecs. -q acepta las etiquetas que muestra la tabla de pistas: 1080p, 720p60 en YouTube; 8K, Dolby Vision, HDR, 4K, 1080P60, 1080P+, 1080P, 720P en bilibili. -c acepta av1 vp9 hevc avc para vídeo y m4a opus flac eac3 mp3 para audio. Son prioridades, no filtros: lo que no se indica va después, de mejor a peor. --video-ascending / --audio-ascending invierten el orden para obtener la descarga más pequeña.
Selección de páginas
Páginas. 8, 1,2, 3-5, 1-3,10, ALL, LAST (la última página, que es el episodio más reciente de un programa; también vale LATEST). Un enlace a un episodio, o ?p=N, selecciona esa página por sí solo. Las páginas son las partes de un vídeo de bilibili, los episodios de una temporada, programa o lista, y los vídeos de una publicación de X.
Nombres de archivo y variables de plantilla
Nombres de archivo. Un elemento con una sola página: <title>; con varias (aunque -p seleccione solo una): <title>/[P<pageNumberWithZero>]<pageTitle>, con el número rellenado con ceros según el total de páginas. Variables: <title> <pageNumber> <pageNumberWithZero> <pageTitle> <id> <site> <uploader> <uploaderId> <quality> <resolution> <fps> <videoCodec> <videoBitrate> <audioCodec> <audioBitrate> <publishDate> <pageDate>, además de las de bilibili: <bvid> <aid> <cid> <api>. Las fechas admiten un formato: <publishDate:yyyy-MM-dd>. La extensión se añade automáticamente.
YouTube · extracción, subtítulos y listas de reproducción
YouTube protege las URL de sus pistas con desafíos del reproductor que necesitan un entorno de ejecución de JavaScript, por lo que la extracción se delega en yt-dlp -J (que los ejecuta en deno); todo lo que viene después lo hace haul. Los subtítulos subidos se incorporan al archivo; los generados automáticamente, solo con --auto-subtitles. googlevideo solo sirve rangos de bytes limitados, así que las pistas se descargan por rangos de 10 MB, uno tras otro. watch?v=…&list=… descarga solo el vídeo. Mantén yt-dlp actualizado: ahí llegan las correcciones para los cambios de YouTube.
X · publicaciones públicas y audio
X no requiere iniciar sesión para las publicaciones públicas. Sus vídeos son archivos MP4 únicos con el audio incluido, por lo que la tabla solo muestra vídeo; --audio-only extrae el audio.
bilibili · inicio de sesión, calidades superiores y danmaku
bilibili se lee a través de sus propias API web, TV, APP (gRPC) e internacional. Sin sesión solo ofrece calidades bajas (normalmente hasta 480P); inicia sesión para obtener 1080P, 4K, HDR, Dolby Vision y audio Hi-Res:
haul login bilibili # escanea un código QR con la app de bilibili
haul login bilibili --from-edge # macOS: reutiliza la sesión de Microsoft Edge (o --from-chrome; --profile "Profile 1")
haul login bilibili --tv # token de acceso de TV, para --api tv / --api appLeer la sesión de un navegador solo funciona en macOS por ahora: requiere acceso total al disco para el terminal, y macOS pide una vez acceso al elemento “Safe Storage” del llavero. --danmaku guarda los comentarios superpuestos (danmaku) en XML y ASS; --danmaku-format ass conserva solo uno de los dos.
Xiaoyuzhou & Apple Podcasts · episodios y metadatos
Xiaoyuzhou y Apple Podcasts no necesitan yt-dlp: las páginas de Xiaoyuzhou incluyen el enlace de audio, y los enlaces de Apple pasan por la API pública de iTunes y el feed RSS del programa. Los episodios conservan su formato (.mp3 o .m4a), con la portada incrustada, el programa como álbum y el presentador como artista. El enlace de un programa enumera sus episodios más recientes del más antiguo al más nuevo, así que -p LAST es el más reciente.
~/.config/haul/ (o $HAUL_HOME) contiene:
| Archivo | Uso |
|---|---|
config.json |
valores predeterminados para cualquier opción |
cookie.txt, tv-token.txt, app-token.txt |
sesión de bilibili |
archives.txt |
páginas ya descargadas (--archive) |
config.json usa los nombres de las opciones en camelCase, con las de bilibili bajo "bilibili", y solo necesita lo que quieras cambiar; una lista puede ser un array o una cadena separada por comas. Las opciones de la línea de comandos tienen prioridad sobre él:
{
"workDir": "~/Movies/haul",
"codec": "avc,hevc,m4a",
"quality": "1080p,1080P",
"output": "<uploader>/<title>",
"archive": true,
"bilibili": { "danmaku": true, "danmakuFormat": ["ass"] }
}go build ./cmd/haul
go test ./... # sin red, unos segundos
HAUL_LIVE=1 go test -run Live ./internal/... # también accede a bilibili, YouTube, X y Apple PodcastsLas pruebas sin conexión nunca acceden a la red: hablan con un http.RoundTripper simulado que responde con respuestas de API grabadas y desde CDN simuladas (servidores que solo sirven rangos, conexiones cortadas, servidores que ignoran los rangos). Las pruebas de extremo a extremo combinan pistas con un ffmpeg real y comprueban el resultado con ffprobe; se omiten si ffmpeg no está instalado. Consulta la arquitectura y las convenciones en AGENTS.md.
Al publicar una etiqueta v*, GitHub Actions ejecuta las pruebas, compila para cada plataforma y publica una versión para todas ellas.
yt-dlp, FFmpeg, GPAC, aria2, pflag, x/term, rsc.io/qr y las notas sobre las API de bilibili-API-collect y bilibili-grpc-api.
Un enlace. Tu contenido.
Consigue haul · Referencia para agentes · Contribuir