- MeTube adalah UI web self-hosted untuk
yt-dlp yang memungkinkan Anda mengunduh media dari YouTube dan puluhan situs yang didukung langsung dari browser
- Mendukung pengunduhan video, audio, subtitle, dan thumbnail; playlist dan channel juga dapat diunduh dengan menyesuaikan format keluaran dan opsi unduhan
- Dapat berlangganan channel dan playlist untuk memeriksa item baru secara berkala, lalu otomatis memasukkan unggahan baru ke antrean
- Dijalankan dengan Docker atau docker-compose, dan pengaturan seperti jumlah unduhan bersamaan, jalur penyimpanan, templat nama file, HTTPS, CORS, tema, serta level log dikonfigurasi melalui variabel lingkungan
- Opsi
yt-dlp digabungkan dalam urutan opsi global, preset, lalu override per unduhan; karena override per unduhan mengizinkan input opsi arbitrer, fitur ini hanya boleh diaktifkan di lingkungan tepercaya
Apa yang dilakukan MeTube
- MeTube adalah UI web self-hosted berbasis
yt-dlp
- Dapat mengunduh media dari YouTube dan puluhan situs yang didukung oleh
yt-dlp
- Fitur utamanya meliputi:
- Mengunduh video, audio, subtitle, thumbnail dari UI browser
- Mengunduh playlist dan channel
- Mengonfigurasi jalur keluaran dan opsi unduhan
- Berlangganan channel·playlist lalu memeriksa item baru secara berkala
- Menambahkan unggahan baru secara otomatis ke antrean unduhan
Cara menjalankan
- Dapat langsung dijalankan dengan Docker
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
- Contoh docker-compose menggunakan image
ghcr.io/alexta69/metube, dan me-mount /downloads di container ke direktori unduhan host
services:
metube:
image: ghcr.io/alexta69/metube
container_name: metube
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- /path/to/downloads:/downloads
Pengaturan unduhan dan penyimpanan
- MAX_CONCURRENT_DOWNLOADS membatasi jumlah unduhan yang dapat berjalan bersamaan, dengan nilai default
3
- Jika DELETE_FILE_ON_TRASHCAN bernilai
true, saat item di bagian “Completed” pada UI dikirim ke tempat sampah, file unduhan di server juga akan dihapus
- DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT menentukan jumlah maksimum item yang dapat diunduh dari playlist; nilai default
0 berarti tanpa batas
- Nilai default terkait langganan juga disesuaikan melalui variabel lingkungan
- SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: interval pemeriksaan otomatis per langganan, default
60 menit
- SUBSCRIPTION_SCAN_PLAYLIST_END: jumlah maksimum item playlist·channel yang diambil saat memeriksa langganan, default
50
- SUBSCRIPTION_MAX_SEEN_IDS: batas atas jumlah ID video yang disimpan per langganan, default
50000
- DOWNLOAD_DIR adalah jalur penyimpanan unduhan, dan pada image Docker default-nya adalah
/downloads
- Unduhan khusus audio dapat memiliki jalur penyimpanan terpisah melalui AUDIO_DOWNLOAD_DIR
- Melalui CUSTOM_DIRS dan CREATE_CUSTOM_DIRS, Anda dapat memilih subdirektori unduhan dari UI atau membuatnya otomatis
- STATE_DIR menyimpan file status persisten seperti
queue.json, pending.json, completed.json, subscriptions.json
- TEMP_DIR adalah jalur file unduhan sementara; menggunakan SSD atau filesystem berbasis RAM dapat membantu performa, tetapi filesystem berbasis RAM dapat menghalangi pelanjutan unduhan
Nama file dan opsi yt-dlp
- OUTPUT_TEMPLATE adalah templat nama file unduhan, dengan default
%(title)s.%(ext)s
- Templat untuk unduhan chapter, playlist, dan channel dapat diatur secara terpisah
-
OUTPUT_TEMPLATE_CHAPTER
-
OUTPUT_TEMPLATE_PLAYLIST
- OUTPUT_TEMPLATE_CHANNEL
- Opsi
yt-dlp ditentukan sebagai objek JSON
- Lapisan opsi diterapkan dari cakupan yang lebih luas ke yang lebih sempit
- Opsi global: nilai default untuk semua unduhan
- Preset: kumpulan opsi bernama yang dipilih per unduhan di UI
- Override per unduhan: opsi input bebas yang hanya diterapkan ke unduhan tertentu
- Jika ada key yang bertabrakan, pengaturan yang lebih spesifik mendapat prioritas
- Override per unduhan lebih diprioritaskan daripada preset
- Preset lebih diprioritaskan daripada opsi global
- Jika nilai opsi di JSON diatur ke
null, opsi tersebut dihapus untuk unduhan itu
YTDL_OPTIONS_FILE dan YTDL_OPTIONS_PRESETS_FILE memantau perubahan file dan dimuat ulang otomatis, sehingga restart container tidak diperlukan
- Jika file dan variabel lingkungan digunakan bersamaan dan mendefinisikan key atau nama preset yang sama, pengaturan file mendapat prioritas
Preset dan override
- Preset ditampilkan sebagai “Option Presets” di bawah Advanced Options pada UI
- Contoh preset melakukan hal berikut:
- sponsorblock: menghapus segmen sponsor, selfpromo, interaction
- embed-subs: mengunduh subtitle bahasa Inggris dan Jerman lalu menanamkannya ke file video
- limit-rate: membatasi kecepatan unduhan menjadi sekitar 5 MB/s
- Jika beberapa preset dipilih, semuanya diterapkan berurutan, dan opsi yang sama pada preset belakangan akan menimpa preset sebelumnya
- Jika ALLOW_YTDL_OPTIONS_OVERRIDES diatur ke
true, field JSON input bebas “Custom yt-dlp Options” akan muncul di UI
- Override per unduhan dinonaktifkan secara default
- Jika fitur ini diaktifkan, pengguna yang memiliki akses UI dapat memberikan opsi API
yt-dlp arbitrer, dan tergantung opsinya, eksekusi perintah arbitrer di dalam container mungkin dapat terjadi; karena itu hanya aktifkan di lingkungan tepercaya
- MeTube memaksa perilaku
extract_flat dan noplaylist miliknya sendiri pada tahap pengambilan metadata awal, dan preset tidak dapat menimpa key pada tahap ini
Cookie, integrasi browser, eksekusi cepat
- Saat perlu mengunduh video yang dibatasi atau privat, cookie browser dapat digunakan
- Ekspor cookie sebagai
cookies.txt dengan ekstensi Firefox atau Chrome
- Unggah melalui Upload Cookies di Advanced Options MeTube
- Hapus cookie yang telah diunggah melalui Delete Cookies di bagian yang sama
- Ekstensi browser memungkinkan Anda mengirim video langsung ke MeTube dengan klik kanan pada video
- Untuk digunakan pada halaman HTTPS, instance MeTube harus berada di belakang reverse proxy HTTPS
- Karena ekstensi mengirim request dari origin
chrome-extension://... atau moz-extension://..., pengaturan CORS_ALLOWED_ORIGINS=* diperlukan
- Ekstensi Chrome dapat dipasang dari Google Chrome Webstore atau dari source
- Ekstensi Firefox dapat dipasang dari Firefox Addons atau menggunakan source
- iOS Shortcut dapat mengirim URL ke MeTube dari menu berbagi Safari
- Bookmarklet mengirim halaman web yang sedang dibuka ke MeTube; pada halaman HTTPS, MeTube harus dikonfigurasi dengan HTTPS atau berada di belakang reverse proxy HTTPS
- Karena bookmarklet mengirim request lintas origin dari origin halaman saat ini ke MeTube, origin situs yang akan digunakan harus ditambahkan ke CORS_ALLOWED_ORIGINS
- MeTube extension untuk Raycast memungkinkan penambahan video langsung dari Raycast
Web server, HTTPS, reverse proxy
- Pengaturan terkait web server disesuaikan melalui variabel lingkungan
- HOST default-nya
0.0.0.0
- PORT default-nya
8081
- URL_PREFIX digunakan untuk deployment pada subpath di belakang reverse proxy
- PUBLIC_HOST_URL dan PUBLIC_HOST_AUDIO_URL mengubah URL dasar untuk tautan unduhan file yang sudah selesai
- Jika HTTPS diatur ke
true dan CERTFILE, KEYFILE ditentukan, MeTube berjalan dalam mode HTTPS
- Reverse proxy dapat digunakan untuk terminasi HTTPS atau autentikasi
- Image
linuxserver/swag menyertakan potongan konfigurasi subfolder dan subdomain untuk MeTube, serta konfigurasi autentikasi Authelia
- Contoh NGINX mem-proxy jalur
/metube/ ke http://metube:8081, dan mengatur header Upgrade serta Connection untuk perilaku WebSocket
- Contoh reverse proxy untuk Apache dan Caddy juga disediakan
Pembaruan, pemecahan masalah, pengembangan lokal
- MeTube bergantung pada yt-dlp, dan karena perubahan layout situs video,
yt-dlp perlu sering diperbarui
- Saat rilis stabil
yt-dlp baru keluar, image Docker MeTube baru dipublikasikan secara otomatis
- watchtower dapat digunakan sebagai cara menjaga container tetap terbaru
- Untuk mengikuti channel nightly
yt-dlp, atur YTDL_NIGHTLY_UPDATE_TIME ke waktu dalam format HH:MM untuk melakukan upgrade harian dan restart MeTube
- Untuk masalah autentikasi, post-processing, izin, dan
YTDL_OPTIONS, disarankan men-debug terlebih dahulu langsung di yt-dlp, lalu membawa opsi yang sudah berfungsi ke MeTube
- Build dan eksekusi lokal memerlukan Node.js 22+ dan Python 3.13
- UI dibuild dengan
pnpm, dependensi Python dipasang dengan uv sync, lalu dijalankan dengan uv run python3 app/main.py
- Image Docker dapat dibuild secara lokal dengan
docker build -t metube ., dan UI juga ikut dibuild dalam proses ini
1 komentar
Pendapat di Hacker News
Tube Archivist juga layak dipertimbangkan. Memang berlebihan kalau hanya ingin mengunduh beberapa video, tetapi saya memakainya untuk menyimpan dan mengindeks kanal teknologi favorit
Karena bisa melakukan pencarian teks penuh dan metadata tidak hanya pada transkrip/subtitel, tetapi juga komentar, judul, dan deskripsi, secara menyebalkan ini jauh lebih baik daripada yang disediakan Alphabet
https://www.tubearchivist.com/
https://github.com/kieraneglin/pinchflat
Kalau hanya penyimpanan sementara, itu bisa dimaklumi, tetapi alat yang menyebut dirinya software “arsip” harus berasumsi bahwa dirinya mungkin tidak akan bertahan lebih lama daripada data yang ingin dilestarikannya
Saya sempat berharap karena terlihat seperti klon PeerTube dengan fitur unduh, tetapi setelah melihat hasilnya jadi kurang tertarik; memakai
yt-dlpdengan konfigurasi dan skrip yang cerdas lebih benar-benar menangani pekerjaan pengarsipanhttps://news.ycombinator.com/item?id=41100820
Untungnya saya masih punya string format yang dipakai untuk menyimpan nama file, dan karena TubeSync memakai backend Django dan PostgreSQL, mungkin bisa dikaitkan dengan ID YouTube. Meski begitu, migrasinya tampak seperti mimpi buruk
Yang benar-benar saya inginkan adalah YouTube TiVo
Ada sekitar 100 kanal yang saya ikuti hampir secara religius, tetapi jarang mengunggah, dan saya sama sekali tidak ingin melewatkan video dari kanal-kanal ini
Saya juga tidak ingin menyisir ratusan video baru dari kanal-kanal yang mengunggah empat kali sehari di YouTube hanya untuk menemukan 1–2 video yang benar-benar ingin saya tonton. Pada akhirnya pasti ada yang terlewat
Akan bagus jika ada feed prioritas yang hanya berisi hal-hal yang benar-benar ingin atau perlu saya tonton, dan lebih bagus lagi kalau semuanya bisa diunduh lalu ditonton lewat DLNA
Membuat kita tidak melewatkan hal yang kita sukai bukanlah cara YouTube beroperasi. Cara YouTube adalah membuat kita menonton video 3 menit yang dipanjangkan menjadi 18–22 menit sambil mengikat umpan balik ke wajah kita
Kalau alasannya tidak ingin membuat akun, itu bisa dimengerti dan NewPipe cocok, tetapi agak aneh mengatakan “membuat kita tidak melewatkan hal yang kita sukai bukanlah cara YouTube” padahal ada halaman khusus yang menampilkan video dari kanal pilihan sendiri secara kronologis
Kemampuan discovery-nya tidak bagus, tetapi kalau itu bukan use case yang Anda butuhkan, layak dicoba
https://fraidyc.at/
Ada satu hal yang tidak saya pahami. Kenapa harus di-host di server? Bukankah cukup berupa aplikasi mandiri yang berjalan di Windows/Linux/mac?
Belakangan ini saya mulai memakai
yt-dlpdan sempat terpikir membuat aplikasi sederhana. Layak dicoba? Apakah alternatif seperti ini sudah ada?Banyak orang menjalankan aplikasi self-hosting di server eksternal, homelab, atau kombinasi keduanya, lalu menyiapkan sumber daya itu seperti infrastruktur yang memiliki backup dan sebagainya. Jika PC/laptop/tablet/ponsel dibiarkan sebagai klien atau cache yang relatif sederhana, saat hilang atau rusak, penggantiannya mudah karena cukup mengambil kembali konten lokal yang tersinkronisasi dengan server. Ini salah satu alasan mengapa pola self-hosting seperti ini populer
Saya pernah melihat beberapa aplikasi desktop yang membungkus
yt-dlp. Saya belum pernah memakainya langsung, jadi sulit berkomentar soal stabilitas atau keandalannya, tetapi kalau bukan ingin membuat yang baru sekadar untuk bersenang-senang, sebaiknya cari dulu. Mungkin yang Anda inginkan sudah adayt-dlpuntuk streaming jika diminta membuka URL yang didukung. Parabolic adalah alat unduhan khusus yang memakaiyt-dlphttps://flathub.org/apps/details/io.github.celluloid_player....
https://flathub.org/apps/org.nickvision.tubeconverter
yt-dlptidak selalu diperlukan. Itu bisa dilakukan dengan kode dan kompleksitas yang jauh lebih sedikit, dan saya memakainya sebagai program C yang sangat kecil. Skrip shell kecil pun bekerja dengan cukup baikHal yang tidak dibicarakan siapa pun adalah bahwa
yt-dlpsekarang tidak bisa lagi mengunduh itag 22, dan itag 18 terkena pembatasan kecepatan. Karena itu,yt-dlpharus mengunduh file audio dan file video secara terpisah lalu menggabungkannya denganffmpegPendapatan iklan YouTube baru saja meleset dari estimasi konsensus. Aksesibilitas video YouTube mungkin akan makin memburuk ke depannya
Kalau Anda tidak punya kebiasaan memilih format tertentu, kemungkinan besar Anda tidak terlalu merasakannya. Misalnya, sebagian orang selama bertahun-tahun hanya memakai itag 18 dan 22
https://freetubeapp.io/
Aplikasi web yang di-Docker-kan jauh lebih mudah dibuat dan dipelihara daripada membuat masing-masing klien desktop/mobile untuk Windows, macOS, Android, iOS, dan Linux
Akan bagus kalau ada antarmuka yang terintegrasi dengan Jellyfin. Misalnya bisa mencari YouTube, mengunduhnya dengan
yt-dlp, lalu streaming lewat Jellyfin tanpa iklanyt-dlpmasih manual. Kalau ada plugin Jellyfin, pasti bagus sekaliCukup keren. Saat ini saya memakai https://cobalt.tools, dan itu juga cukup bagus
Saya baru tahu bahwa Brave untuk iOS punya tombol playlist untuk mengunduh video YouTube dan menyimpannya di perangkat. Bisa PiP dan pemutaran offline, juga tanpa iklan
Ini memakai lisensi terbuka berbasis backend iOS Mozilla, dan saya penasaran kenapa tidak lebih banyak aplikasi melakukan hal yang sama. Mereka menemukan cara agar Apple menerimanya, dan CEO-nya juga pernah menulis di sini untuk membela bahwa teknik itu sah
Pada dasarnya, ini hanya bekerja setelah video dimuat di dalam situs web YouTube biasa, dan caranya seperti tombol mode baca yang berlaku bukan hanya untuk YouTube, tetapi untuk konten video apa pun
Saya agak heran ada begitu banyak alat mirroring YouTube. Kalau memakai alat seperti ini, apa alasan untuk mengunduh/mengarsipkan video alih-alih langsung streaming dari YouTube?
Saya paham bahwa terkadang menyimpan arsip itu berguna untuk berjaga-jaga kalau video dihapus dari YouTube, tetapi dalam kasus saya itu sangat jarang terjadi. Setelah menonton video, selesai; kalau tidak bisa menontonnya lagi pun tidak terlalu masalah
Pertama, menghapus iklan adalah alasan yang cukup besar bagi banyak orang
Kedua, seperti yang sudah ditulis, jika video atau seluruh channel diturunkan karena klaim hak cipta atau laporan lain, Anda tidak bisa streaming lagi. Tergantung konten yang ditonton, ini bisa jauh lebih penting bagi sebagian orang dibandingkan bagi Anda
Ketiga, video bisa diunduh untuk pemutaran offline. Aplikasi YouTube resmi juga bisa, tetapi harus membayar Premium, harganya terasa berlebihan, dan tetap terdampak masalah penghapusan
Keempat, indeks lokal. Jika ingin merujuk video untuk ditonton lagi atau dibagikan nanti, menatanya dalam struktur sendiri bisa lebih nyaman daripada menyimpan bookmark salinan YouTube atau mencarinya setiap kali
Alasan-alasan di atas bisa bercampur, dan mungkin ada alasan lain yang tidak saya pertimbangkan atau ingat
Sebagian besar yang saya unduh saya tonton sekali lalu hapus
Selain itu, kadang streaming YouTube juga tidak memungkinkan. Internet bisa putus, paket seluler luar negeri bisa terlalu mahal, atau Anda sekadar ingin menghilangkan iklan yang menyebalkan
Terkait: Yark: YouTube Archiver with Offline UI
https://news.ycombinator.com/item?id=41100820
Jika salah satu server berbasis
yt-dlpdibungkus dengan alat pembuat image yang sangat sederhana seperti Pi-hole dan aplikasi klien frontend yang layak untuk pemutaran, menurut saya itu bisa menjadi sangat populer seperti Pi-hole yang menyebar ke pengguna yang kurang teknisAlurnya kira-kira: beli Raspberry Pi, bakar image ke kartu microSD, pilih channel YouTube favorit, pasang aplikasi klien, lalu semua konten YouTube favorit tersedia secara lokal tanpa iklan
Saat ini saya memakai TubeSync. Fiturnya sederhana dan bug-nya juga banyak, tetapi bagi saya cukup berjalan dengan baik
Yang perlu dilakukan hanya berlangganan channel atau playlist, mengunduh video ke path tertentu, dan memeriksa konten baru sekali sehari
UX yang dibutuhkan hanya pengaturan channel; setelah itu cukup simpan file, lalu biarkan Plex mengurus sisanya. Ada yang tahu pilihan yang lebih baik?