media-dl 2.2.2 → 2.3.1

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.
Files changed (4) hide show
  1. package/bin/cli.js +98 -20
  2. package/package.json +28 -11
  3. package/readme.md +54 -58
  4. package/.gppignore +0 -12
package/bin/cli.js CHANGED
@@ -9,11 +9,14 @@ const { C, printHeader, renderProgressBar, askQuestion, rl } = require('./ui');
9
9
  // --- KONFIGURASI VISUAL (ANSI COLORS) ---
10
10
 
11
11
  const TOOLS_DIR = path.join(os.homedir(), '.media-dl');
12
+
12
13
  const isWindows = process.platform === 'win32';
13
14
  const isMac = process.platform === 'darwin';
15
+ const isTermux =
16
+ process.env.PREFIX && process.env.PREFIX.includes('com.termux');
14
17
 
15
- const YTDLP_PATH = path.join(TOOLS_DIR, isWindows ? 'yt-dlp.exe' : 'yt-dlp');
16
- const FFMPEG_PATH = path.join(TOOLS_DIR, isWindows ? 'ffmpeg.exe' : 'ffmpeg');
18
+ let YTDLP_PATH = path.join(TOOLS_DIR, isWindows ? 'yt-dlp.exe' : 'yt-dlp');
19
+ let FFMPEG_PATH = path.join(TOOLS_DIR, isWindows ? 'ffmpeg.exe' : 'ffmpeg');
17
20
 
18
21
  // State Aplikasi
19
22
  let safeMode = true;
@@ -21,10 +24,40 @@ let safeMode = true;
21
24
  if (!fs.existsSync(TOOLS_DIR)) fs.mkdirSync(TOOLS_DIR, { recursive: true });
22
25
 
23
26
  function checkTools() {
24
- return {
25
- ytExists: fs.existsSync(YTDLP_PATH),
26
- ffExists: fs.existsSync(FFMPEG_PATH),
27
- };
27
+ let ytExists = fs.existsSync(YTDLP_PATH);
28
+ let ffExists = fs.existsSync(FFMPEG_PATH);
29
+
30
+ // Cek Global yt-dlp
31
+ if (!ytExists) {
32
+ try {
33
+ const cmd = isWindows ? 'where yt-dlp' : 'which yt-dlp';
34
+ const pathFound = execSync(cmd, { stdio: ['ignore', 'pipe', 'ignore'] })
35
+ .toString()
36
+ .trim()
37
+ .split('\n')[0];
38
+ if (pathFound) {
39
+ YTDLP_PATH = pathFound; // UPDATE PATH KE GLOBAL
40
+ ytExists = true;
41
+ }
42
+ } catch (e) {}
43
+ }
44
+
45
+ // Cek Global ffmpeg
46
+ if (!ffExists) {
47
+ try {
48
+ const cmd = isWindows ? 'where ffmpeg' : 'which ffmpeg';
49
+ const globalPath = execSync(cmd, { stdio: ['ignore', 'pipe', 'ignore'] })
50
+ .toString()
51
+ .trim()
52
+ .split('\n')[0];
53
+ if (globalPath) {
54
+ FFMPEG_PATH = globalPath; // UPDATE PATH KE GLOBAL
55
+ ffExists = true;
56
+ }
57
+ } catch (e) {}
58
+ }
59
+
60
+ return { ytExists, ffExists, allReady: ytExists && ffExists };
28
61
  }
29
62
 
30
63
  // --- INSTALLERS ---
@@ -36,17 +69,31 @@ async function installYtdlp() {
36
69
  const url = isWindows
37
70
  ? 'https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.exe'
38
71
  : 'https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp';
72
+
39
73
  try {
40
- if (isWindows) {
74
+ if (isTermux) {
75
+ // Di Termux, lebih disarankan menggunakan python/pip untuk stabilitas
76
+ console.log(`${C.dim}Menginstall yt-dlp via python...${C.reset}`);
77
+ execSync('pkg update && pkg install python ffmpeg -y', {
78
+ stdio: 'inherit',
79
+ });
80
+ execSync('pip install -U "yt-dlp[default]"', { stdio: 'inherit' });
81
+ console.log(
82
+ `\n${C.green}✅ yt-dlp berhasil diinstal di Termux!${C.reset}`,
83
+ );
84
+ } else if (isWindows) {
41
85
  execSync(
42
86
  `powershell -Command "Invoke-WebRequest -Uri ${url} -OutFile '${YTDLP_PATH}'"`,
43
87
  { stdio: 'inherit' },
44
88
  );
45
89
  } else {
90
+ // Linux (Ubuntu) & macOS
46
91
  execSync(`curl -L -# "${url}" -o "${YTDLP_PATH}"`, { stdio: 'inherit' });
47
92
  execSync(`chmod a+rx "${YTDLP_PATH}"`);
48
93
  }
49
- console.log(`\n${C.green}✅ yt-dlp berhasil dikonfigurasi!${C.reset}`);
94
+ if (!isTermux) {
95
+ console.log(`\n${C.green}✅ yt-dlp berhasil dikonfigurasi!${C.reset}`);
96
+ }
50
97
  } catch (e) {
51
98
  console.error(
52
99
  `\n${C.red}❌ Gagal mengunduh. Periksa koneksi internet Anda.${C.reset}`,
@@ -61,7 +108,15 @@ async function installFfmpeg() {
61
108
  );
62
109
 
63
110
  try {
64
- if (isMac) {
111
+ if (isTermux) {
112
+ console.log(
113
+ `${C.blue}⏳ Mendeteksi Termux: Menginstall via pkg...${C.reset}`,
114
+ );
115
+ execSync('pkg update && pkg install ffmpeg -y', { stdio: 'inherit' });
116
+ console.log(
117
+ `\n${C.green}✅ FFmpeg berhasil diinstal di Termux!${C.reset}`,
118
+ );
119
+ } else if (isMac) {
65
120
  // ... (Kode macOS Anda sudah benar)
66
121
  console.log(`${C.blue}⏳ Mengunduh FFmpeg untuk macOS...${C.reset}`);
67
122
  const zipPath = path.join(TOOLS_DIR, 'ffmpeg.zip');
@@ -104,6 +159,18 @@ async function installFfmpeg() {
104
159
  console.log(
105
160
  `\n${C.green}✅ FFmpeg berhasil diinstal di Windows!${C.reset}`,
106
161
  );
162
+ } else {
163
+ // Asumsi Linux (Ubuntu/Debian)
164
+ console.log(
165
+ `${C.blue}⏳ Mendeteksi Linux: Menginstall via apt...${C.reset}`,
166
+ );
167
+ console.log(`${C.dim}Mungkin memerlukan password sudo.${C.reset}`);
168
+ execSync('sudo apt update && sudo apt install ffmpeg -y', {
169
+ stdio: 'inherit',
170
+ });
171
+ console.log(
172
+ `\n${C.green}✅ FFmpeg berhasil diinstal di Linux!${C.reset}`,
173
+ );
107
174
  }
108
175
  } catch (e) {
109
176
  console.error(
@@ -178,8 +245,12 @@ async function startDownload(videoURLFromArgs = null) {
178
245
 
179
246
  try {
180
247
  const rawInfo = execSync(
181
- `"${YTDLP_PATH}" --flat-playlist --print "%(playlist_title)s|%(title)s" "${videoURL}"`,
182
- { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] },
248
+ `"${YTDLP_PATH}" --flat-playlist --no-warnings --print "%(playlist_title)s|%(title)s" "${videoURL}"`,
249
+ {
250
+ encoding: 'utf-8',
251
+ stdio: ['ignore', 'pipe', 'ignore'],
252
+ timeout: 20000,
253
+ },
183
254
  );
184
255
  const lines = rawInfo.trim().split('\n');
185
256
  if (lines.length > 1 || videoURL.includes('playlist?list=')) {
@@ -187,7 +258,22 @@ async function startDownload(videoURLFromArgs = null) {
187
258
  playlistInfo.title = lines[0].split('|')[0] || 'Unduhan Playlist';
188
259
  playlistInfo.items = lines.map((l) => l.split('|')[1]).filter(Boolean);
189
260
  }
190
- } catch (e) {}
261
+ } catch (e) {
262
+ console.log(`\n${C.red}❌ Gagal menganalisa tautan.${C.reset}`);
263
+
264
+ if (e.message.includes('ETIMEDOUT')) {
265
+ console.log(
266
+ `${C.yellow}⚠️ Waktu analisa habis. Periksa koneksi internet Anda.${C.reset}`,
267
+ );
268
+ } else {
269
+ console.log(
270
+ `${C.yellow}⚠️ Pastikan link valid atau tidak diprivat/dihapus.${C.reset}`,
271
+ );
272
+ }
273
+
274
+ await askQuestion('\nTekan Enter untuk kembali ke menu...');
275
+ return mainMenu(); // Keluar dari fungsi dan balik ke menu utama
276
+ }
191
277
 
192
278
  let playlistSelection = null;
193
279
  if (playlistInfo.isPlaylist) {
@@ -470,14 +556,6 @@ async function cleanUp() {
470
556
  fs.rmSync(TOOLS_DIR, { recursive: true, force: true });
471
557
  }
472
558
 
473
- function checkTools() {
474
- return {
475
- ytExists: fs.existsSync(YTDLP_PATH),
476
- ffExists: fs.existsSync(FFMPEG_PATH),
477
- allReady: fs.existsSync(YTDLP_PATH) && fs.existsSync(FFMPEG_PATH),
478
- };
479
- }
480
-
481
559
  async function firstTimeSetup() {
482
560
  while (true) {
483
561
  const { ytExists, ffExists } = checkTools();
package/package.json CHANGED
@@ -1,30 +1,47 @@
1
1
  {
2
2
  "name": "media-dl",
3
- "version": "2.2.2",
3
+ "version": "2.3.1",
4
4
  "description": "CLI Downloader video/audio lintas platform menggunakan yt-dlp.",
5
5
  "main": "bin/cli.js",
6
+ "bin": {
7
+ "media-dl": "bin/cli.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "README.md",
12
+ "license"
13
+ ],
6
14
  "scripts": {
7
15
  "dev": "npm un -g media-dl && npm i -g . && media-dl",
8
- "start": "npm un -g media-dl && npm i -g media-dl@latest && media-dl",
16
+ "prod": "npm un -g media-dl && npm i -g media-dl@latest && media-dl",
17
+ "start": "node bin/cli.js",
9
18
  "release": "npm version patch && npm publish",
10
19
  "release:minor": "npm version minor && npm publish",
11
20
  "release:major": "npm version major && npm publish"
12
21
  },
13
- "bin": {
14
- "media-dl": "bin/cli.js"
15
- },
16
- "publishConfig": {
17
- "access": "public"
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/Ariska138/media-dl.git"
18
25
  },
19
26
  "keywords": [
20
27
  "downloader",
21
- "youtube",
22
- "cross-platform",
23
- "media-dl"
28
+ "video-downloader",
29
+ "youtube-dl",
30
+ "yt-dlp",
31
+ "tiktok-downloader",
32
+ "instagram-downloader",
33
+ "cli",
34
+ "cross-platform"
24
35
  ],
25
36
  "author": "Ariska Hidayat",
26
37
  "license": "MIT",
27
- "dependencies": {},
38
+ "bugs": {
39
+ "url": "https://github.com/Ariska138/media-dl/issues"
40
+ },
41
+ "homepage": "https://github.com/Ariska138/media-dl#readme",
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
28
45
  "engines": {
29
46
  "node": ">=14.0.0"
30
47
  }
package/readme.md CHANGED
@@ -2,106 +2,102 @@
2
2
 
3
3
  **The Ultimate Cross-Platform Media Engine Manager**
4
4
 
5
- Media-DL Pro adalah *CLI wrapper* canggih berbasis `yt-dlp` yang dirancang untuk pengguna profesional yang membutuhkan kecepatan, keteraturan, dan keamanan akun. Bukan sekadar pengunduh, ini adalah manajer media lokal yang cerdas.
5
+ Media-DL Pro adalah *CLI wrapper* canggih berbasis `yt-dlp` yang dirancang untuk kecepatan, keteraturan, dan keamanan. Bukan sekadar pengunduh, ini adalah manajer media lokal yang cerdas dengan sistem instalasi otomatis.
6
6
 
7
7
  ---
8
8
 
9
- ## 🛡️ Mengapa Media-DL Pro?
9
+ ## Fitur Unggulan Baru
10
10
 
11
- ### 1. Safe Mode Guard™ (Exclusive)
11
+ ### 1. Direct Download & Menu Mode
12
12
 
13
- Jangan biarkan IP atau akun Anda terblokir. Media-DL dilengkapi dengan mode proteksi yang mensimulasikan perilaku manusia melalui:
13
+ Sekarang kamu bisa memilih dua cara penggunaan:
14
14
 
15
- * **Smart Rate Limiting**
16
- Membatasi kecepatan unduh hingga 5 MB/s.
15
+ * **Interactive Mode**: Cukup ketik `media-dl` untuk masuk ke menu utama yang cantik.
16
+ * **Fast Mode**: Ketik `media-dl <url>` untuk langsung masuk ke proses download tanpa basa-basi.
17
17
 
18
- * **Randomized Sleep**
19
- Interval jeda otomatis 3–10 detik antar unduhan.
18
+ ### 2. 📱 Android (Termux) Ready
20
19
 
21
- * **Custom User-Agents**
22
- Menggunakan identitas browser modern untuk menghindari deteksi bot.
20
+ Dukungan penuh untuk pengguna mobile via Termux dengan script instalasi otomatis yang menyesuaikan lingkungan Linux Android.
23
21
 
24
- ---
22
+ ### 3. 🛡️ Safe Mode Guard™ (Updated)
25
23
 
26
- ### 2. Dashboard Status Real-Time
24
+ Menghindari deteksi bot dengan:
27
25
 
28
- Pantau kesehatan sistem Anda secara langsung. Aplikasi mendeteksi secara otomatis ketersediaan `yt-dlp` dan `FFmpeg` untuk memastikan hasil unduhan maksimal.
26
+ * **Rate Limiting**: Dibatasi hingga 5 MB/s.
27
+ * **Smart Sleep**: Jeda acak 3–10 detik.
28
+ * **Modern User-Agent**: Identitas browser terbaru agar tetap aman.
29
29
 
30
30
  ---
31
31
 
32
- ### 3. Pengunduhan Massal & Selektif
32
+ ## 🎞️ Platform yang Didukung
33
+
34
+ Berkat engine `yt-dlp` yang selalu diperbarui, kamu bisa mengunduh dari:
33
35
 
34
- Mendukung unduhan playlist secara penuh dengan fitur seleksi item yang presisi
35
- (contoh: `1,3,5-10`).
36
+ * **YouTube**: Video, Shorts, & Playlist.
37
+ * **Social Media**: TikTok, Instagram Reels, Twitter (X).
38
+ * **VOD Services**: Dan ratusan platform video lainnya.
36
39
 
37
40
  ---
38
41
 
39
- ### 4. Optimalisasi Format Otomatis
42
+ ## 📦 Instalasi
40
43
 
41
- * **Video**
42
- Konversi cerdas ke kontainer MP4 dengan codec `AVC1` agar kompatibel dengan perangkat seluler dan editor profesional.
44
+ ### Prasyarat
43
45
 
44
- * **Audio**
45
- Ekstraksi MP3 kualitas tinggi (320 kbps) langsung ke folder musik Anda.
46
+ * **Node.js**: Versi 14.0.0 atau lebih tinggi.
46
47
 
47
- ---
48
-
49
- ## 📦 Instalasi Cepat
48
+ ### Cara Install
50
49
 
51
50
  ```bash
52
- # Pastikan Node.js sudah terinstal
53
51
  npm install -g media-dl
54
- ```
55
-
56
- Cukup ketik `media-dl` di terminal Anda untuk memulai.
57
-
58
- ---
59
-
60
- ## 🛠️ Navigasi Sistem
61
52
 
62
- Aplikasi ini memiliki pusat kendali yang terorganisir:
53
+ ```
63
54
 
64
- 1. **📥 Main Service**
65
- Layanan unduh media tunggal atau playlist.
55
+ ### Penggunaan
66
56
 
67
- 2. **🛡️ Toggle Safe Mode**
68
- Aktifkan atau nonaktifkan perlindungan keamanan secara instan.
57
+ ```bash
58
+ # Buka menu utama
59
+ media-dl
69
60
 
70
- 3. **⚙️ Maintenance**
71
- Perbarui engine otomatis atau bersihkan sistem dari file sampah.
61
+ # Download langsung tanpa menu
62
+ media-dl https://www.youtube.com/watch?v=example
72
63
 
73
- 4. **❤️ About**
74
- Informasi pengembang dan daftar fitur lengkap.
64
+ ```
75
65
 
76
66
  ---
77
67
 
78
- ## 📂 Struktur Penyimpanan
68
+ ## 🛠️ Navigasi Sistem
79
69
 
80
- Media Anda akan tersimpan secara otomatis dengan struktur profesional di direktori pengguna:
70
+ 1. **📥 Download Media**: Mendukung pemilihan kualitas (Video/Audio MP3) dan seleksi playlist (misal: `1,3,5-10`).
71
+ 2. **🛡️ Toggle Safe Mode**: Aktifkan perlindungan tambahan secara *on-the-fly*.
72
+ 3. **⚙️ Maintenance**: Update otomatis `yt-dlp` dan `FFmpeg` langsung dari aplikasi tanpa perlu download manual.
73
+ 4. **🗑️ Reset System**: Hapus semua engine untuk instalasi ulang yang bersih.
81
74
 
82
- * **Video**
83
- `~/Downloads/media-dl/video/`
75
+ ---
84
76
 
85
- * **Audio**
86
- `~/Downloads/media-dl/audio/`
77
+ ## 💻 Kompatibilitas Sistem
87
78
 
88
- * **Playlist**
89
- Sub-folder otomatis sesuai judul playlist agar tetap rapi.
79
+ | Sistem Operasi | Status | Cara Kerja |
80
+ | --- | --- | --- |
81
+ | **Windows** | ✅ Supported | Auto-download `.exe` ke folder `~/.media-dl` |
82
+ | **macOS** | ✅ Supported | Auto-download via `curl` |
83
+ | **Linux** | ✅ Supported | Integrasi via `apt` (Debian/Ubuntu) |
84
+ | **Termux** | ✅ Supported | Integrasi via `pkg` & `pip` |
90
85
 
91
86
  ---
92
87
 
93
- ## ❤️ Dukung Pengembangan
88
+ ## 📂 Struktur Penyimpanan
94
89
 
95
- Media-DL Pro dikembangkan oleh **Ariska Hidayat** dan tersedia secara gratis. Dukungan Anda membantu kami terus memperbarui engine untuk mengatasi perubahan algoritma platform media.
90
+ Unduhan kamu akan tersimpan rapi di:
96
91
 
97
- | Layanan | Link Donasi |
98
- | ------------------ | ------------------------------------------------------ |
99
- | **☕ Traktir Kopi** | [Donasi via Midtrans](https://app.midtrans.com/coffee) |
100
- | **🍕 Beli Pizza** | [Donasi via Midtrans](https://app.midtrans.com/pizza) |
92
+ * **Video**: `~/Downloads/media-dl/video/`
93
+ * **Audio**: `~/Downloads/media-dl/audio/`
94
+ * **Playlist**: Sub-folder otomatis berdasarkan nama playlist.
101
95
 
102
96
  ---
103
97
 
104
- ## 📄 Lisensi
98
+ ## ❤️ Dukungan
99
+
100
+ Aplikasi ini dikembangkan oleh **Ariska Hidayat**. Jika bermanfaat, kamu bisa memberikan dukungan untuk biaya pemeliharaan server/engine:
105
101
 
106
- Didistribusikan di bawah **Lisensi MIT**.
107
- Dibuat dengan ❤️ untuk komunitas open source.
102
+ * **☕ Traktir Kopi**: [Midtrans Coffee](https://app.midtrans.com/coffee)
103
+ * **🍕 Beli Pizza**: [Midtrans Pizza](https://app.midtrans.com/pizza)
package/.gppignore DELETED
@@ -1,12 +0,0 @@
1
- node_modules
2
- .*
3
- dist
4
- build
5
- coverage
6
- project-info.txt
7
- *.md
8
- package-lock.json
9
- *.log
10
- npm-debug.log*
11
- yarn-debug.log*
12
- yarn-error.log*