|
|
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(); |