/*** @ Base: https://spotidownloader.com/ @ Author: Shannz @ Note: Spotify Downloader (MP3/FLAC) with metadata. ***/ import axios from 'axios'; import { shannz as cf } from 'bycf'; const CONFIG = { BASE_URL: "https://api.spotidownloader.com", SITE_KEY: "0x4AAAAAAA8QAiFfE5GuBRRS", SITE_URL: "https://spotidownloader.com/", HEADERS: { 'User-Agent': 'ScRaPe/9.9 (KaliLinux; Nusantara Os; My/Shannz)', 'Accept': 'application/json', 'Content-Type': 'application/json', 'sec-ch-ua-platform': '"Android"', 'sec-ch-ua': '"Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"', 'sec-ch-ua-mobile': '?1', 'origin': 'https://spotidownloader.com', 'sec-fetch-site': 'same-site', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', 'referer': 'https://spotidownloader.com/', 'accept-language': 'id,en-US;q=0.9,en;q=0.8', 'priority': 'u=1, i' } }; const getTrackId = (url) => { const match = url.match(/(?:track|id)\/([a-zA-Z0-9]{22})/); return match ? match[1] : url; }; const loading = (text) => { let i = 0; return setInterval(() => { process.stdout.write(`\r${text}${'.'.repeat(i % 4)} `); i++; }, 500); }; export const spotify = { getSession: async () => { try { const turnstileToken = await cf.turnstileMin( CONFIG.BASE_URL + "/session", CONFIG.SITE_KEY, null ); if (!turnstileToken) throw new Error("Gagal generate Turnstile token"); const { data } = await axios.post( `${CONFIG.BASE_URL}/session`, { token: turnstileToken }, { headers: CONFIG.HEADERS } ); return data.token; } catch (error) { console.error(`\nError Get Session: ${error.message}`); return null; } }, download: async (urlOrId) => { const load = loading('[Spotify] Sedang memproses'); try { const trackId = getTrackId(urlOrId); const token = await spotify.getSession(); if (!token) { clearInterval(load); return { status: false, msg: 'Gagal mendapatkan sesi.' }; } const authHeaders = { ...CONFIG.HEADERS, 'Authorization': `Bearer ${token}` }; const metaRes = await axios.post( `${CONFIG.BASE_URL}/metadata`, { type: "track", id: trackId }, { headers: authHeaders } ); const metadata = metaRes.data; if (!metadata.success) { clearInterval(load); return { status: false, msg: 'Metadata tidak ditemukan.' }; } let isFlac = false; try { const flacRes = await axios.post( `${CONFIG.BASE_URL}/isFlacAvailable`, { id: trackId }, { headers: authHeaders } ); isFlac = flacRes.data.flacAvailable; } catch (e) { } const downRes = await axios.post( `${CONFIG.BASE_URL}/download`, { id: trackId }, { headers: authHeaders } ); clearInterval(load); process.stdout.write('\n'); return { status: true, metadata: { title: metadata.title, artist: metadata.artists, album: metadata.album, cover: metadata.cover, releaseDate: metadata.releaseDate, isFlacAvailable: isFlac }, download: { mp3: downRes.data.link, flac: downRes.data.linkFlac || null } }; } catch (error) { clearInterval(load); process.stdout.write('\n'); console.error(`Error Download: ${error.message}`); if (error.response) console.error(error.response.data); return { status: false, msg: error.message }; } } };