ccprojects/spotifyapi
0
1const express = require('express');2const axios = require('axios');3const app = express();4const PORT = process.env.PORT || 7860;5 6const SPOTIFY_API = {7 BASE: 'https://api.spotify.com/v1',8 AUTH: 'https://accounts.spotify.com/api/token',9 CLIENT_ID: 'b0cdfaef5b0b401299244ef88df29ffb',10 CLIENT_SECRET: '3e5949b78a214aecb2558b861911c1a9'11};12 13const FAB_DL_API = 'https://api.fabdl.com';14 15let spotifyToken = null;16let tokenExpiry = null;17 18async function getSpotifyToken() {19 if (spotifyToken && Date.now() < tokenExpiry) {20 return spotifyToken;21 }22 23 try {24 const authString = Buffer.from(`${SPOTIFY_API.CLIENT_ID}:${SPOTIFY_API.CLIENT_SECRET}`).toString('base64');25 const response = await axios.post(SPOTIFY_API.AUTH, 'grant_type=client_credentials', {26 headers: {27 'Content-Type': 'application/x-www-form-urlencoded',28 'Authorization': `Basic ${authString}`29 }30 });31 spotifyToken = response.data.access_token;32 tokenExpiry = Date.now() + (response.data.expires_in * 1000);33 return spotifyToken;34 } catch (error) {35 console.error(error);36 throw new Error('Failed to get Spotify token');37 }38}39 40function formatDuration(ms) {41 const minutes = Math.floor(ms / 60000);42 const seconds = Math.floor((ms % 60000) / 1000);43 return `${minutes}:${seconds.toString().padStart(2, '0')}`;44}45 46app.get('/api/spotify', async (req, res) => {47 try {48 const { url, search } = req.query;49 50 if (url) {51 const token = await getSpotifyToken();52 const trackId = url.split('/').pop().split('?')[0];53 const trackResponse = await axios.get(`${SPOTIFY_API.BASE}/tracks/${trackId}`, {54 headers: { 'Authorization': `Bearer ${token}` }55 });56 57 const fabResponse = await axios.get(`${FAB_DL_API}/spotify/get?url=${url}`);58 const downloadResponse = await axios.get(59 `${FAB_DL_API}/spotify/mp3-convert-task/${fabResponse.data.result.gid}/${fabResponse.data.result.id}`60 );61 62 res.json({63 title: trackResponse.data.name,64 artist: trackResponse.data.artists.map(a => a.name).join(', '),65 duration: formatDuration(trackResponse.data.duration_ms),66 cover: trackResponse.data.album.images[0]?.url,67 downloadUrl: `${FAB_DL_API}${downloadResponse.data.result.download_url}`68 });69 70 } else if (search) {71 const token = await getSpotifyToken();72 const searchResponse = await axios.get(73 `${SPOTIFY_API.BASE}/search?q=${encodeURIComponent(search)}&type=track&limit=10`,74 { headers: { 'Authorization': `Bearer ${token}` } }75 );76 77 const tracks = searchResponse.data.tracks.items.map(track => ({78 id: track.id,79 title: track.name,80 artist: track.artists.map(a => a.name).join(', '),81 duration: formatDuration(track.duration_ms),82 cover: track.album.images[0]?.url,83 url: track.external_urls.spotify84 }));85 86 res.json(tracks);87 } else {88 res.status(400).json({ error: 'Missing url or search parameter' });89 }90 } catch (error) {91 console.error(error);92 res.status(500).json({ error: 'Internal server error' });93 }94});95 96app.listen(PORT, () => {97 console.log(`Server running on port ${PORT}`);98});