#!/usr/bin/env node /** * Anison & Anime MP3 Downloader * Dijalankan langsung dengan: node anison.js */ const fs = require('fs'); const path = require('path'); const { pipeline } = require('stream/promises'); // ========================================================================= // PENGATURAN LAGU DI DALAM FILE (Ubah judul lagu di sini): // ========================================================================= const QUERY = "Another colony TRUE"; // Contoh lagu anime dari Anison Online const DOWNLOAD_DIR = "./downloads"; // Lokasi folder download // ========================================================================= // Bisa juga menerima argumen dari terminal jika dioper: node anison.js "Judul Lagu" const targetQuery = process.argv.slice(2).join(" ").trim() || QUERY; const HEADERS = { "Content-Type": "application/x-www-form-urlencoded", "Origin": "https://spotidown.app", "Referer": "https://spotidown.app/en7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "X-Requested-With": "XMLHttpRequest" }; async function downloadSong() { console.log("=================================================="); console.log(" ANISON / ANIME MP3 DOWNLOADER (.JS) "); console.log("=================================================="); console.log(`[*] Target Query : "${targetQuery}"`); console.log(`[*] Mencari katalog musik & anime...`); // 1. Cari lagu di engine let cookie = ""; const searchRes = await fetch("https://spotidown.app/action", { method: "POST", headers: HEADERS, body: new URLSearchParams({ url: targetQuery, "g-recaptcha-response": "" }) }); if (!searchRes.ok) { throw new Error(`Pencarian gagal: HTTP ${searchRes.status}`); } const rawCookies = searchRes.headers.getSetCookie ? searchRes.headers.getSetCookie() : [searchRes.headers.get("set-cookie")]; cookie = rawCookies.map(c => (c || "").split(";")[0]).filter(Boolean).join("; "); const searchData = await searchRes.json(); if (searchData.error || !searchData.data) { throw new Error(searchData.message || "Lagu tidak ditemukan."); } const forms = [...searchData.data.matchAll(/
]*>(.*?)<\/form>/gis)]; if (!forms.length) { throw new Error(`Tidak ditemukan hasil untuk "${targetQuery}"`); } // Parse hasil teratas const dataMatch = forms[0][1].match(/name=["\']data["\']\s+value=["\']([^"\']+)["\']/i); if (!dataMatch) { throw new Error("Gagal mengurai metadata hasil pencarian."); } const meta = JSON.parse(Buffer.from(dataMatch[1], "base64").toString("utf-8")); const spotifyUrl = `https://open.spotify.com/track/${meta.tid}`; console.log(`\n[+] Lagu Ditemukan:`); console.log(` - Judul : ${meta.name}`); console.log(` - Artis : ${meta.artist}`); console.log(` - Album : ${meta.album || '-'}`); console.log(` - Durasi : ${meta.duration || '-'}`); console.log(` - Spotify : ${spotifyUrl}`); // 2. Ambil token konversi lagu console.log(`\n[*] Menyiapkan konversi audio 320kbps...`); const trackRes = await fetch("https://spotidown.app/action", { method: "POST", headers: { ...HEADERS, Cookie: cookie }, body: new URLSearchParams({ url: spotifyUrl, "g-recaptcha-response": "" }) }); const rawCookiesTrack = trackRes.headers.getSetCookie ? trackRes.headers.getSetCookie() : [trackRes.headers.get("set-cookie")]; if (rawCookiesTrack.length) { cookie = rawCookiesTrack.map(c => (c || "").split(";")[0]).filter(Boolean).join("; "); } const trackJson = await trackRes.json(); if (trackJson.error || !trackJson.data) { throw new Error(trackJson.message || "Gagal mendapatkan detail track."); } const dVal = trackJson.data.match(/name=["\']data["\']\s+value=["\']([^"\']+)["\']/i); const bVal = trackJson.data.match(/name=["\']base["\']\s+value=["\']([^"\']+)["\']/i); const tVal = trackJson.data.match(/name=["\']token["\']\s+value=["\']([^"\']+)["\']/i); if (!dVal || !bVal || !tVal) { throw new Error("Gagal mengekstrak token unduhan."); } // 3. Resolusi direct MP3 link const dlRes = await fetch("https://spotidown.app/action/track", { method: "POST", headers: { ...HEADERS, Cookie: cookie }, body: new URLSearchParams({ data: dVal[1], base: bVal[1], token: tVal[1] }) }); const dlJson = await dlRes.json(); if (dlJson.error || !dlJson.data) { throw new Error(dlJson.message || "Gagal membuat direct download link."); } const mp3Match = dlJson.data.match(/href=["\'](https:\/\/rapid\.spotidown\.app\/[^"\']+)["\']/i); if (!mp3Match) { throw new Error("Direct link MP3 tidak ditemukan di respon server."); } const mp3Url = mp3Match[1]; console.log(`[✓] Direct Link MP3 Siap:`); console.log(` ${mp3Url}\n`); // 4. Download file ke folder lokal if (!fs.existsSync(DOWNLOAD_DIR)) { fs.mkdirSync(DOWNLOAD_DIR, { recursive: true }); } const safeFilename = `${meta.name} - ${meta.artist}`.replace(/[\\/*?:"<>|]/g, "") + ".mp3"; const outputPath = path.join(DOWNLOAD_DIR, safeFilename); console.log(`[*] Mengunduh file MP3 ke: ${outputPath}...`); const fileRes = await fetch(mp3Url); if (!fileRes.ok) { throw new Error(`Gagal mendownload stream audio: HTTP ${fileRes.status}`); } const fileStream = fs.createWriteStream(outputPath); // @ts-ignore await pipeline(fileRes.body, fileStream); const stats = fs.statSync(outputPath); const sizeMB = (stats.size / (1024 * 1024)).toFixed(2); console.log("=================================================="); console.log(`[✓] SUKSES MENGUNDUH MP3!`); console.log(` - File : ${outputPath}`); console.log(` - Ukuran : ${sizeMB} MB`); console.log("=================================================="); } downloadSong().catch(err => { console.error("\n[!] Terjadi Kesalahan:", err.message); process.exit(1); });