spotify / server.js
yetarnished's picture
Update server.js
6062efa verified
Raw
History Blame Contribute Delete
3.07 kB
const express = require('express');
const fetch = require('node-fetch');
const querystring = require('querystring');
const app = express();
const port = 7860;
const clientId = process.env.SPOTIFY_CLIENT_ID;
const clientSecret = process.env.SPOTIFY_CLIENT_SECRET;
const redirectUri = process.env.SPOTIFY_REDIRECT_URI;
app.use(express.static('public'));
app.use(express.json());
app.get('/login', (req, res) => {
const scope = 'streaming user-read-private user-read-email user-read-currently-playing user-modify-playback-state playlist-read-private user-library-read user-library-modify user-follow-read';
res.redirect('https://accounts.spotify.com/authorize?' +
querystring.stringify({
response_type: 'code',
client_id: clientId,
scope: scope,
redirect_uri: redirectUri,
}));
});
app.get('/callback', async (req, res) => {
const code = req.query.code || null;
const authOptions = {
method: 'POST',
headers: {
'Authorization': 'Basic ' + (Buffer.from(clientId + ':' + clientSecret).toString('base64')),
'Content-Type': 'application/x-www-form-urlencoded'
},
body: querystring.stringify({
code: code,
redirect_uri: redirectUri,
grant_type: 'authorization_code'
})
};
try {
const response = await fetch('https://accounts.spotify.com/api/token', authOptions);
const data = await response.json();
if (!response.ok) {
console.error("Error from Spotify:", data);
res.status(response.status).send(`Error from Spotify: ${data.error_description || data.error}`);
return;
}
const token = data.access_token;
res.redirect('/#' + querystring.stringify({ access_token: token }));
return;
} catch (error) {
console.error("Network or other error during token exchange:", error);
res.status(500).send("An internal server error occurred.");
return;
}
});
// Endpoint to get recommendations
app.post('/recommendations', async (req, res) => {
const { access_token, seed_tracks, seed_artists, seed_genres } = req.body;
try {
const params = new URLSearchParams();
if (seed_tracks) params.append('seed_tracks', seed_tracks);
if (seed_artists) params.append('seed_artists', seed_artists);
if (seed_genres) params.append('seed_genres', seed_genres);
params.append('limit', '20');
const response = await fetch(`https://api.spotify.com/v1/recommendations?${params}`, {
headers: {
'Authorization': `Bearer ${access_token}`
}
});
if (!response.ok) {
const errorText = await response.text();
console.error('Spotify API error:', response.status, errorText);
res.status(response.status).json({ error: 'Failed to get recommendations' });
return;
}
const data = await response.json();
res.json(data);
} catch (error) {
console.error('Error getting recommendations:', error);
res.status(500).json({ error: 'Failed to get recommendations' });
}
});
app.listen(port, () => {
console.log(`App listening at port ${port}`);
});