6 poin oleh GN⁺ 2024-07-30 | 1 komentar | Bagikan ke WhatsApp
  • 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
      1. Opsi global: nilai default untuk semua unduhan
      2. Preset: kumpulan opsi bernama yang dipilih per unduhan di UI
      3. 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

 
GN⁺ 2024-07-30
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/

    • Saat melihat TubeArchivist, saya kurang suka karena membutuhkan 3 container. Lalu saya menemukan Pinchflat di subreddit selfhosted; berjalan sebagai satu container sehingga mudah di-deploy, dan sejauh ini bekerja dengan baik
      https://github.com/kieraneglin/pinchflat
    • Saya ingin menghindari yang ini. Penamaan filenya bergantung pada asumsi bahwa ada database
      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-dlp dengan konfigurasi dan skrip yang cerdas lebih benar-benar menangani pekerjaan pengarsipan
    • Google tidak akan membuat produknya nyaman digunakan dengan cara yang terstruktur dan canggih. Cara seperti itu terlalu menguntungkan pengguna dan memberikan terlalu banyak kontrol kepada mereka. Google tidak suka hal seperti itu
    • Ada alternatif lain yang muncul di halaman depan lebih awal hari ini: Yark: YouTube Archiver with Offline UI
      https://news.ycombinator.com/item?id=41100820
    • Saya sudah lama terpikir ingin pindah ke Tube Archivist, tetapi saya punya beberapa TB video YouTube yang sudah dikumpulkan dengan TubeSync, jadi tidak ingin mengunduh ulang
      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

    • Bukankah itu sudah bisa diselesaikan dengan langganan YouTube? Berlangganan ke 100 kanal itu dan bookmark halaman langganan, maka Anda punya feed prioritas yang hanya berisi hal-hal yang ingin ditonton
      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
    • NewPipe sangat cocok untuk kebutuhan ini. Hilangkan kolom “Default Kiosk” dari konten halaman utama dan sisakan hanya “What's New”, maka Anda hanya akan melihat video dari kanal yang dilanggan. Langganan di NewPipe sama sekali tidak terintegrasi dengan akun Google
    • Setahu saya YouTube masih memakai RSS. Bisa dicoba dengan itu
    • Saya memakai Invidious untuk kebutuhan ini. Saya suka karena ada feed prioritas khusus untuk langganan
      Kemampuan discovery-nya tidak bagus, tetapi kalau itu bukan use case yang Anda butuhkan, layak dicoba
    • Ada ekstensi fraidycat yang saya pakai untuk melakukan persis hal itu
      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-dlp dan sempat terpikir membuat aplikasi sederhana. Layak dicoba? Apakah alternatif seperti ini sudah ada?

    • Kalau mau, perangkat Windows/Linux/OSX atau mesin virtual/container di atasnya bisa menjadi server. Dengan begitu, pihak yang membuatnya tidak perlu membuat UX web dan UX native secara terpisah
      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 ada
    • Celluloid otomatis memakai yt-dlp untuk streaming jika diminta membuka URL yang didukung. Parabolic adalah alat unduhan khusus yang memakai yt-dlp
      https://flathub.org/apps/details/io.github.celluloid_player....
      https://flathub.org/apps/org.nickvision.tubeconverter
    • Kalau hanya mengunduh video YouTube, bahkan yt-dlp tidak 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 baik
      Hal yang tidak dibicarakan siapa pun adalah bahwa yt-dlp sekarang tidak bisa lagi mengunduh itag 22, dan itag 18 terkena pembatasan kecepatan. Karena itu, yt-dlp harus mengunduh file audio dan file video secara terpisah lalu menggabungkannya dengan ffmpeg
      Pendapatan 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
    • Ada juga Freetube
      https://freetubeapp.io/
    • Bisa saja Anda ingin mengunduh dan menyimpan video di NAS atau home server, bukan di perangkat yang sedang dipakai
      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 iklan

    • Saya hampir memakainya seperti itu, hanya saja tahap yt-dlp masih manual. Kalau ada plugin Jellyfin, pasti bagus sekali
  • Cukup keren. Saat ini saya memakai https://cobalt.tools, dan itu juga cukup bagus

    • Sempurna. Ada opsi untuk mengunduh format audio asli YouTube tanpa mentranskodekannya ke mp3
  • 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

    • Ada banyak alasan untuk mengunduh atau mengarsipkan alih-alih streaming dari YouTube
      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
    • Bagi saya, alasannya sama seperti orang memakai VCR. Bukan untuk “pelanggaran hak cipta”, melainkan menyimpannya untuk ditonton nanti, atau saat tidak ada koneksi internet atau koneksinya lambat
      Sebagian besar yang saya unduh saya tonton sekali lalu hapus
    • Di jaringan rumah untuk anak-anak, saya memblokir YouTube dan sebagai gantinya memberi akses ke DadTube yang saya kurasi sendiri
    • Anda merasa heran kenapa alat seperti ini ada, tetapi Anda sendiri langsung menyebut alasan terbesar mengapa alat itu perlu ada
      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
    • Karena batas penggunaan bandwidth. Kalau ingin memutar playlist video musik yang sama berulang-ulang, itu cukup banyak memakan kuota batas
  • Terkait: Yark: YouTube Archiver with Offline UI
    https://news.ycombinator.com/item?id=41100820

  • Jika salah satu server berbasis yt-dlp dibungkus 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 teknis
    Alurnya 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?