
Pendahuluan
Halo teman-teman, bertepatan dengan Hari Pahlawan (10 November) kali ini saya ingin berbagi hasil eksperimen kecil-kecilan saya: sebuah aplikasi web sederhana bernama HLS Downloader.
Ngomong-ngomong soal hari ini β pemberitaan sedang ramai dengan kabar bahwa Wakil Presiden Gibran Rakabuming menyampaikan niat mengundurkan diri kepada Presiden Prabowo pagi tadi, di tengah polemik putusan MK dan MA perihal ijazahnya. Sementara jagat politik bergejolak, di dunia engineering kita juga punya “pahlawan” versi sendiri: alat-alat kecil yang diam-diam menyelamatkan hari-hari kita. π
Ceritanya berawal dari kebutuhan sepele β saya sering mengunduh video streaming berformat HLS (file .m3u8) memakai ffmpeg lewat command line, kira-kira seperti ini:
ffmpeg -i "https://example.com/stream.m3u8" -c copy -bsf:a aac_adtstoasc video_ffmpeg.mp4
Lama-kelamaan bosan juga mengetik perintah yang sama berulang kali. Jadi saya iseng-iseng membungkusnya menjadi aplikasi web β Golang sebagai backend dan HTML/CSS/JS biasa untuk antarmukanya. Sekarang tinggal copy-paste URL, isi nama file, klik tombol β selesai.
Apa saja yang bisa dilakukan?
- Tempel satu atau banyak URL sekaligus β bisa tautan halaman video, tautan YouTube, Instagram, TikTok, playlist
.m3u8, atau file.mp4langsung - Unduhan paralel β maksimal 6 job berjalan bersamaan, sisanya mengantre otomatis
- Pilihan format per baris β
Video + Audio(mp4),Video only(tanpa suara), atauAudio only(mp3) - Cancel job β unduhan yang sedang berjalan bisa dihentikan kapan saja
- Status langsung (real-time) β
queuedβrunningβdone/error, lengkap dengan pesan error dari ffmpeg - Nama file dibersihkan otomatis β spasi dan karakter spesial menjadi
_, lalu ditambah suffix_ffmpeg.mp4. Contoh:My Movie (2024)!βMy_Movie_2024_ffmpeg.mp4
Cara kerjanya secara singkat
Backend-nya ditulis dengan clean architecture: handlers hanya mengurus request/response HTTP, usecases berisi logika bisnis (antrean job, semaphore pembatas concurrency, eksekusi ffmpeg), repositories menyimpan state job di memori, dan entities mendefinisikan tipe Job.
Untuk tautan YouTube/Instagram/TikTok, aplikasi menyerahkan pekerjaan berat kepada yt-dlp. Untuk URL .m3u8 langsung, setiap job pada dasarnya menjalankan perintah ffmpeg di atas β -c copy berarti hanya remux tanpa encode ulang, jadi cepat dan lossless.
Bonus: Audio Splitter
Di tengah pengerjaan, saya menambahkan satu fitur lagi β Audio Splitter. Unggah sebuah lagu, dan aplikasi akan memisahkannya menjadi stem-nya (vokal, drum, bass, gitar, piano, musik) menggunakan demucs model htdemucs_6s. Cocok buat yang hobi karaoke atau mau belajar mixing. π

Cara menjalankannya
Semua dependensi (Go, ffmpeg, yt-dlp, demucs) sudah saya bungkus dalam satu image Docker, jadi tidak perlu menginstal apa pun selain Docker. Image-nya tersedia di Docker Hub: indraoctama/hls-downloader
docker pull indraoctama/hls-downloader
docker run -d --name hls-downloader \
-p 6969:6969 \
-v ~/Downloads:/downloads \
indraoctama/hls-downloader
Lalu buka http://localhost:6969 di browser. Hasil unduhan tersimpan langsung di folder Downloads laptop kamu berkat volume mount -v ~/Downloads:/downloads.
Untuk mematikan: docker stop hls-downloader. Untuk menjalankan lagi: docker start hls-downloader.
Penutup
Eksperimen ini mengingatkan saya bahwa alat yang dibuat “iseng” sering kali justru yang paling sering dipakai. Satu perintah ffmpeg yang tadinya dihafal dan diketik manual, sekarang menjadi aplikasi yang bisa dijalankan siapa saja cukup dengan satu docker run.
Kalau kamu mencobanya dan menemukan bug atau punya ide fitur, silakan sampaikan lewat kolom komentar. Selamat mencoba, dan selamat Hari Pahlawan! π