import SpotifyWebApi from 'spotify-web-api-node'; import { CLIENT_ID, CLIENT_SECRET } from '$env/static/private'; import { getRandomSearch } from '$lib/utils'; class SpotifyAPI { private api = new SpotifyWebApi({ clientId: CLIENT_ID, clientSecret: CLIENT_SECRET }); private exiresAt: Date = $state(new Date()); async refreshAccessToken() { // If current token is valid for at least 100ms more if (this.exiresAt.getTime() - new Date().getTime() > 10) { return true; } return await this.api.clientCredentialsGrant().then( (data) => { if (!data.body['expires_in'] || !data.body['access_token']) { return false; } const new_date = new Date(); new_date.setSeconds(new_date.getSeconds() + Number(data.body['expires_in'])); this.exiresAt = new_date; this.api.setAccessToken(data.body['access_token']); return true; }, function (err) { console.log('Something went wrong when retrieving an access token', err); return false; } ); } async getRandomAlbum() { if (!(await this.refreshAccessToken())) { return undefined; } const randomSearch = getRandomSearch(); const randomOffset = Math.floor(Math.random() * 1000); return await this.api.search(randomSearch, ['album'], { limit: 1, offset: randomOffset }).then( function (data) { if (data.body.albums?.items?.at(0)) { return data.body.albums.items.at(0); } }, (err) => { console.log(err); return undefined; } ); } } export const spotifyAPI = new SpotifyAPI();