const axios = require('axios'); const qs = require('qs'); const config = require('../config.json'); let accessToken = null; let tokenExpires = 0; async function getAccessToken() { if (accessToken && Date.now() < tokenExpires) return accessToken; const data = qs.stringify({ grant_type: 'client_credentials', client_id: config.SpotifyClientID, client_secret: config.SpotifyClientSecret, }); const res = await axios.post('https://accounts.spotify.com/api/token', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, }); accessToken = res.data.access_token; tokenExpires = Date.now() + res.data.expires_in * 1000; return accessToken; } async function fetchSpotifyPlaylist(playlistUrl) { const match = playlistUrl.match(/playlist\/([a-zA-Z0-9]+)/); if (!match) throw new Error('Invalid Spotify playlist URL'); const playlistId = match[1]; const token = await getAccessToken(); const headers = { Authorization: `Bearer ${token}` }; let offset = 0; const limit = 100; let allTracks = []; while (true) { const res = await axios.get(`https://api.spotify.com/v1/playlists/${playlistId}/tracks`, { headers, params: { offset, limit }, }); const tracks = res.data.items; if (!tracks.length) break; for (const item of tracks) { const track = item.track; if (!track || !track.name || !track.artists) continue; const artists = track.artists.map(a => a.name).join(', '); allTracks.push({ title: track.name, artist: artists, duration: Math.floor(track.duration_ms / 1000), url: track.external_urls.spotify, thumbnail: track.album?.images?.[0]?.url || '', }); } offset += limit; } return allTracks; } async function getSpotifyData(url) { const token = await getAccessToken(); const headers = { Authorization: `Bearer ${token}` }; // Track if (url.includes('/track/')) { const id = url.split('/track/')[1].split('?')[0]; const res = await axios.get(`https://api.spotify.com/v1/tracks/${id}`, { headers }); const t = res.data; return [{ title: t.name, artist: t.artists.map(a => a.name).join(', '), duration: Math.floor(t.duration_ms / 1000), url, thumbnail: t.album?.images?.[0]?.url || '', }]; } // Playlist if (url.includes('/playlist/')) { return await fetchSpotifyPlaylist(url); } return []; } module.exports = { fetchSpotifyPlaylist, getSpotifyData };