spotifyapi / spotify.js
ccprojects's picture
Create spotify.js
4d00e35 verified
const express = require('express');
const axios = require('axios');
const app = express();
const PORT = process.env.PORT || 7860;
const SPOTIFY_API = {
BASE: 'https://api.spotify.com/v1',
AUTH: 'https://accounts.spotify.com/api/token',
CLIENT_ID: 'b0cdfaef5b0b401299244ef88df29ffb',
CLIENT_SECRET: '3e5949b78a214aecb2558b861911c1a9'
};
const FAB_DL_API = 'https://api.fabdl.com';
let spotifyToken = null;
let tokenExpiry = null;
async function getSpotifyToken() {
if (spotifyToken && Date.now() < tokenExpiry) {
return spotifyToken;
}
try {
const authString = Buffer.from(`${SPOTIFY_API.CLIENT_ID}:${SPOTIFY_API.CLIENT_SECRET}`).toString('base64');
const response = await axios.post(SPOTIFY_API.AUTH, 'grant_type=client_credentials', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Basic ${authString}`
}
});
spotifyToken = response.data.access_token;
tokenExpiry = Date.now() + (response.data.expires_in * 1000);
return spotifyToken;
} catch (error) {
console.error(error);
throw new Error('Failed to get Spotify token');
}
}
function formatDuration(ms) {
const minutes = Math.floor(ms / 60000);
const seconds = Math.floor((ms % 60000) / 1000);
return `${minutes}:${seconds.toString().padStart(2, '0')}`;
}
app.get('/api/spotify', async (req, res) => {
try {
const { url, search } = req.query;
if (url) {
const token = await getSpotifyToken();
const trackId = url.split('/').pop().split('?')[0];
const trackResponse = await axios.get(`${SPOTIFY_API.BASE}/tracks/${trackId}`, {
headers: { 'Authorization': `Bearer ${token}` }
});
const fabResponse = await axios.get(`${FAB_DL_API}/spotify/get?url=${url}`);
const downloadResponse = await axios.get(
`${FAB_DL_API}/spotify/mp3-convert-task/${fabResponse.data.result.gid}/${fabResponse.data.result.id}`
);
res.json({
title: trackResponse.data.name,
artist: trackResponse.data.artists.map(a => a.name).join(', '),
duration: formatDuration(trackResponse.data.duration_ms),
cover: trackResponse.data.album.images[0]?.url,
downloadUrl: `${FAB_DL_API}${downloadResponse.data.result.download_url}`
});
} else if (search) {
const token = await getSpotifyToken();
const searchResponse = await axios.get(
`${SPOTIFY_API.BASE}/search?q=${encodeURIComponent(search)}&type=track&limit=10`,
{ headers: { 'Authorization': `Bearer ${token}` } }
);
const tracks = searchResponse.data.tracks.items.map(track => ({
id: track.id,
title: track.name,
artist: track.artists.map(a => a.name).join(', '),
duration: formatDuration(track.duration_ms),
cover: track.album.images[0]?.url,
url: track.external_urls.spotify
}));
res.json(tracks);
} else {
res.status(400).json({ error: 'Missing url or search parameter' });
}
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Internal server error' });
}
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});