lumenfetch 2.1.2__tar.gz → 2.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lumenfetch-2.2.0/.github/dependabot.yml +14 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/.github/workflows/publish.yml +7 -7
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/.github/workflows/tests.yml +5 -5
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/.gitignore +7 -0
- lumenfetch-2.2.0/CHANGELOG.id.md +98 -0
- lumenfetch-2.2.0/CHANGELOG.md +98 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/CONTRIBUTING.id.md +25 -24
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/CONTRIBUTING.md +21 -22
- lumenfetch-2.2.0/PKG-INFO +686 -0
- lumenfetch-2.2.0/README.id.md +653 -0
- lumenfetch-2.2.0/README.md +653 -0
- lumenfetch-2.2.0/SECURITY.md +23 -0
- lumenfetch-2.2.0/assets/logo.png +0 -0
- lumenfetch-2.2.0/assets/lumenfetch.ico +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/cli.py +7 -1
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/constants.py +1 -1
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/detector.py +13 -2
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/downloader.py +106 -54
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/i18n.py +10 -2
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/options.py +15 -5
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/update_checker.py +2 -2
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/lumenfetch.spec +40 -38
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/main.py +175 -112
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/pyproject.toml +2 -2
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/tests/test_features.py +162 -1
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/tests/test_main.py +212 -212
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/tests/test_utils.py +634 -634
- lumenfetch-2.1.2/PKG-INFO +0 -516
- lumenfetch-2.1.2/README.id.md +0 -487
- lumenfetch-2.1.2/README.md +0 -483
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/LICENSE +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/__init__.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/doctor.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/errors.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/ffmpeg.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/log.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/core/utils.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/downloads/.gitkeep +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/requirements-dev.txt +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/requirements.txt +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/tests/__init__.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/tests/conftest.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/tests/test_detector.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/tests/test_downloader.py +0 -0
- {lumenfetch-2.1.2 → lumenfetch-2.2.0}/tests/test_options.py +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: pip
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
open-pull-requests-limit: 5
|
|
8
|
+
groups:
|
|
9
|
+
minor-and-patch:
|
|
10
|
+
update-types: ["minor", "patch"]
|
|
11
|
+
- package-ecosystem: github-actions
|
|
12
|
+
directory: "/"
|
|
13
|
+
schedule:
|
|
14
|
+
interval: weekly
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name: Publish
|
|
1
|
+
name: Publish
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
release:
|
|
@@ -13,10 +13,10 @@ jobs:
|
|
|
13
13
|
runs-on: windows-latest
|
|
14
14
|
steps:
|
|
15
15
|
- name: Checkout repo
|
|
16
|
-
uses: actions/checkout@
|
|
16
|
+
uses: actions/checkout@v7
|
|
17
17
|
|
|
18
18
|
- name: Setup Python
|
|
19
|
-
uses: actions/setup-python@
|
|
19
|
+
uses: actions/setup-python@v7
|
|
20
20
|
with:
|
|
21
21
|
python-version: "3.12"
|
|
22
22
|
|
|
@@ -26,13 +26,13 @@ jobs:
|
|
|
26
26
|
pip install pyinstaller
|
|
27
27
|
|
|
28
28
|
- name: Build Windows exe
|
|
29
|
-
run: pyinstaller
|
|
29
|
+
run: pyinstaller lumenfetch.spec --noconfirm
|
|
30
30
|
|
|
31
31
|
- name: Smoke test exe
|
|
32
32
|
run: ./dist/lumenfetch.exe --version
|
|
33
33
|
|
|
34
34
|
- name: Attach exe to release
|
|
35
|
-
uses: softprops/action-gh-release@
|
|
35
|
+
uses: softprops/action-gh-release@v3
|
|
36
36
|
with:
|
|
37
37
|
files: dist/lumenfetch.exe
|
|
38
38
|
|
|
@@ -44,10 +44,10 @@ jobs:
|
|
|
44
44
|
id-token: write
|
|
45
45
|
steps:
|
|
46
46
|
- name: Checkout repo
|
|
47
|
-
uses: actions/checkout@
|
|
47
|
+
uses: actions/checkout@v7
|
|
48
48
|
|
|
49
49
|
- name: Setup Python
|
|
50
|
-
uses: actions/setup-python@
|
|
50
|
+
uses: actions/setup-python@v7
|
|
51
51
|
with:
|
|
52
52
|
python-version: "3.12"
|
|
53
53
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name: Tests
|
|
1
|
+
name: Tests
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
@@ -8,17 +8,17 @@ on:
|
|
|
8
8
|
|
|
9
9
|
jobs:
|
|
10
10
|
test:
|
|
11
|
-
runs-on: ubuntu-
|
|
11
|
+
runs-on: ubuntu-24.04
|
|
12
12
|
strategy:
|
|
13
13
|
matrix:
|
|
14
|
-
python-version: ["3.9", "3.10", "3.11", "3.12"]
|
|
14
|
+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
15
15
|
|
|
16
16
|
steps:
|
|
17
17
|
- name: Checkout repo
|
|
18
|
-
uses: actions/checkout@
|
|
18
|
+
uses: actions/checkout@v7
|
|
19
19
|
|
|
20
20
|
- name: Setup Python ${{ matrix.python-version }}
|
|
21
|
-
uses: actions/setup-python@
|
|
21
|
+
uses: actions/setup-python@v7
|
|
22
22
|
with:
|
|
23
23
|
python-version: ${{ matrix.python-version }}
|
|
24
24
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## v2.2.0
|
|
4
|
+
|
|
5
|
+
Startup lebih cepat dan pipeline rilis lebih ramping.
|
|
6
|
+
|
|
7
|
+
### Peningkatan
|
|
8
|
+
|
|
9
|
+
- **Startup lebih cepat.** Dependency berat (yt-dlp, sebagian rich) di-import secara lazy, jadi command seperti `--version` merespons jauh lebih cepat.
|
|
10
|
+
- **Build exe Windows yang lebih kecil dan konsisten.** Build rilis sekarang memakai file spec, menyertakan icon logo, dan mengecualikan toolkit GUI yang tidak dipakai.
|
|
11
|
+
- **CI mencakup Python 3.13 dan 3.14**, dan GitHub Actions diperbarui ke versi major terbaru.
|
|
12
|
+
- **Dependabot menjaga dependency tetap terkini** untuk ekosistem pip dan github-actions.
|
|
13
|
+
- **Bersih-bersih internal.** Logika setup ffmpeg yang duplikat digabungkan, dan update checker tidak lagi memuat yt-dlp saat import.
|
|
14
|
+
|
|
15
|
+
## v2.1.2
|
|
16
|
+
|
|
17
|
+
Rilis ini memperbaiki kegagalan download berulang (0 bytes, lalu error) yang terjadi bahkan untuk video publik.
|
|
18
|
+
|
|
19
|
+
### Fitur baru
|
|
20
|
+
|
|
21
|
+
- **Cek JavaScript di Doctor.** `lumenfetch --doctor` sekarang juga mengecek JavaScript runtime (Deno/Node), yang dibutuhkan untuk signature challenge YouTube.
|
|
22
|
+
|
|
23
|
+
### Peningkatan
|
|
24
|
+
|
|
25
|
+
- **Override `player_client` yang dipaksakan dihapus.** Itu memicu eksperimen SABR-only YouTube (cuma 5 format, bukan sekitar 46). Sekarang pakai default yt-dlp yang dirawat maintainer.
|
|
26
|
+
- **Error format yang transien ikut di-retry.** Error format sekarang mendapat backoff seperti error koneksi.
|
|
27
|
+
- **Crash post-processing tidak lagi menggagalkan video yang sebenarnya utuh.** Crash (mis. embed thumbnail) videonya tetap disimpan dengan warning.
|
|
28
|
+
- **Download paralel judul duplikat dapat nama file unik**, tidak saling merusak.
|
|
29
|
+
|
|
30
|
+
### Perbaikan bug
|
|
31
|
+
|
|
32
|
+
- **Hasil 0-byte sekarang gagal dengan jujur + bersih-bersih.** Hasil kosong tidak lagi dilaporkan sebagai sukses atau nyampah di folder.
|
|
33
|
+
- **File batch ber-prefix BOM tidak lagi dilewati diam-diam**, dan kegagalan per-URL di batch sekarang ditampilkan.
|
|
34
|
+
|
|
35
|
+
## v2.1.1
|
|
36
|
+
|
|
37
|
+
Rilis ini membuat English menjadi bahasa tampilan default dan me-refresh halaman PyPI.
|
|
38
|
+
|
|
39
|
+
### Fitur baru
|
|
40
|
+
|
|
41
|
+
- **`lumenfetch doctor`.** Mendiagnosa setup dalam hitungan detik, tiap cek dengan saran fix spesifik.
|
|
42
|
+
- **Notice self-update.** Memberi tahu kalau ada lumenfetch lebih baru di PyPI.
|
|
43
|
+
- **`--ui-lang en|id`.** Bahasa tampilan via flag, `LUMENFETCH_LANG`, atau setting `ui_lang` yang diingat.
|
|
44
|
+
|
|
45
|
+
### Breaking changes
|
|
46
|
+
|
|
47
|
+
- **Bahasa tampilan default sekarang English.** Jalankan `lumenfetch --ui-lang id` sekali untuk kembali ke Indonesia; pilihannya diingat.
|
|
48
|
+
|
|
49
|
+
## v2.1.0
|
|
50
|
+
|
|
51
|
+
Rilis ini menambahkan doctor setup, notice self-update, dan dukungan SponsorBlock.
|
|
52
|
+
|
|
53
|
+
### Fitur baru
|
|
54
|
+
|
|
55
|
+
- **`lumenfetch doctor`.** Mendiagnosa setup dalam hitungan detik: Python, ffmpeg, `curl_cffi`, versi yt-dlp, versi lumenfetch, keterjangkauan YouTube, keterbacaan cookies browser, dan keterulisan config, masing-masing dengan saran fix spesifik.
|
|
56
|
+
- **Notice self-update.** Memberi tahu kalau ada lumenfetch lebih baru di PyPI (`pip install --upgrade lumenfetch`), di samping notice yt-dlp yang sudah ada.
|
|
57
|
+
- **`--sponsorblock`.** Lewati segmen SponsorBlock, mis. `--sponsorblock sponsor intro outro`.
|
|
58
|
+
- **`--write-info-json`.** Simpan metadata video sebagai `.info.json` di sebelah file.
|
|
59
|
+
- **`.m3u` otomatis.** Playlist audio (`--playlist all`) sekarang juga nulis file `.m3u`.
|
|
60
|
+
|
|
61
|
+
### Peningkatan
|
|
62
|
+
|
|
63
|
+
- **Download paralel yang aman.** Dua worker batch untuk judul yang sama tidak lagi saling menimpa file (reservasi nama atomik, terverifikasi live 2/2).
|
|
64
|
+
- **Batch gagal yang bersuara.** Mode batch sekarang menampilkan URL mana yang gagal dan kenapa, bukan gagal diam-diam (termasuk file ber-prefix BOM dari PowerShell).
|
|
65
|
+
- **Terminal yang tenang.** Noise mentah `ERROR:` dari yt-dlp dialihkan ke `lumenfetch.log`; terminal cuma menampilkan pesan ramah.
|
|
66
|
+
- **Modul baru `core/cli.py` dan `core/doctor.py`.** Parsing argumen dan diagnostik dipisah dari `main.py`; `main.py` dirampingkan.
|
|
67
|
+
- **Coverage gate dan trusted publishing.** CI menegakkan coverage gate 80% dan publish ke PyPI tanpa token.
|
|
68
|
+
- **Exe Windows.** `lumenfetch.exe` terlampir di release, tanpa perlu Python.
|
|
69
|
+
|
|
70
|
+
### Perbaikan bug
|
|
71
|
+
|
|
72
|
+
- **URL batch ber-prefix BOM tidak lagi dilewati diam-diam.**
|
|
73
|
+
- **Mode batch tidak lagi menelan error per-URL** (ditampilkan bersama URL yang gagal).
|
|
74
|
+
- **Download paralel judul duplikat tidak lagi merusak output satu sama lain.**
|
|
75
|
+
|
|
76
|
+
## v2.0.0
|
|
77
|
+
|
|
78
|
+
Lumenfetch sekarang downloader YouTube yang fokus: video MP4 dan audio MP3, tidak yang lain.
|
|
79
|
+
|
|
80
|
+
### Fitur baru
|
|
81
|
+
|
|
82
|
+
- **Video MP4.** Quality Best/1080p/720p/480p/360p/Worst dengan thumbnail ter-embed otomatis.
|
|
83
|
+
- **Audio MP3.** Bitrate Best/320kbps/192kbps/128kbps.
|
|
84
|
+
- **CLI English dan Indonesia.** `--ui-lang en|id`; menu, prompt, tabel, pesan error, dan `--help` sepenuhnya bisa diterjemahkan. English menjadi default baru, diingat setelahnya. Juga via `LUMENFETCH_LANG` atau nilai `ui_lang` di config.
|
|
85
|
+
- **Dokumentasi dua bahasa.** `README.md` dan `CONTRIBUTING.md` berbahasa Inggris, dengan versi Indonesia di `README.id.md` dan `CONTRIBUTING.id.md`.
|
|
86
|
+
|
|
87
|
+
### Breaking changes
|
|
88
|
+
|
|
89
|
+
- **YouTube-only.** Cuma link `youtube.com`, `youtu.be`, dan `music.youtube.com` yang diterima. Platform lain ditolak dengan pesan yang jelas, bukan error menyesatkan.
|
|
90
|
+
- **Dependency yang dihapus.** `instaloader` dan `browser-cookie3` hilang; install jadi lebih ringan. Cookies browser/file untuk YouTube tetap jalan.
|
|
91
|
+
- **Template nama file output.** Nama file mengikuti `%(platform)s_%(title)s_%(year)s`, mis. `YouTube_Lofi-Hip-Hop-Radio_2026.mp4`.
|
|
92
|
+
|
|
93
|
+
### Peningkatan
|
|
94
|
+
|
|
95
|
+
- **Modul baru `core/i18n.py`.** Kamus teks tampilan (en/id); semua teks user lewat `t("key")`.
|
|
96
|
+
- **Taxonomy baru `core/errors.py`.** Setiap kegagalan yt-dlp dipetakan ke kind spesifik (bot-check, cookies, rate-limit, removed, dll) dengan pesan yang actionable, termasuk retry otomatis tanpa cookies kalau database cookies terkunci.
|
|
97
|
+
- **`curl_cffi` sekarang dependency wajib** biar lolos bot-check YouTube.
|
|
98
|
+
- **Config user pindah** ke folder config OS (`%APPDATA%` di Windows, `~/.config` di Linux, `~/Library/Application Support` di macOS), dengan migrasi sekali dari lokasi lama.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## v2.2.0
|
|
4
|
+
|
|
5
|
+
Startup is faster and the release pipeline is leaner.
|
|
6
|
+
|
|
7
|
+
### Improvements
|
|
8
|
+
|
|
9
|
+
- **Faster startup.** Heavy dependencies (yt-dlp, parts of rich) are imported lazily, so commands like `--version` respond noticeably faster.
|
|
10
|
+
- **Smaller, consistent Windows exe build.** The release build now uses the spec file, ships the logo icon, and excludes unused GUI toolkits.
|
|
11
|
+
- **CI covers Python 3.13 and 3.14**, and GitHub Actions were updated to their latest major versions.
|
|
12
|
+
- **Dependabot keeps dependencies current** in the pip and github-actions ecosystems.
|
|
13
|
+
- **Internal cleanup.** Duplicated ffmpeg setup logic was unified, and the update checker no longer loads yt-dlp at import time.
|
|
14
|
+
|
|
15
|
+
## v2.1.2
|
|
16
|
+
|
|
17
|
+
This release fixes repeated download failures (0 bytes, then an error) that happened even for public videos.
|
|
18
|
+
|
|
19
|
+
### New features
|
|
20
|
+
|
|
21
|
+
- **Doctor JavaScript check.** `lumenfetch --doctor` now also checks for a JavaScript runtime (Deno/Node), required for YouTube signature challenges.
|
|
22
|
+
|
|
23
|
+
### Improvements
|
|
24
|
+
|
|
25
|
+
- **Removed the forced `player_client` override.** It triggered YouTube's SABR-only experiment (5 formats served instead of about 46). yt-dlp's maintained defaults are used now.
|
|
26
|
+
- **Transient format errors retried.** Format errors now get backoff like connection errors.
|
|
27
|
+
- **Post-processing crashes no longer fail an otherwise good download.** A crash (for example thumbnail embed) keeps the video with a warning.
|
|
28
|
+
- **Parallel batch downloads of duplicate titles get unique filenames** instead of corrupting each other.
|
|
29
|
+
|
|
30
|
+
### Bug fixes
|
|
31
|
+
|
|
32
|
+
- **0-byte results now fail loudly with cleanup.** Empty results are no longer reported as success or left in the folder.
|
|
33
|
+
- **Batch files with a BOM prefix are no longer skipped silently**, and per-URL batch failures are now reported.
|
|
34
|
+
|
|
35
|
+
## v2.1.1
|
|
36
|
+
|
|
37
|
+
This release makes English the default display language and refreshes the PyPI page.
|
|
38
|
+
|
|
39
|
+
### New features
|
|
40
|
+
|
|
41
|
+
- **`lumenfetch doctor`.** Diagnoses your setup in seconds, each check with a specific fix hint.
|
|
42
|
+
- **Self-update notice.** Tells you when a newer lumenfetch is on PyPI.
|
|
43
|
+
- **`--ui-lang en|id`.** Display language via flag, `LUMENFETCH_LANG`, or the remembered `ui_lang` setting.
|
|
44
|
+
|
|
45
|
+
### Breaking changes
|
|
46
|
+
|
|
47
|
+
- **Default display language is now English.** Run `lumenfetch --ui-lang id` once to keep Bahasa Indonesia; the choice is remembered afterwards.
|
|
48
|
+
|
|
49
|
+
## v2.1.0
|
|
50
|
+
|
|
51
|
+
This release adds a setup doctor, a self-update notice, and SponsorBlock support.
|
|
52
|
+
|
|
53
|
+
### New features
|
|
54
|
+
|
|
55
|
+
- **`lumenfetch doctor`.** Diagnoses your setup in seconds: Python, ffmpeg, `curl_cffi`, yt-dlp version, lumenfetch version, YouTube reachability, browser-cookie readability, and config writability, each with a specific fix hint.
|
|
56
|
+
- **Self-update notice.** Tells you when a newer lumenfetch is on PyPI (`pip install --upgrade lumenfetch`), next to the existing yt-dlp notice.
|
|
57
|
+
- **`--sponsorblock`.** Skip SponsorBlock segments, e.g. `--sponsorblock sponsor intro outro`.
|
|
58
|
+
- **`--write-info-json`.** Save video metadata as `.info.json` next to the file.
|
|
59
|
+
- **Auto `.m3u`.** Audio playlists (`--playlist all`) now also write an `.m3u` file.
|
|
60
|
+
|
|
61
|
+
### Improvements
|
|
62
|
+
|
|
63
|
+
- **Parallel-safe downloads.** Two batch workers for the same title no longer overwrite each other's file (atomic name reservation, verified live 2/2).
|
|
64
|
+
- **Loud batch failures.** Batch mode now prints which URL failed and why instead of failing silently (also handles BOM-prefixed files from PowerShell).
|
|
65
|
+
- **Quiet terminal.** Raw yt-dlp `ERROR:` noise is redirected to `lumenfetch.log`; the terminal only shows friendly messages.
|
|
66
|
+
- **New `core/cli.py` and `core/doctor.py` modules.** Argument parsing and diagnostics were split out of `main.py`; `main.py` is slimmed down.
|
|
67
|
+
- **Coverage gate and trusted publishing.** CI enforces an 80% coverage gate and publishes to PyPI without a token.
|
|
68
|
+
- **Windows exe.** `lumenfetch.exe` is attached to the release, no Python needed.
|
|
69
|
+
|
|
70
|
+
### Bug fixes
|
|
71
|
+
|
|
72
|
+
- **Batch URLs with a BOM prefix are no longer silently skipped.**
|
|
73
|
+
- **Batch mode no longer swallows per-URL errors** (they are printed with the failing URL).
|
|
74
|
+
- **Parallel downloads of duplicate titles no longer corrupt each other's output.**
|
|
75
|
+
|
|
76
|
+
## v2.0.0
|
|
77
|
+
|
|
78
|
+
Lumenfetch is now a focused YouTube downloader: MP4 video and MP3 audio, nothing else.
|
|
79
|
+
|
|
80
|
+
### New features
|
|
81
|
+
|
|
82
|
+
- **MP4 video.** Quality Best/1080p/720p/480p/360p/Worst with auto-embedded thumbnail.
|
|
83
|
+
- **MP3 audio.** Bitrate Best/320kbps/192kbps/128kbps.
|
|
84
|
+
- **English and Indonesian CLI.** `--ui-lang en|id`; menus, prompts, tables, error messages, and `--help` are fully translatable. English is the default, remembered afterwards. Also via `LUMENFETCH_LANG` or the `ui_lang` config value.
|
|
85
|
+
- **Bilingual documentation.** `README.md` and `CONTRIBUTING.md` in English, with Indonesian versions in `README.id.md` and `CONTRIBUTING.id.md`.
|
|
86
|
+
|
|
87
|
+
### Breaking changes
|
|
88
|
+
|
|
89
|
+
- **YouTube-only.** Only `youtube.com`, `youtu.be`, and `music.youtube.com` links are accepted. Other platforms are rejected with a clear message instead of a misleading error.
|
|
90
|
+
- **Removed dependencies.** `instaloader` and `browser-cookie3` are gone; install is lighter. Browser/file cookies for YouTube still work.
|
|
91
|
+
- **Output filename template.** Filenames follow `%(platform)s_%(title)s_%(year)s`, e.g. `YouTube_Lofi-Hip-Hop-Radio_2026.mp4`.
|
|
92
|
+
|
|
93
|
+
### Improvements
|
|
94
|
+
|
|
95
|
+
- **New `core/i18n.py` module.** A pure dictionary of display text (en/id); all user-facing text goes through `t("key")`.
|
|
96
|
+
- **New `core/errors.py` taxonomy.** Every yt-dlp failure maps to a specific kind (bot-check, cookies, rate-limit, removed, etc.) with an actionable message, including automatic retry without cookies when the cookie database is locked.
|
|
97
|
+
- **`curl_cffi` is now a required dependency** so YouTube bot-checks pass.
|
|
98
|
+
- **User config moved** to the OS config dir (`%APPDATA%` on Windows, `~/.config` on Linux, `~/Library/Application Support` on macOS), with one-time migration from the old location.
|
|
@@ -1,40 +1,40 @@
|
|
|
1
1
|
# Kontribusi ke Lumenfetch
|
|
2
2
|
|
|
3
|
-
Makasih
|
|
3
|
+
Makasih sudah mau bantu kembangin Lumenfetch. Panduan ini biar kontribusi kamu gampang diproses.
|
|
4
4
|
|
|
5
5
|
[English](CONTRIBUTING.md) | **Bahasa Indonesia**
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Setup Development
|
|
8
8
|
|
|
9
|
-
1. Fork
|
|
10
|
-
2. Install dependency (termasuk tools testing
|
|
9
|
+
1. Fork dan clone repo ini
|
|
10
|
+
2. Install dependency (termasuk tools testing dan lint):
|
|
11
11
|
```bash
|
|
12
12
|
pip install -r requirements-dev.txt
|
|
13
13
|
```
|
|
14
14
|
3. Pastikan `ffmpeg` sudah terinstall di sistem kamu (lihat bagian Requirements di README)
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## Struktur dan Prinsip Modul
|
|
17
17
|
|
|
18
|
-
Lumenfetch sengaja dipisah per tanggung jawab
|
|
18
|
+
Lumenfetch sengaja dipisah per tanggung jawab. Tolong jaga konsistensinya kalau menambah/mengubah kode:
|
|
19
19
|
|
|
20
20
|
| File | Tanggung jawab | Tidak boleh |
|
|
21
|
-
|
|
21
|
+
|------|----------------|-------------|
|
|
22
22
|
| `core/constants.py` | Nilai shared (versi, format, batas) | Logic bisnis |
|
|
23
|
-
| `core/errors.py` | Klasifikasi error
|
|
23
|
+
| `core/errors.py` | Klasifikasi error dan pesan ramah terpusat | Logic download/deteksi |
|
|
24
24
|
| `core/i18n.py` | Katalog string UI (EN default, ID opsional) | Logic bisnis |
|
|
25
|
-
| `core/cli.py` | Parsing argumen
|
|
25
|
+
| `core/cli.py` | Parsing argumen dan bangun pilihan non-interaktif | Logic bisnis |
|
|
26
26
|
| `core/doctor.py` | Diagnosa setup (ffmpeg, dep, cookies, jaringan) | Download/deteksi |
|
|
27
27
|
| `core/ffmpeg.py` | Deteksi ffmpeg sistem dulu, bundled fallback | Download/deteksi |
|
|
28
28
|
| `core/log.py` | Logging file terpusat | Tampilan rich/menu |
|
|
29
29
|
| `core/detector.py` | Deteksi info video YouTube via yt-dlp | Mendownload apa pun |
|
|
30
30
|
| `core/downloader.py` | Proses download, progress hook, retry | Menampilkan menu/prompt |
|
|
31
|
-
| `core/options.py` | Semua interaksi
|
|
31
|
+
| `core/options.py` | Semua interaksi dan tampilan menu (rich) | Logic download |
|
|
32
32
|
| `core/utils.py` | Helper murni: sanitasi, format, config user | Bergantung ke CLI atau jaringan |
|
|
33
|
-
| `main.py` | Menyatukan semua modul lewat CLI
|
|
33
|
+
| `main.py` | Menyatukan semua modul lewat CLI dan loop utama | Logic bisnis baru |
|
|
34
34
|
|
|
35
|
-
Kalau
|
|
35
|
+
Kalau menambah fitur, taruh di modul yang paling sesuai dulu sebelum bikin file baru.
|
|
36
36
|
|
|
37
|
-
##
|
|
37
|
+
## Sebelum Bikin Pull Request
|
|
38
38
|
|
|
39
39
|
Jalankan ini dulu di root project:
|
|
40
40
|
|
|
@@ -43,30 +43,31 @@ pytest tests/ -v
|
|
|
43
43
|
ruff check .
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
Pastikan semua test lulus dan tidak ada warning lint baru. GitHub Actions juga
|
|
46
|
+
Pastikan semua test lulus dan tidak ada warning lint baru. GitHub Actions juga menjalankan ini otomatis di setiap PR.
|
|
47
47
|
|
|
48
|
-
##
|
|
48
|
+
## Commit Message
|
|
49
49
|
|
|
50
50
|
Pakai prefix singkat biar history gampang dibaca:
|
|
51
51
|
|
|
52
|
-
- `feat:`
|
|
53
|
-
- `fix:`
|
|
54
|
-
- `docs:`
|
|
55
|
-
- `refactor:`
|
|
56
|
-
- `test:`
|
|
52
|
+
- `feat:` fitur baru
|
|
53
|
+
- `fix:` perbaikan bug
|
|
54
|
+
- `docs:` perubahan dokumentasi (README, CONTRIBUTING, dll)
|
|
55
|
+
- `refactor:` perubahan struktur kode tanpa mengubah perilaku
|
|
56
|
+
- `test:` nambah/ubah test
|
|
57
57
|
|
|
58
58
|
Contoh: `fix: handle playlist YouTube satu video`
|
|
59
59
|
|
|
60
|
-
##
|
|
60
|
+
## Lapor Bug / Request Fitur
|
|
61
61
|
|
|
62
62
|
Buka [Issues](../../issues) baru, sertakan:
|
|
63
|
+
|
|
63
64
|
- Link yang bermasalah (kalau ada, hapus info pribadi)
|
|
64
65
|
- Pesan error yang muncul di terminal
|
|
65
66
|
- Langkah buat reproduce masalahnya
|
|
66
67
|
|
|
67
|
-
##
|
|
68
|
+
## Pull Request
|
|
68
69
|
|
|
69
70
|
1. Buat branch baru dari `main`, kasih nama yang jelas (misal `fix/playlist-satu-video`)
|
|
70
71
|
2. Pastikan `pytest` dan `ruff check .` lulus
|
|
71
|
-
3.
|
|
72
|
-
4. Tunggu review
|
|
72
|
+
3. Jelaskan di deskripsi PR apa yang diubah dan kenapa
|
|
73
|
+
4. Tunggu review, mungkin ada request perubahan kecil sebelum di-merge
|
|
@@ -2,41 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
Thanks for helping develop Lumenfetch. This guide keeps contributions easy to review.
|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**English** | [Bahasa Indonesia](CONTRIBUTING.id.md)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Development Setup
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
1. Fork & clone this repo
|
|
12
|
-
2. Install dependencies (including testing & lint tools):
|
|
9
|
+
1. Fork and clone this repo
|
|
10
|
+
2. Install dependencies (including testing and lint tools):
|
|
13
11
|
```bash
|
|
14
12
|
pip install -r requirements-dev.txt
|
|
15
13
|
```
|
|
16
14
|
3. Make sure `ffmpeg` is installed on your system (see Requirements in the README)
|
|
17
15
|
|
|
18
|
-
##
|
|
16
|
+
## Module Structure and Principles
|
|
19
17
|
|
|
20
|
-
Lumenfetch is split by responsibility
|
|
18
|
+
Lumenfetch is split by responsibility. Keep it consistent when adding or changing code:
|
|
21
19
|
|
|
22
20
|
| File | Responsibility | Must not |
|
|
23
21
|
|------|----------------|----------|
|
|
24
22
|
| `core/constants.py` | Shared values (version, formats, limits) | Business logic |
|
|
25
|
-
| `core/errors.py` | Central error classification
|
|
23
|
+
| `core/errors.py` | Central error classification and friendly messages | Download/detect logic |
|
|
26
24
|
| `core/i18n.py` | UI string catalog (EN default, ID optional) | Business logic |
|
|
27
|
-
| `core/cli.py` | Argument parsing
|
|
25
|
+
| `core/cli.py` | Argument parsing and non-interactive choice building | Business logic |
|
|
28
26
|
| `core/doctor.py` | Setup diagnosis (ffmpeg, deps, cookies, network) | Download/detect |
|
|
29
27
|
| `core/ffmpeg.py` | System ffmpeg first, bundled fallback | Download/detect |
|
|
30
28
|
| `core/log.py` | Central file logging | Rich display/menus |
|
|
31
29
|
| `core/detector.py` | YouTube video info detection via yt-dlp | Download anything |
|
|
32
30
|
| `core/downloader.py` | Download process, progress hook, retry | Show menus/prompts |
|
|
33
|
-
| `core/options.py` | All interaction
|
|
31
|
+
| `core/options.py` | All interaction and menus (rich) | Download logic |
|
|
34
32
|
| `core/utils.py` | Pure helpers: sanitizing, formatting, user config | Depend on CLI or network |
|
|
35
|
-
| `main.py` | Ties everything together via CLI
|
|
33
|
+
| `main.py` | Ties everything together via CLI and main loop | New business logic |
|
|
36
34
|
|
|
37
35
|
When adding a feature, put it in the most fitting module first before creating a new file.
|
|
38
36
|
|
|
39
|
-
##
|
|
37
|
+
## Before Opening a Pull Request
|
|
40
38
|
|
|
41
39
|
Run this in the project root:
|
|
42
40
|
|
|
@@ -47,28 +45,29 @@ ruff check .
|
|
|
47
45
|
|
|
48
46
|
Make sure all tests pass and there are no new lint warnings. GitHub Actions also runs these automatically on every PR.
|
|
49
47
|
|
|
50
|
-
##
|
|
48
|
+
## Commit Messages
|
|
51
49
|
|
|
52
50
|
Use short prefixes so history stays readable:
|
|
53
51
|
|
|
54
|
-
- `feat:`
|
|
55
|
-
- `fix:`
|
|
56
|
-
- `docs:`
|
|
57
|
-
- `refactor:`
|
|
58
|
-
- `test:`
|
|
52
|
+
- `feat:` new feature
|
|
53
|
+
- `fix:` bug fix
|
|
54
|
+
- `docs:` documentation changes (README, CONTRIBUTING, etc.)
|
|
55
|
+
- `refactor:` code structure changes without behavior change
|
|
56
|
+
- `test:` add/change tests
|
|
59
57
|
|
|
60
58
|
Example: `fix: handle single-video YouTube playlist`
|
|
61
59
|
|
|
62
|
-
##
|
|
60
|
+
## Bug Reports / Feature Requests
|
|
63
61
|
|
|
64
62
|
Open a new [Issue](../../issues) and include:
|
|
63
|
+
|
|
65
64
|
- The problematic link (if any, remove personal info)
|
|
66
65
|
- The error message shown in the terminal
|
|
67
66
|
- Steps to reproduce the problem
|
|
68
67
|
|
|
69
|
-
##
|
|
68
|
+
## Pull Requests
|
|
70
69
|
|
|
71
70
|
1. Create a new branch from `main` with a clear name (e.g. `fix/playlist-single-video`)
|
|
72
71
|
2. Make sure `pytest` and `ruff check .` pass
|
|
73
72
|
3. Explain in the PR description what changed and why
|
|
74
|
-
4. Wait for review
|
|
73
|
+
4. Wait for review, there may be small change requests before merging
|