# SpotubeDL Client (Node.js) Client Node.js (ESM) untuk mengambil metadata Spotify dan link unduhan audio (MP3) tanpa API key, tanpa yt-dlp, tanpa ffmpeg. Metadata diambil lewat protokol terenkripsi [SpotubeDL](https://spotubedl.com). Audio di-resolve dari sumber publik (CDN / mirror). --- ## Syarat - **Node.js 18+** (butuh built-in `fetch` & `crypto`) - Tidak perlu dependency npm - Tidak perlu akun / API key ```bash # cek versi node -v ``` --- ## Instalasi Salin file `spotubedl.mjs` (atau rename ke `spotube.js`) ke folder project: ```bash # contoh di Termux / Linux mkdir -p ~/scraper && cd ~/scraper # letakkan spotubedl.mjs di sini ``` Jalankan langsung: ```bash node spotubedl.mjs help ``` --- ## CLI ### Search ```bash node spotubedl.mjs search "nothin on you" node spotubedl.mjs search track "nothin on you" node spotubedl.mjs search album "bobby ray" node spotubedl.mjs search playlist "chill" node spotubedl.mjs search artist "bruno mars" ``` **Response** ```json { "status": "success", "message": "20 track(s) ditemukan", "query": "nothin on you", "type": "track", "data": [ { "name": "Nothin' on You (feat. Bruno Mars)", "artist": "B.o.B", "artists": ["B.o.B", "Bruno Mars"], "album_name": "B.o.B Presents: The Adventures of Bobby Ray", "cover_url": "https://i.scdn.co/image/...", "duration": 268, "id": "59dLtGBS26x7kc0rHbaPrq", "url": "https://open.spotify.com/track/59dLtGBS26x7kc0rHbaPrq", "explicit": false } ] } ``` ### Info (track / album / playlist / artist) Otomatis deteksi dari URL: ```bash node spotubedl.mjs info https://open.spotify.com/track/59dLtGBS26x7kc0rHbaPrq node spotubedl.mjs info https://open.spotify.com/album/0xHAdClnuGbN90WQV2RfwK node spotubedl.mjs info https://open.spotify.com/playlist/3HNsWSPRdZooTeyAxIpUhn node spotubedl.mjs info https://open.spotify.com/artist/2qNrJcE9LjzPdiXbrjkqFa # atau cukup tempel URL node spotubedl.mjs https://open.spotify.com/playlist/3HNsWSPRdZooTeyAxIpUhn ``` Album & playlist mengembalikan daftar `tracks` (id + metadata per lagu). ### Download URL track (tanpa simpan file) Hanya untuk **track**: ```bash node spotubedl.mjs download https://open.spotify.com/track/59dLtGBS26x7kc0rHbaPrq node spotubedl.mjs download 59dLtGBS26x7kc0rHbaPrq ``` **Response** ```json { "status": "success", "message": "Download URL siap", "data": { "spotifyId": "59dLtGBS26x7kc0rHbaPrq", "videoId": "wQJIkbvUVPQ", "youtubeUrl": "https://www.youtube.com/watch?v=wQJIkbvUVPQ", "downloadUrl": "https://...", "filename": "Nothin' on You (feat. Bruno Mars) - B.o.B.mp3", "source": "cdn", "track": { "name": "Nothin' on You (feat. Bruno Mars)", "artist": "B.o.B", "artists": ["B.o.B", "Bruno Mars"], "album_name": "B.o.B Presents: The Adventures of Bobby Ray", "cover_url": "https://i.scdn.co/image/...", "duration": 268, "release_date": "2010-04-27", "id": "59dLtGBS26x7kc0rHbaPrq", "url": "https://open.spotify.com/track/59dLtGBS26x7kc0rHbaPrq", "explicit": false, "isrc": "USAT20904033" } } } ``` > `downloadUrl` bersifat sementara (biasanya ~10 menit). Unduh segera setelah didapat. ### Simpan file ke disk ```bash node spotubedl.mjs save 59dLtGBS26x7kc0rHbaPrq node spotubedl.mjs save 59dLtGBS26x7kc0rHbaPrq laguku.mp3 ``` **Response** ```json { "status": "success", "message": "File tersimpan", "data": { "savedAs": "Nothin' on You (feat. Bruno Mars) - B.o.B.mp3", "bytes": 10737418, "sizeMB": 10.24, "spotifyId": "59dLtGBS26x7kc0rHbaPrq", "videoId": "wQJIkbvUVPQ", "filename": "Nothin' on You (feat. Bruno Mars) - B.o.B.mp3", "track": { "...": "..." } } } ``` ### Album / Playlist ```bash node spotubedl.mjs album 7apLPYT8szV1IqTxyVSy5P node spotubedl.mjs playlist ``` ### Error ```json { "status": "error", "message": "..." } ``` --- ## Pemakaian sebagai library ```js import { SpotubeDL } from './spotubedl.mjs'; const client = new SpotubeDL(); // Search const search = await client.search('blinding lights'); console.log(search.data); // Metadata track const track = await client.getTrack('59dLtGBS26x7kc0rHbaPrq'); // Resolve download URL (tanpa simpan) const info = await client.downloadTrack('59dLtGBS26x7kc0rHbaPrq'); console.log(info.downloadUrl); console.log(info.track); // Simpan ke disk const saved = await client.saveTrack('59dLtGBS26x7kc0rHbaPrq', 'out.mp3'); console.log(saved.savedAs, saved.bytes); ``` ### Method utama | Method | Deskripsi | |--------|-----------| | `search(query)` | Cari track / album / playlist / artist | | `getTrack(id\|url)` | Metadata track Spotify | | `getAlbum(id\|url)` | Metadata album | | `getPlaylist(id\|url)` | Metadata playlist | | `getArtist(id\|url)` | Metadata artist | | `getMetadata(id\|url)` | Metadata lengkap + match YouTube | | `downloadTrack(id\|url)` | Metadata + `downloadUrl` audio | | `saveTrack(id\|url, path?)` | Unduh file MP3 ke disk | --- ## Ringkasan perintah | Perintah | Output | |----------|--------| | `search [type] ` | JSON list hasil | | `info ` | JSON metadata (track/album/playlist/artist) | | `download ` | JSON track + `downloadUrl` MP3 | | `save [file]` | JSON + file tersimpan | | `album \| playlist \| artist ` | JSON metadata | | `` | Sama seperti `info` (auto-detect) | `type` search: `track` (default) · `album` · `playlist` · `artist` --- ## Catatan - Hanya untuk penggunaan pribadi / non-komersial. - Tidak berafiliasi dengan Spotify atau SpotubeDL. - Kualitas & ketersediaan audio tergantung sumber publik. - Link unduhan bisa kedaluwarsa; jangan cache terlalu lama. - Beberapa jaringan/ISP bisa memblokir host CDN tertentu — client mencoba beberapa sumber secara otomatis. --- ## Troubleshooting | Gejala | Saran | |--------|--------| | `status: error` + message jaringan | Cek koneksi / coba lagi (sumber bisa rate-limit) | | `downloadUrl` 403 saat dibuka | Link sudah expire — panggil `download` lagi | | Node lama | Upgrade ke Node 18+ | | `fetch is not defined` | Node < 18; upgrade atau polyfill | --- ## Lisensi Gunakan dengan tanggung jawab sendiri. Hormati hak cipta konten yang diunduh.