94 lines
2.7 KiB
JavaScript
94 lines
2.7 KiB
JavaScript
const SpotifyWebApi = require('spotify-web-api-node');
|
|
const ReadLine = require('readline');
|
|
const fs = require('fs').promises;
|
|
const path = require('path');
|
|
|
|
// Create the authorization URL
|
|
const rl = ReadLine.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
});
|
|
|
|
const root = path.join(__dirname, '..');
|
|
|
|
/*
|
|
{
|
|
"clientId": "",
|
|
"clientSecret": "",
|
|
"redirectUri": "https://lunasqu.ee/callback"
|
|
}
|
|
*/
|
|
const spotifyApi = new SpotifyWebApi(require(path.join(root, 'credentials.json')));
|
|
|
|
function ask(msg) {
|
|
return new Promise((resolve) => rl.question(msg, resolve));
|
|
}
|
|
|
|
async function setupSpotify() {
|
|
let credentials = {
|
|
token: null,
|
|
expires: null,
|
|
refresh: null,
|
|
};
|
|
|
|
try {
|
|
credentials = JSON.parse(await fs.readFile(path.join(root, '.token.json')));
|
|
} catch (e) {}
|
|
|
|
if (!credentials.token) {
|
|
const authorizeURL = spotifyApi.createAuthorizeURL(['playlist-modify-private'], 'FPEPFERHR234234trGEWErjrjsdw3666sf06');
|
|
console.log('Authorize the application');
|
|
console.log(authorizeURL);
|
|
const code = await ask('Enter code []> ');
|
|
|
|
if (!code) {
|
|
process.exit(1);
|
|
}
|
|
|
|
const data = await spotifyApi.authorizationCodeGrant(code);
|
|
console.log('The access token has been received.');
|
|
|
|
// Set the access token on the API object to use it in later calls
|
|
spotifyApi.setAccessToken(data.body['access_token']);
|
|
spotifyApi.setRefreshToken(data.body['refresh_token']);
|
|
|
|
credentials.token = data.body['access_token'];
|
|
credentials.expires = Math.floor(Date.now() / 1000) + data.body['expires_in'];
|
|
credentials.refresh = data.body['refresh_token'];
|
|
|
|
await fs.writeFile(path.join(root, '.token.json'), JSON.stringify(credentials, undefined, 2));
|
|
} else {
|
|
console.log('The access token is present');
|
|
spotifyApi.setAccessToken(credentials.token);
|
|
spotifyApi.setRefreshToken(credentials.refresh);
|
|
}
|
|
|
|
if ((credentials.expires * 1000) < Date.now()) {
|
|
console.log('Refreshing access token');
|
|
try {
|
|
const refresh = await spotifyApi.refreshAccessToken();
|
|
credentials.token = refresh.body['access_token'];
|
|
credentials.expires = Math.floor(Date.now() / 1000) + refresh.body['expires_in'];
|
|
spotifyApi.setAccessToken(credentials.token);
|
|
spotifyApi.setRefreshToken(credentials.refresh);
|
|
} catch (e) {
|
|
console.error(e);
|
|
console.log('need to reauthorize');
|
|
credentials.token = null;
|
|
}
|
|
await fs.writeFile(path.join(root, '.token.json'), JSON.stringify(credentials, undefined, 2));
|
|
if (!credentials.token) {
|
|
return setupSpotify();
|
|
}
|
|
}
|
|
|
|
console.log('the token is good until', new Date(credentials.expires * 1000).toString());
|
|
rl.close();
|
|
return spotifyApi;
|
|
}
|
|
|
|
module.exports = {
|
|
setupSpotify,
|
|
spotifyApi,
|
|
};
|