Skip to content

Instantly share code, notes, and snippets.

@guzart
Created November 29, 2024 21:03
Show Gist options
  • Save guzart/60f9a2908b93b71d8bc6482a2188d8dc to your computer and use it in GitHub Desktop.
Save guzart/60f9a2908b93b71d8bc6482a2188d8dc to your computer and use it in GitHub Desktop.
Export a Playlist from Spotify web player
let myPlaylist = {}
const trackNumberColumn = 1
const trackNameColumn = 2
const trackArtistColumn = 3
const trackListContainer = document.querySelector("[data-testid='track-list']");
const totalHeight = trackListContainer.scrollHeight;
let currentPosition = 0;
exportPlaylist();
function exportPlaylist() {
if (currentPosition < totalHeight) {
appendNextToPlaylist()
} else {
const tracks = Object.keys(myPlaylist)
.map((trackNumber) => [trackNumber, myPlaylist[trackNumber]])
.sort((a, b) => a[0] - b[0])
.map((track) => track[1]);
console.log(tracks.join("\n"));
}
}
function appendNextToPlaylist() {
const currentTrackList = trackListContainer.querySelectorAll("[data-testid='tracklist-row']");
trackListContainer.offsetParent.scrollTo(0, currentPosition);
currentPosition += currentTrackList.length * 12; // assume each row is 12px height
setTimeout(() => {
currentTrackList.forEach((trackRow) => {
const numberCell = trackRow.querySelector(`[role='gridcell'][aria-colindex='${trackNumberColumn}']`)
const number = parseInt(numberCell.innerText, 10)
if (myPlaylist[number] === undefined) {
const nameCell = trackRow.querySelector(`[role='gridcell'][aria-colindex='${trackNameColumn}']`)
const artistCell = trackRow.querySelector(`[role='gridcell'][aria-colindex='${trackArtistColumn}']`)
const trackName = `${artistCell.innerText} - ${nameCell.innerText}`
myPlaylist[number] = trackName.replace(/\n.*$/, "")
}
});
exportPlaylist()
}, 1000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment