spotify-export
Version:
54 lines (44 loc) • 1.63 kB
JavaScript
require('dotenv/config')
const SpotifyWebApi = require('spotify-web-api-node')
const fse = require('fs-extra')
const stringify = require('json-stringify-pretty-compact')
const config = require(`${process.cwd()}/spotify-export.config.json`)
const spotifyApi = new SpotifyWebApi({
clientId: process.env.SPOTIFY_CLIENT_ID,
clientSecret: process.env.SPOTIFY_CLIENT_SECRET,
redirectUri: 'https://spotify-export.vercel.app/callback',
})
const asyncForEach = async (array, callback) => {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
}
const main = async () => {
const {
body: { access_token: accessToken },
} = await spotifyApi.clientCredentialsGrant()
spotifyApi.setAccessToken(accessToken)
const getAllTracks = async (playlist) => {
let tracks = []
const { body } = await spotifyApi.getPlaylistTracks(playlist)
tracks = body.items
if (body.total > 100)
for (let i = 1; i < Math.ceil(body.total / 100); i++) {
const add = await spotifyApi.getPlaylistTracks(playlist, { offset: 100 * i })
tracks = [...tracks, ...add.body.items]
}
return tracks
}
await asyncForEach(config.playlists, async ([id, exportPath]) => {
const tracks = await getAllTracks(id)
const formattedTracks = tracks.map((x) => ({
name: x.track.name,
album: { name: x.track.album.name, id: x.track.album.id },
artist: x.track.artists.map((a) => ({ name: a.name, id: a.id })),
id: x.track.id,
}))
fse.outputFileSync(exportPath, stringify(formattedTracks))
})
}
main()