English ·
简体中文 ·
繁體中文 ·
日本語 ·
हिन्दी ·
Español ·
العربية ·
Français
বাংলা ·
Português ·
Bahasa Indonesia ·
اردو ·
Русский ·
Deutsch ·
Naijá ·
مصري
Pengunduh video dan audio lewat baris perintah, dibuat untuk manusia maupun agen AI.
Berikan sebuah tautan. Pilih aliran media Anda. Dapatkan video, audio, subtitel, bab, dan sampul dalam satu berkas.
Instalasi · Mulai cepat · Situs yang didukung · Panduan agen · Opsi · Rilis
| ↓ Media Anda, sesuai keinginan Anda | ⌘ Satu biner untuk setiap desktop | { } Siap untuk otomatisasi |
|---|---|---|
| Pilih kualitas, codec, halaman, dan nama berkas dengan istilah yang sama di lima situs | Satu biner Go untuk macOS, Linux, dan Windows, dengan unduhan rentang paralel yang dapat dilanjutkan | Satu dokumen JSON di stdout, log di stderr, kode keluar yang bermakna, dan tanpa pertanyaan interaktif jika tidak ada terminal |
| 01 / PERIKSA | 02 / PILIH | 03 / UNDUH | 04 / GABUNGKAN |
|---|---|---|---|
| Lihat setiap aliran | Atur prioritas Anda | Bawa pulang | Satukan semuanya |
| Halaman, codec, dan ukuran | Kualitas, audio, dan halaman | Per rentang atau per segmen | Trek, subtitel, dan sampul |
haul info "<url>" |
-q 720p -c avc,m4a |
haul "<url>" |
ffmpeg / MP4Box |
Lihat tampilannya di 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
…
Untuk penggunaan pribadi, penelitian, dan penggunaan nonkomersial lainnya. Anda bertanggung jawab menghormati hak cipta dan ketentuan setiap situs.
haul berjalan di macOS, Linux, dan Windows (amd64 dan arm64). haul memerlukan ffmpeg untuk penggabungan; YouTube dan X juga memerlukan yt-dlp, dan tantangan pemutar YouTube memerlukan 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, satu paket per perintah
winget install yt-dlp.yt-dlp
winget install DenoLand.DenoDi Linux, pasang yt-dlp dengan pipx atau berkas biner yt-dlp_linux dari rilisnya (yt-dlp_linux_aarch64 di arm64), bukan dari distribusi Anda: YouTube sering berubah, dan paket distribusi cepat tertinggal. Setelah memasang, buka terminal baru agar alat-alat itu ada di PATH.
Unduh arsip untuk sistem Anda dari Releases — haul-<version>-<os>-<arch>.tar.gz (.zip di Windows) — lalu letakkan haul di direktori mana pun dalam PATH Anda:
tar -xzf haul-*-darwin-arm64.tar.gz
mkdir -p ~/.local/bin && mv haul-*/haul ~/.local/bin/Alur rilis saat ini menandatangani versi macOS dan mengirimkannya untuk notarisasi Apple. Pilih haul-<version>-darwin-<arch>.pkg untuk memasang haul ke /usr/local/bin dengan tiket notarisasi terlampir. Arsip berisi program bertanda tangan yang sama, tetapi pemeriksaan pertama mungkin memerlukan internet. Rilis lama mungkin belum ditandatangani.
Bangun dari sumber · Go 1.26+
go install github.com/ac1982/haul/cmd/haul@latestatau, dari hasil klon repositori:
go build -o haul ./cmd/haulMulailah dengan sebuah tautan. Secara bawaan, haul memilih aliran terbaik yang tersedia.
haul "https://youtu.be/DdCEmlAydcw"Periksa sebelum mengunduh, atau pilih kualitas dan codec:
haul info "https://youtu.be/DdCEmlAydcw"
haul -q 720p -c avc,m4a "https://youtu.be/DdCEmlAydcw" # H.264 + AAC untuk QuickTimeReferensi perintah
| Perintah | Fungsi |
|---|---|
haul <url> [options] |
unduh (sama dengan haul download <url>) |
haul info <url> [--urls] |
tampilkan item, halaman, dan alirannya; tidak mengunduh apa pun |
haul login bilibili |
login ke bilibili untuk kualitas lebih tinggi |
haul templates |
variabel templat nama berkas |
haul --help |
situs, penggunaan agen, kode keluar, contoh |
haul download --help |
semua opsi |
| Situs | Tautan | Memerlukan |
|---|---|---|
| YouTube | youtube.com/watch?v=…, youtu.be/…, /shorts/…, /embed/…, /live/… |
yt-dlp, deno |
| X | x.com/<user>/status/<id>, twitter.com/…; /video/<n> memilih satu video dari sebuah kiriman |
yt-dlp |
weibo.com/<uid>/<id>, weibo.com/tv/show/…, video.weibo.com/show?fid=…, m.weibo.cn/status/…, t.cn/… |
yt-dlp | |
| bilibili | video, bangumi, kursus, koleksi, seri, favorit, ruang pengguna, b23.tv, ID polos BV… av… ep… ss… md… |
– |
| Xiaoyuzhou | xiaoyuzhoufm.com/episode/<id>, /podcast/<id> |
– |
| Apple Podcasts | podcasts.apple.com/<cc>/podcast/<name>/id<show>, dengan ?i=<episode> untuk satu episode |
– |
Audio saja
haul --audio-only "https://youtu.be/DdCEmlAydcw"
haul --audio-only -c m4a "https://youtu.be/DdCEmlAydcw" # AAC, bukan OpusBeberapa bagian, satu musim penuh, atau episode terbaru
# Bagian pilihan, disimpan ke folder Movies
haul -p 1-3,10 -w ~/Movies "https://www.bilibili.com/video/BV1Wv411h7kN"
# Semua episode dalam satu musim
haul -p ALL "https://www.bilibili.com/bangumi/play/ss33073"
# Episode podcast terbaru
haul -p LAST "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
# Semua video dalam kiriman X
haul -p ALL "https://x.com/<user>/status/<id>"Berkas yang tertata, subtitel, atau pilihan interaktif
haul -o "<uploader>/<title> [<quality>]" "https://youtu.be/DdCEmlAydcw"
haul --sub-lang en,zh "https://youtu.be/DdCEmlAydcw" # hanya bahasa subtitel ini
haul -i "BV1qt4y1X7TW" # pilih aliran dengan tombol panahhaul --help memuat semua yang dibutuhkan agen; llms.txt adalah panduan yang sama dalam bentuk berkas. Versi singkatnya:
haul info --json "<url>" # 1. periksa
haul --json --video-stream 2 --audio-stream 0 "<url>" # 2. unduh tepat aliran-aliran itu
haul --json -q 720p -c avc,m4a "<url>" # atau biarkan prioritas yang memilih- Dengan
--json, stdout hanya berisi satu dokumen JSON; progres dan log masuk ke stderr. Kolomfiles-nya mencantumkan berkas keluaran, baik yang baru maupun yang sudah ada. - Tidak ada yang interaktif tanpa terminal.
-itanpa terminal gagal dengan kode keluar 2 dan menyebutkan opsi yang harus dipakai sebagai gantinya. - Indeks aliran di
infomengikuti urutan pemilihan haul; berikan-q/-cyang sama keinfodan ke unduhan. - Untuk daftar putar, musim, acara, atau kiriman multivideo,
infomencantumkan halamannya;-p <n>menambahkan aliran dan subtitel halaman itu. - Halaman yang sudah ada di disk dilaporkan sebagai
"status": "skipped", "reason": "exists", sehingga aman dijalankan ulang.
Contoh respons JSON · unduhan yang berhasil
Sebuah unduhan mencetak:
{
"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" }]
}
]
}Itu hasil haul --json -q 360p -c avc,m4a …. Di sini kunci disusun menurut urutan baca dan daftar aliran dipangkas menjadi yang terpilih saja; dokumen aslinya mengurutkan kuncinya menurut abjad dan mencantumkan setiap aliran.
Kegagalan mencetak "ok": false dengan "error": {"kind", "message", "exitCode"}, dan tetap menyertakan halaman yang selesai sebelumnya.
| Kode keluar | Arti | error.kind |
|---|---|---|
| 0 | selesai | – |
| 1 | unduhan atau ekstraksi gagal | failed |
| 2 | tautan tidak didukung atau nilai opsi tidak valid | input |
| 3 | alat yang diperlukan tidak ada (ffmpeg, yt-dlp) | dependency |
| 4 | perlu login atau login kedaluwarsa | auth |
| 64 | baris perintah tidak valid (flag tidak dikenal, argumen kurang) | – |
| 130 | dibatalkan | cancelled |
haul download --help mencantumkan semuanya. Opsi utama:
| Grup | Opsi |
|---|---|
| Umum | --json, --config <file>, --debug |
| Aliran | -q, --quality <list>, -c, --codec <list>, --video-stream <n>, --audio-stream <n>, -i, --interactive, --video-ascending, --audio-ascending |
| Halaman | -p, --pages <spec>, --show-all, --hide-streams |
| Konten | --audio-only, --video-only, --subtitle-only, --cover-only, --skip-subtitle, --sub-lang <list>, --auto-subtitles, --skip-cover, --skip-mux |
| Keluaran | -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; lainnya dengan --help-hidden |
| Alat | --ffmpeg, --yt-dlp, --use-mp4box, --mp4box, --use-aria2c, --aria2c, --aria2c-args, --single-connection |
Prioritas kualitas dan codec
Kualitas dan codec. -q menerima label yang ditampilkan tabel aliran: 1080p, 720p60 di YouTube; 8K, Dolby Vision, HDR, 4K, 1080P60, 1080P+, 1080P, 720P di bilibili. -c menerima av1 vp9 hevc avc untuk video dan m4a opus flac eac3 mp3 untuk audio. Keduanya adalah prioritas, bukan filter: apa pun yang tidak dicantumkan menyusul setelahnya, dimulai dari yang terbaik. --video-ascending / --audio-ascending membalik urutannya untuk unduhan terkecil.
Pemilihan halaman
Halaman. 8, 1,2, 3-5, 1-3,10, ALL, LAST (halaman terakhir, yaitu episode terbaru sebuah acara; LATEST juga bisa). Tautan ke satu episode, atau ?p=N, memilih halaman itu saja. Halaman adalah bagian dari video bilibili, episode dari musim, acara, atau daftar, dan video dalam kiriman X.
Nama berkas dan variabel templat
Nama berkas. Item dengan satu halaman: <title>; dengan beberapa halaman (bahkan saat -p hanya memilih satu): <title>/[P<pageNumberWithZero>]<pageTitle>, diberi nol di depan sesuai jumlah halaman. Variabel: <title> <pageNumber> <pageNumberWithZero> <pageTitle> <id> <site> <uploader> <uploaderId> <quality> <resolution> <fps> <videoCodec> <videoBitrate> <audioCodec> <audioBitrate> <publishDate> <pageDate>, ditambah variabel khusus bilibili <bvid> <aid> <cid> <api>. Tanggal dapat diberi format: <publishDate:yyyy-MM-dd>. Ekstensi ditambahkan otomatis.
YouTube · ekstraksi, subtitel, dan daftar putar
YouTube melindungi URL alirannya dengan tantangan pemutar yang memerlukan runtime JavaScript, sehingga ekstraksi diserahkan ke yt-dlp -J (yang menjalankannya di deno); semua langkah setelahnya dikerjakan haul sendiri. Subtitel unggahan digabungkan ke berkas; subtitel yang dibuat otomatis hanya dengan --auto-subtitles. googlevideo hanya melayani rentang byte terbatas, sehingga trek diambil per rentang 10 MB. watch?v=…&list=… hanya mengunduh videonya. Selalu perbarui yt-dlp: di sanalah perbaikan untuk perubahan YouTube masuk.
X · kiriman publik dan audio
Kiriman publik X tidak memerlukan login. Videonya berupa satu berkas MP4 dengan audio di dalamnya, sehingga tabel hanya mencantumkan video; --audio-only mengekstrak audionya.
bilibili · login, kualitas lebih tinggi, dan danmaku
bilibili dibaca melalui API web, TV, APP (gRPC), dan internasional miliknya sendiri. Tanpa login, hanya kualitas yang lebih rendah yang tersedia (biasanya hingga 480P); login untuk 1080P, 4K, HDR, Dolby Vision, dan audio Hi-Res:
haul login bilibili # pindai kode QR dengan aplikasi bilibili
haul login bilibili --from-edge # macOS: pakai ulang login Microsoft Edge (atau --from-chrome; --profile "Profile 1")
haul login bilibili --tv # token akses TV, untuk --api tv / --api appUntuk saat ini, membaca login dari peramban hanya berfungsi di macOS: terminal memerlukan Full Disk Access, dan macOS meminta izin sekali untuk item keychain "Safe Storage". --danmaku menyimpan komentar berjalan sebagai XML dan ASS; --danmaku-format ass hanya menyimpan salah satunya.
Xiaoyuzhou & Apple Podcasts · episode dan metadata
Xiaoyuzhou dan Apple Podcasts tidak memerlukan yt-dlp: halaman Xiaoyuzhou memuat tautan audionya, sedangkan tautan Apple diproses lewat API iTunes publik dan feed RSS acara. Episode mempertahankan formatnya (.mp3 atau .m4a) dengan sampul tertanam, nama acara sebagai album, dan pembawa acara sebagai artis. Tautan acara mencantumkan episode terkininya dari yang terlama, sehingga -p LAST adalah yang terbaru.
~/.config/haul/ (atau $HAUL_HOME) berisi:
| Berkas | Fungsi |
|---|---|
config.json |
nilai bawaan untuk opsi apa pun |
cookie.txt, tv-token.txt, app-token.txt |
login bilibili |
archives.txt |
halaman yang sudah diunduh (--archive) |
config.json memakai nama opsi dalam camelCase, opsi bilibili di bawah "bilibili", dan hanya perlu berisi yang diubah; daftar bisa berupa array atau string yang dipisahkan koma. Flag baris perintah mengesampingkannya:
{
"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 ./... # luring, beberapa detik
HAUL_LIVE=1 go test -run Live ./internal/... # juga mengakses bilibili, YouTube, X, dan Apple PodcastsRangkaian pengujian luring tidak pernah menyentuh jaringan: pengujian berbicara dengan stub http.RoundTripper yang menjawab dari respons API rekaman dan CDN simulasi (server yang hanya melayani rentang, koneksi terputus, server yang mengabaikan rentang). Pengujian menyeluruh menggabungkan trek dengan ffmpeg asli dan memeriksa hasilnya dengan ffprobe; pengujian ini dilewati jika ffmpeg tidak terpasang. Lihat AGENTS.md untuk arsitektur dan konvensinya.
Mendorong tag v* akan menjalankan pengujian, kompilasi silang, dan penerbitan rilis untuk setiap platform melalui GitHub Actions.
yt-dlp, FFmpeg, GPAC, aria2, pflag, x/term, rsc.io/qr, serta catatan API dari bilibili-API-collect dan bilibili-grpc-api.
Satu tautan. Media milik Anda.
Dapatkan haul · Referensi agen · Berkontribusi