✨ Tentang Project
Lumenfetch adalah CLI Python buat download video YouTube jadi MP4 atau ekstrak audionya jadi MP3 - cukup paste link, dia otomatis deteksi judul, durasi, dan estimasi ukuran, lalu kasih kamu opsi quality yang relevan. Didukung yt-dlp di belakang layar, plus curl_cffi buat lolos bot-check YouTube.
"Satu command, langsung MP4/MP3."
🎯 Fitur
| Fitur | Keterangan |
|---|---|
| 🔍 Auto-detect | Judul, durasi, dan estimasi ukuran terdeteksi otomatis |
| 🎛 Opsi dinamis | Menu quality menyesuaikan (video / audio saja) |
| 🎞 Video MP4 | Pilihan quality Best/1080p/720p/480p/360p/Worst, thumbnail otomatis ter-embed |
| 🎵 Audio MP3 | Pilihan bitrate Best/320kbps/192kbps/128kbps |
| 📜 Playlist | Default video pertama saja; --playlist all untuk semua sekaligus |
| 💬 Subtitle & metadata | Download subtitle (SRT) + embed ke MP4, opsional via flag/CLI |
| 📋 Auto-paste clipboard | Kalau ada link valid di clipboard, langsung ditawarkan tanpa perlu paste manual - tidak akan nanya ulang isi clipboard yang sama berkali-kali |
| 📊 Progress bar real-time | Kecepatan, ukuran, dan estimasi waktu tersisa lewat rich |
| 📐 Estimasi ukuran & waktu | Muncul di menu pilih quality (video/audio), dihitung dari data yt-dlp + kecepatan rata-rata download kamu sebelumnya |
| 🔄 Auto-retry | Error koneksi dicoba ulang otomatis (default 3x), error fatal (private/invalid) langsung dilaporkan |
| 🗂 Riwayat download | 20 entri terakhir tersimpan, bisa dilihat kapan saja lewat command history |
| ⚙️ Pengaturan persisten | Folder download (default: folder Downloads OS, ganti kapan saja), max retry, auto-paste, dan naming template diingat lewat config.json |
| 🍪 Cookies browser/file | Opsional, buat video age-restricted/private - dari Chrome/Firefox/Edge/dll atau file cookies.txt |
| 🧼 Nama file aman | Karakter ilegal disanitasi, duplikat otomatis dikasih suffix (1), (2), dst |
| 🔔 Auto-check update yt-dlp | Tiap dibuka, dicek ke PyPI apakah ada versi yt-dlp lebih baru - gagal cek (mis. offline) diam-diam diabaikan |
📦 Requirements
- Python 3.9 atau lebih baru
- Koneksi internet
ffmpeg tidak perlu diinstall manual - Lumenfetch otomatis mengunduh dan memakai versi bundled-nya sendiri (lewat
static-ffmpeg) begitu pertama kali dijalankan, persis seperti cara kerjaffmpeg-staticdi project Node.js.
Belum pernah pakai terminal? Ikuti ini dulu
🪟 Cara buka terminal di Windows
- Tekan tombol Windows, ketik
PowerShell, lalu tekan Enter - Jendela hitam/biru akan terbuka. Itu tempat kamu mengetik perintah
- Semua perintah
python ...ataupip ...di panduan ini diketik di jendela itu, lalu tekan Enter
🍎 Cara buka terminal di macOS
- Tekan Cmd + Spasi, ketik
Terminal, lalu tekan Enter - Ketik perintah-perintah di panduan ini di situ, lalu tekan Enter
🐧 Cara buka terminal di Linux
Tekan Ctrl + Alt + T, atau cari aplikasi "Terminal" di menu aplikasi.
Belum punya Python?
- Buka python.org/downloads dan unduh versi terbaru
- Khusus Windows: saat instalasi, centang dulu kotak "Add Python to PATH" di layar pertama sebelum klik Install
- Setelah selesai install, cek dengan:
python --version
# atau
python3 --version
🚀 Instalasi
1. Ambil kode project ini
Punya Git terinstall
git clone https://github.com/nekonaru/lumenfetch.git
cd lumenfetch
Tidak punya Git
- Buka halaman repository di GitHub
- Klik tombol hijau
Code→ pilihDownload ZIP - Ekstrak file ZIP yang terunduh ke folder pilihanmu
- Di terminal, masuk ke folder hasil ekstrak
2. Install dependency
pip install -r requirements.txt
Kalau muncul error
externally-managed-environment(biasanya di Linux):pip install -r requirements.txt --break-system-packages
3. (Opsional) Install sebagai command lumenfetch
pip install -e .
lumenfetch --version
🖥️ Cara Pakai
Jalankan:
python main.py
# atau non-interaktif:
python main.py "https://youtube.com/watch?v=..." -t video -f mp4 -q 720p -y
python main.py --batch daftar.txt --jobs 2
python main.py --history
python main.py --help
Flag CLI:
-t/--type {video,audio} -f/--format {mp4,mp3} -q/--quality
-o/--output --cookies --cookies-file --max-retry --playlist {single,all}
--subs --sub-langs en,id --embed-subs --embed-metadata
--batch file.txt --jobs 1-4 --no-clipboard -y/--yes -v/--verbose
--history --version
Masukkan URL saat diminta:
Masukkan URL (q: keluar, history, settings, help): https://youtube.com/watch?v=...
Kalau ada link valid di clipboard, Lumenfetch akan menawarkannya duluan - tinggal jawab y kalau mau pakai itu.
Link YouTube otomatis terdeteksi, lalu menu menyesuaikan:
- Video → pilih output Video (MP4) / Audio (MP3) → pilih quality
- Stream audio → langsung pilih bitrate MP3
- Playlist → default video pertama;
--playlist alluntuk semua
Konfirmasi nama file, lalu proses download berjalan dengan progress bar real-time (kecepatan, ukuran, ETA). Tekan Ctrl+C kapan saja untuk membatalkan dengan aman.
⌨️ Command
Diketik langsung di prompt utama, menggantikan URL:
| Command | Fungsi |
|---|---|
history |
Lihat 20 riwayat download terakhir (tanggal, judul, format, ukuran, status) |
settings |
Ganti folder default, max retry, auto-paste clipboard, naming template, atau cookies |
help |
Tampilkan panduan singkat di dalam aplikasi |
q / quit |
Keluar dari aplikasi |
Ctrl+C |
Batalkan download yang sedang berjalan |
🍪 Cookies (Opsional)
Video age-restricted atau private butuh login. Kalau ketemu error semacam itu, aktifkan salah satu:
A. Cookies dari browser:
- Buka Lumenfetch, ketik
settings - Pilih
[5] Pakai cookies dari browser/file - Pilih browser di mana kamu sudah login YouTube (Chrome/Firefox/Edge/Brave/Opera/Vivaldi/Safari)
Setelah aktif, Lumenfetch akan meminjam cookies dari browser itu setiap kali mendeteksi atau mendownload konten, seolah request-nya datang dari sesi browser kamu yang sudah login. Cukup pilih [1] Nonaktifkan di menu yang sama kalau mau matikan lagi.
Penting: browser yang dipilih harus benar-benar tertutup total saat download (file cookies dikunci selama browser terbuka - errornya
Could not copy ... cookie database). Cek Task Manager dan matikan semua proses browser tersebut (Edge/Chrome sering masih jalan di background).
Alternatif paling reliable (disarankan kalau error cookies terus muncul): pakai file cookies yang works walau browser terbuka:
- Install extension "Get cookies.txt LOCALLY" (Chrome/Edge/Firefox) di browser
- Buka youtube.com (pastikan sudah login), klik extension → Export → simpan mis.
D:\cookies.txt- Di Lumenfetch:
settings→[5]→[1] Nonaktifkan→ isi path file cookies tadi- Atau via CLI:
python main.py <URL> --cookies-file D:\cookies.txt
📐 Estimasi Ukuran & Waktu Download
Pas milih quality buat video atau audio, Lumenfetch nampilin perkiraan ukuran file dan waktu download di sebelah tiap opsi:
Pilih Quality:
[1] Best (default) (~147.8 MB, ~31 detik)
[2] 1080p (~147.8 MB, ~31 detik)
[3] 720p (~81.1 MB, ~17 detik)
[4] 480p (~42.9 MB, ~9 detik)
Cara kerjanya:
- Ukuran dihitung dari data yang yt-dlp udah dapat pas proses "Mendeteksi konten..." (gak ada request tambahan ke platform, jadi gak bikin lambat)
- Waktu dihitung dari kecepatan rata-rata beberapa download terakhir kamu yang sukses (bukan angka tebakan generik) - makin sering pakai Lumenfetch, makin akurat estimasinya
- Kalau datanya gak cukup buat ngasih estimasi yang jujur (mis. platform gak expose ukuran file sama sekali, quality tier yang diminta gak tersedia buat konten itu, atau ini baru pertama kali pakai aplikasi jadi belum ada riwayat kecepatan) - estimasinya gak ditampilin sama sekali, daripada nampilin angka ngasal
🔔 Auto-check Update yt-dlp
YouTube sering ubah sistemnya - jadi yt-dlp juga perlu sering di-update biar tetap kompatibel. Ini bukan "sekali fix, selesai selamanya", tapi proses berkelanjutan (mirip antivirus yang perlu update rutin).
Buat bantu itu, tiap kali Lumenfetch dibuka, otomatis dicek ke PyPI apakah ada versi yt-dlp yang lebih baru dari yang terinstall. Kalau ada, muncul notice kayak gini:
🔔 Update yt-dlp tersedia
yt-dlp kamu versi 2026.1.1, versi terbaru 2026.8.19 sudah tersedia.
pip install --upgrade yt-dlp
Tinggal jalankan command yang ditampilkan. Kalau lagi offline atau PyPI nggak bisa diakses, pengecekan ini gagal diam-diam dan tidak menghalangi kamu pakai aplikasinya.
🗂 Naming & Konfigurasi
Nama file mengikuti template di config.json (default: %(platform)s_%(title)s_%(year)s), contoh hasil:
YouTube_Lofi-Hip-Hop-Radio_2026.mp4
YouTube_Lofi-Hip-Hop-Radio_2026.mp3
Preferensi kamu (folder simpan, max retry, auto-paste, naming template, cookies browser, dan riwayat) otomatis tersimpan di config user
(%APPDATA%/lumenfetch/config.json di Windows, ~/.config/lumenfetch/config.json di Linux, ~/Library/Application Support/lumenfetch/ di macOS)
- dibuat otomatis dengan nilai default saat pertama kali dijalankan. Config lama di
config.jsonproject root dimigrasi otomatis sekali. Log detail tersimpan dilumenfetch.logsefolder config (pakai-v/--verboseuntuk level debug).
Folder download default otomatis mengikuti folder Downloads asli sistem operasi kamu (~/Downloads di macOS/Linux, C:\Users\<nama-kamu>\Downloads di Windows) - persis seperti kebiasaan browser lain (Chrome, Firefox, Edge, dll), bukan folder relatif di dalam project. Mau ganti ke folder lain? Tinggal:
- Ketik
settingsdi prompt utama - Pilih
[1] Ganti folder download default - Ketik path folder yang diinginkan (boleh pakai
~buat home folder, mis.~/Documents/Video, atau path absolut penuh)
Catatan: config tersimpan di folder data user (lihat atas), bukan relatif ke folder project - jadi aman dijalankan dari mana saja.
⚠️ Troubleshooting
| Masalah | Solusi |
|---|---|
ModuleNotFoundError: No module named 'yt_dlp' / 'rich' / 'curl_cffi' / 'pyperclip' / 'static_ffmpeg' |
Jalankan ulang pip install -r requirements.txt |
HTTP Error 403: Forbidden |
Update yt-dlp ke versi terbaru: pip install --upgrade yt-dlp |
Sign in to confirm you're not a bot |
Aktifkan fitur Cookies di atas (browser atau file) |
❌ Konten ini private / tidak bisa diakses |
Video private/age-restricted - aktifkan Cookies di atas |
❌ Format tidak tersedia untuk konten ini |
Coba quality lain |
❌ Koneksi internet bermasalah terus muncul |
Cek koneksi, atau naikkan max_retry lewat command settings |
| Video berhasil download tapi tidak ada suara | Jarang terjadi karena ffmpeg sudah bundled otomatis, tapi kalau muncul, jalankan ulang aplikasinya (ffmpeg diunduh ulang otomatis kalau file sebelumnya rusak) |
Ganti naming template di settings ditolak |
Template cuma boleh pakai %(platform)s, %(title)s, %(year)s - ditolak otomatis kalau ada placeholder salah ketik, biar tidak bikin nama file error saat download |
⚠️ URL ini playlist berisi N video |
Default cuma video pertama. Gunakan --playlist all untuk download semua sebagai file ber-index |
| Batch download | Buat file teks (satu URL per baris, # = komentar), lalu python main.py --batch daftar.txt --jobs 2 |
| Resume download | Didukung via continuedl yt-dlp + retry backoff eksponensial (2s, 4s, 8s... max 30s). File parsial .part dilanjutkan, bukan diulang dari 0 |
ffmpeg tidak ditemukan |
Install ffmpeg sistem dulu (lebih ringan), fallback bundled otomatis. Cek dengan ffmpeg -version |
🗂️ Struktur Project
lumenfetch/
├── main.py # Entry point, CLI args, batch, loop utama
├── core/
│ ├── constants.py # Single source of truth (versi, format, batas)
│ ├── errors.py # Taxonomy error terpusat (klasifikasi + pesan ramah)
│ ├── ffmpeg.py # Deteksi ffmpeg sistem dulu, bundled fallback
│ ├── log.py # Logging file terpusat
│ ├── downloader.py # Download MP4 / ekstrak MP3 + resume + retry backoff
│ ├── detector.py # Deteksi info video YouTube
│ ├── options.py # Menu & prompt interaktif (rich)
│ ├── update_checker.py # Auto-check versi terbaru yt-dlp di PyPI
│ └── utils.py # Sanitasi nama file, format size, config user
├── tests/
│ ├── conftest.py # Fixture global (no-sleep) + SAMPLE_VIDEO_FORMATS
│ ├── test_utils.py
│ ├── test_detector.py
│ ├── test_downloader.py
│ ├── test_options.py
│ ├── test_main.py
│ └── test_features.py # Fitur (CLI, backoff, batch, ffmpeg, cookies, log)
├── .github/
│ └── workflows/
│ └── tests.yml # CI: test & lint otomatis
├── downloads/ # Folder placeholder (bukan lokasi download aktual - lihat "Naming & Konfigurasi")
├── requirements.txt
├── requirements-dev.txt # Dependency tambahan untuk development (pytest, ruff)
├── pyproject.toml # Metadata project + entry point + konfigurasi ruff
├── CONTRIBUTING.md
├── LICENSE
└── README.md
Prinsip pemisahan modul:
constants.py- nilai shared (versi, format, batas) biar tidak drift antar modulerrors.py- klasifikasi error terpusat, dipakai detector & downloader bersamadetector.py- murni deteksi info video YouTube, tidak mendownload apa pundownloader.py- murni proses download MP4/MP3 & progress, tidak menampilkan menuoptions.py- semua interaksi & tampilan menu, tidak ada logic downloadutils.py- helper murni (sanitasi, format, baca/tulis config), tidak tahu soal CLI atau jaringanmain.py- menyatukan semuanya lewat CLI + loop utama
🗺️ Roadmap
- Phase 1 - Core: struktur project, integrasi yt-dlp dasar, progress bar, config user
- Phase 2 - Smart Detection: auto-detect video YouTube, auto-paste clipboard, preview nama file
- Phase 3 - Reliability: resume, retry backoff eksponensial, playlist, cancel graceful
- Phase 4 - Polish: menu history, settings, help, naming template, subtitle & metadata
- Phase 5 - Fokus YouTube: scope MP4/MP3 saja (v2.0.0) - hapus jalur multi-platform & dep berat
🧪 Testing
Ada unit test per modul (sanitasi nama file, naming template, resolve duplikat, format ukuran/durasi, config, validasi URL YouTube, opts yt-dlp, CLI, dll).
pip install -r requirements-dev.txt
pytest tests/ -v
ruff check .
CI (.github/workflows/tests.yml) otomatis menjalankan ini di setiap push & pull request ke main, di Python 3.9-3.12.
🤝 Kontribusi
Mau bantu kembangin Lumenfetch? Baca CONTRIBUTING.md untuk struktur project dan alur kontribusi.
👤 Author
| Nicolas Dwi Dharma |
| github.com/nekonaru |
📄 License
Distributed under the MIT License. See LICENSE for more information.
Made with 📥 by Nicolas Dwi Dharma
Star ⭐ repo ini kalau project ini membantumu!
Metadata
Release files for lumenfetch 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lumenfetch-2.0.0.tar.gz | 50.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lumenfetch-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 89.1 kB
Release files / lumenfetch-2.0.0.tar.gz
| Download URL | lumenfetch-2.0.0.tar.gz |
|---|---|
| Size | 50.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1285a614e7cdeb796b46acb7c44753b0559ea34e845e01c49fe273c1033bffae
|
|
BLAKE2b-256 checksum How to use checksums |
5f6c37ff4d2ce3ba02424f864670a1eeb610ff73795ecada495e0879ead51967
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|
Release files / lumenfetch-2.0.0-py3-none-any.whl
| Download URL | lumenfetch-2.0.0-py3-none-any.whl |
|---|---|
| Size | 39.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6d8f2945fbfe5f54ca4d06504bd2424c3a1edb8a2034d401a6770c293ad3cd7e
|
|
BLAKE2b-256 checksum How to use checksums |
41c0855b18ffe3cd35474f50f3808ec16162fec4ec094a5a2701c4b28931756e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|