| const axios = require("axios"); |
|
|
| const client_id = "6dc6b46d39c24a078ff5946b1295bd81"; |
| const client_secret = "f30d47e4b2ed46ec82ddc8e861e6cc99"; |
| const basic = Buffer.from(`${client_id}:${client_secret}`).toString("base64"); |
| const TOKEN_ENDPOINT = "https://accounts.spotify.com/api/token"; |
|
|
| async function spotifyCreds() { |
| try { |
| const response = await axios.post( |
| TOKEN_ENDPOINT, |
| "grant_type=client_credentials", { |
| headers: { |
| Authorization: "Basic " + basic, |
| }, |
| }, |
| ); |
| return { |
| status: true, |
| data: response.data, |
| }; |
| } catch (error) { |
| return { |
| status: false, |
| msg: "Failed to retrieve Spotify credentials.", |
| }; |
| } |
| } |
|
|
| const toTime = (ms) => { |
| let h = Math.floor(ms / 3600000); |
| let m = Math.floor(ms / 60000) % 60; |
| let s = Math.floor(ms / 1000) % 60; |
| return [h, m, s].map((v) => v.toString().padStart(2, "0")).join(":"); |
| }; |
|
|
| class Spotify { |
| search = async (query, type = "track", limit = 20) => { |
| try { |
| const creds = await spotifyCreds(); |
| if (!creds.status) return creds; |
|
|
| const response = await axios.get( |
| `https://api.spotify.com/v1/search?query=${encodeURIComponent(query)}&type=${type}&offset=0&limit=${limit}`, { |
| headers: { |
| Authorization: "Bearer " + creds.data.access_token, |
| }, |
| }, |
| ); |
|
|
| if ( |
| !response.data[type + "s"] || |
| !response.data[type + "s"].items.length |
| ) { |
| return { |
| msg: "Music not found!", |
| }; |
| } |
|
|
| return response.data[type + "s"].items.map((item) => ({ |
| title: item.name, |
| id: item.id, |
| duration: toTime(item.duration_ms), |
| artist: item.artists.map((artist) => artist.name).join(" & "), |
| url: item.external_urls.spotify, |
| thumbnail: item.album.images[0]?.url, |
| |
| })); |
| } catch (error) { |
| return { |
| status: false, |
| msg: "Error searching for music. " + error.message, |
| }; |
| } |
| }; |
|
|
| download = async (url) => { |
| const BASEURL = "https://api.fabdl.com"; |
| const headers = { |
| Accept: "application/json, text/plain, */*", |
| "Content-Type": "application/json", |
| "User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36", |
| }; |
|
|
| try { |
| const { |
| data: info |
| } = await axios.get(`${BASEURL}/spotify/get?url=${url}`, { |
| headers |
| }); |
| const { |
| gid, |
| id, |
| name, |
| image, |
| duration_ms |
| } = info.result; |
|
|
| const { |
| data: download |
| } = await axios.get(`${BASEURL}/spotify/mp3-convert-task/${gid}/${id}`, { |
| headers |
| }); |
| if (download.result.download_url) { |
| return { |
| title: name, |
| duration: duration_ms, |
| cover: image, |
| download: `${BASEURL}${download.result.download_url}` |
| } |
| } |
| } catch (error) { |
| console.error("Error downloading Spotify track:", error.message); |
| throw new Error(error.message); |
| } |
| }; |
| playlist = async function playlist(url) { |
| try { |
| const id = url.split("/playlist/")[0].trim().split("?si=")[0].trim(); |
| const { |
| data |
| } = await axios.get( |
| "https://api.spotifydown.com/trackList/playlist/0F1VNeiZKjtX06yrVSqlbu", { |
| headers: { |
| Accept: "*/*", |
| "Content-Type": "application/x-www-form-urlencoded", |
| "User-Agent": "Mozilla/5.0 (Linux; Android 6.0.1; SM-J500G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36", |
| Origin: "https://spotifydown.com", |
| Referer: "https://spotifydown.com/", |
| "Referrer-Policy": "strict-origin-when-cross-origin", |
| }, |
| }, |
| ).catch(e => e.response); |
| if (!data.trackList) return [] |
| return data.trackList.map((a) => ({ |
| ...a, |
| url: "https://open.spotify.com/track/" + a.id |
| })) |
| } catch (err) { |
| return [] |
| } |
| } |
| } |
| module.exports = new Spotify(); |