-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspotify_api.js
128 lines (104 loc) · 4.07 KB
/
spotify_api.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import "dotenv/config.js";
//spotify auth flow, query functions/api calls, and custom object will live here
const spotifyClientId = process.env.SPOTIFY_API_CLIENT_ID;
const spotifyClientSecret = process.env.SPOTIFY_API_CLIENT_SECRET;
// console.log("testing process.env", spotifyClientId)
async function getToken() {
const response = await fetch('https://accounts.spotify.com/api/token', {
method: 'POST',
body: new URLSearchParams({
'grant_type': 'client_credentials',
}),
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + (Buffer.from(spotifyClientId + ':' + spotifyClientSecret).toString('base64')),
},
});
return await response.json();
}
//this function will return the unique spotify ID for a given track, taking in the artist name and track name as inputs
//need to take artist name and track name from backend database
async function searchTrack(artistName, trackName, access_token) {
const combinedQuery = `${artistName} ${trackName}`.replace(/ /g, '+');
const encodedQuery = encodeURIComponent(combinedQuery).replace(/%27/g, "'");
const url = `https://api.spotify.com/v1/search?q=${encodedQuery}&type=track&limit=1`;
console.log("Final URL:", url);
const response = await fetch(url, {
method: 'GET',
headers: { 'Authorization': 'Bearer ' + access_token },
});
const spotifyResponse = await response.json();
const songID = spotifyResponse.tracks.items[0].id;
return songID
}
// async function getTrackInfo(trackID, access_token) {
// const response = await fetch(`https://api.spotify.com/v1/tracks/${trackID}`, {
// method: 'GET',
// headers: { 'Authorization': 'Bearer ' + access_token },
// });
// return await response.json();
// }
// async function getTrackMetadata(trackID, access_token) {
// const response = await fetch(`https://api.spotify.com/v1/audio-features/${trackID}`, {
// method: 'GET',
// headers: { 'Authorization': 'Bearer ' + access_token },
// });
// return await response.json();
// }
async function getTrackInfo(trackID, access_token) {
try {
const response = await fetch(`https://api.spotify.com/v1/tracks/${trackID}`, {
method: 'GET',
headers: { 'Authorization': 'Bearer ' + access_token },
});
if (response.statusCode === 200) {
return await response.json();
} else if (response.statusCode === 429) {
const retryAfter = response.headers['retry-after'] ? parseInt(response.headers['retry-after']) * 1000 : null;
throw {
message: 'Rate Limit Exceeded',
statusCode: 429,
retryAfter: retryAfter
};
} else {
throw {
message: `Received unexpected status code ${response.statusCode}`,
statusCode: response.statusCode
};
}
} catch (error) {
console.error('Error fetching track info:', error);
throw error; // Re-throw the error if you want to handle it further up the call stack
}
}
async function getTrackMetadata(trackID, access_token) {
try {
const response = await fetch(`https://api.spotify.com/v1/audio-features/${trackID}`, {
method: 'GET',
headers: { 'Authorization': 'Bearer ' + access_token },
});
if (response.statusCode === 200) {
return await response.json();
} else if (response.statusCode === 429) {
const retryAfter = response.headers['retry-after'] ? parseInt(response.headers['retry-after']) * 1000 : null;
throw {
message: 'Rate Limit Exceeded',
statusCode: 429,
retryAfter: retryAfter
};
} else {
throw {
message: `Received unexpected status code ${response.statusCode}`,
statusCode: response.statusCode
};
}
} catch (error) {
console.error('Error fetching track metadata:', error);
throw error; // Re-throw the error if you want to handle it further up the call stack
}
}
export {getToken, searchTrack, getTrackInfo, getTrackMetadata}
// getToken().then(response => {
// searchTrack("Buddy Holly", "That'll Be The Day", response.access_token).then(profile => {
// })
// });