-
Notifications
You must be signed in to change notification settings - Fork 0
/
SpotifyPlaylistRandomizer.js
148 lines (123 loc) · 3.79 KB
/
SpotifyPlaylistRandomizer.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
const SpotifyWebApi = require("spotify-web-api-node");
const express = require("express");
const opn = require("opn");
const playlistIds = [
"2Tx0ThEDBEVaGymMTS4cvq",
"6yqP7AsF5t38ECTIFv9nnK",
"1Lc8GVU2zM4DerCaE42BxC",
];
// Function for shuffling tracks in array - Fisher–Yates shuffle
function shuffleTracks(allTracks, numberOfTracks) {
const shuffledTracks = allTracks.slice();
for (let i = shuffledTracks.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[shuffledTracks[i], shuffledTracks[j]] = [
shuffledTracks[j],
shuffledTracks[i],
];
}
return shuffledTracks.slice(0, numberOfTracks);
}
// Function for Spotify authorization
async function authorizeSpotify() {
const clientId = "YOUR_CLIENT_ID";
const clientSecret = "YOUR_CLIENT_SECRET";
const redirectUri = "http://localhost:3000/callback";
const spotifyApi = new SpotifyWebApi({
clientId,
clientSecret,
redirectUri,
});
const authorizeURL = spotifyApi.createAuthorizeURL(
["playlist-modify-public", "playlist-modify-private"],
null,
true
);
console.log(`Please log in at: ${authorizeURL}`);
opn(authorizeURL);
const authorizationCode = await new Promise((resolve) => {
const app = express();
const port = 3000;
app.get("/callback", (req, res) => {
const { code } = req.query;
res.send("Authorization completed. You can close this window.");
resolve(code);
server.close();
});
const server = app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
});
try {
const data = await spotifyApi.authorizationCodeGrant(authorizationCode);
console.log("Access token obtained");
console.log("Authentication data:", data.body);
spotifyApi.setAccessToken(data.body["access_token"]);
spotifyApi.setRefreshToken(data.body["refresh_token"]);
return spotifyApi;
} catch (err) {
console.error("Error during authorization:", err.message || err);
console.error("Error details:", err);
throw err;
}
}
// Function for downloading tracks from playlists
async function downloadTracksFromPlaylists(spotifyApi) {
let allTracks = [];
for (const playlistId of playlistIds) {
let offset = 0;
let playlistTracks;
do {
playlistTracks = await spotifyApi.getPlaylistTracks(playlistId, {
offset: offset,
limit: 100,
});
if (
!playlistTracks ||
!playlistTracks.body ||
!playlistTracks.body.items
) {
throw new Error(
`Error while retrieving tracks from playlist ${playlistId}`
);
}
const tracks = playlistTracks.body.items;
allTracks = allTracks.concat(tracks);
console.log(`Downloading tracks... ${allTracks.length}`);
offset += tracks.length;
} while (offset < playlistTracks.body.total);
}
console.log(`All tracks downloaded: ${allTracks.length}`);
return allTracks;
}
// Function for creating shuffled playlist
async function createShuffledPlaylist(numSongs, playlistName) {
const spotifyApi = await authorizeSpotify();
try {
const targetPlaylist = await spotifyApi.createPlaylist(playlistName, {
public: true,
});
const targetPlaylistId = targetPlaylist.body.id;
const allTracks = await downloadTracksFromPlaylists(spotifyApi);
const shuffledTracks = shuffleTracks(allTracks, numSongs);
const trackUris = shuffledTracks.map((track) => track.track.uri);
console.log(`Number of shuffled tracks: ${trackUris.length}`);
try {
const addedTracks = await spotifyApi.addTracksToPlaylist(
targetPlaylistId,
trackUris
);
console.log(
`Successfully created playlist "${targetPlaylist.body.name}" (ID: ${targetPlaylist.body.id}). Enjoy!`
);
} catch (err) {
console.error(
"Error during adding tracks to the new playlist:",
err.message || err
);
}
} catch (err) {
console.error("Error during playlist creation:", err);
}
}
createShuffledPlaylist(20, "TEST 1");