Spotify Playlist folder

I feel proud of my musical taste, I invest my self some hours to look for music that I like, I must say that with Spotify I enjoy discovering music even more. Every Discovery Week matches the mood of my previous week, not always what I wish for but most of the time I'm very satisfied.

My girlfriend is often suggesting friends subscribe to my discovery weekly because she found it nice. So I thought why not just share with the rest of the worlds that ends here?

Every now and then, mainly when I remember, I backup my Discovery Weekly in a SongDiary. So I thought, every time I have a new playlist I will like to add it here in my blog.

But with as the excitement grows while studying the Spotify API, I unfortunately end my search at this issue, which means that Spotify would not make available a way to fetch folders.

Well, that was bad luck, but hey it's not my problem only, and seems someone has already built a solution. Although this practice delivers the same value, the script has to run where there is an Authenticate Spotify installed.

And since I was planning to run this in a cron, I might rethink how I want this to work in the first place.

So I decided to give a try this script let's see how it goes.

The idea

I want to extrapolate the playlist id and I want to create a simple org file with just the URL of the playlist and maybe also the image. I'm already thinking I can apply a nice effect to it.

Ahh.. this is getting juicy. When I create a new playlist maybe I should also publish it to my Social channels. But that is for later.

The plan

Let's start by downloading the script as recommended by the project.

curl -L https://git.io/folders > /usr/local/bin/spotifyfolders
chmod +x /usr/local/bin/spotifyfolders

Then let's try to use this thing

spotifyfolders https://open.spotify.com/user/1134797920/folder/bdb20f3c4fb707ff
{"uri": "spotify:user:1134797920:folder:bdb20f3c4fb707ff", "type": "folder", "children": [{"type": "playlist", "uri": "spotify:playlist:6fKJji10mSRO1hg4wLEOMN"}, {"type": "playlist", "uri": "spotify:playlist:2UUX93YEn6rE2ZrkzrsGVF"}, {"type": "playlist", "uri": "spotify:playlist:5AreCygyGXhMO1M6BkQeyE"}, {"type": "playlist", "uri": "spotify:playlist:3pRRYgIBprnqbxE4xT9ggE"}, {"type": "playlist", "uri": "spotify:playlist:0r7eWDbGdYX31aJSw4lga9"}, {"type": "playlist", "uri": "spotify:playlist:30tmtDDsivDY18ofv5a6PI"}, {"type": "playlist", "uri": "spotify:playlist:6QS8AuFX9F4MlLIN9A4ZWL"}, {"type": "playlist", "uri": "spotify:playlist:2WrKjL3wHHVNyxlw3tURXu"}, {"type": "playlist", "uri": "spotify:playlist:1ME16lmOpbPFOw5yCxR1es"}, {"type": "playlist", "uri": "spotify:playlist:7vTInzvufSRmtcynzC94Lj"}, {"type": "playlist", "uri": "spotify:playlist:3JjTlH6BuqGERXSPJ1J1fM"}, {"type": "playlist", "uri": "spotify:playlist:36XRObcnOGzL0kC9fNf795"}, {"type": "playlist", "uri": "spotify:playlist:6JQRzApaNHYTRpPwwiUPSW"}, {"type": "playlist", "uri": "spotify:playlist:12x4f5SQ5NWycFZ6q5jfKl"}, {"type": "playlist", "uri": "spotify:playlist:0IyEuRHMDfIOyksJ9vzdZA"}, {"type": "playlist", "uri": "spotify:playlist:4595BMbHRnNyoumoyKLmn4"}, {"type": "playlist", "uri": "spotify:playlist:3fT23BOUb9TjQam1aMdjO4"}, {"type": "playlist", "uri": "spotify:playlist:6lGHEwpyB7tvkBtoD74CgU"}, {"type": "playlist", "uri": "spotify:playlist:4r6kTdE9Eq1UtITi3etD0g"}, {"type": "playlist", "uri": "spotify:playlist:3zOlIHtrkLroSUxCDwsasb"}, {"type": "playlist", "uri": "spotify:playlist:1PqTvVYQR9l44Z9rq0fZaa"}, {"type": "playlist", "uri": "spotify:playlist:2nL0vbniGbDEoOmUSAikAU"}, {"type": "playlist", "uri": "spotify:playlist:1Tjw9O8wVn0g1iVe1hvlhx"}, {"type": "playlist", "uri": "spotify:playlist:3CQkOVxZQvhBf08r5ppity"}, {"type": "playlist", "uri": "spotify:playlist:4AS72fR60eMtYybedC51oo"}, {"type": "playlist", "uri": "spotify:playlist:0Tt7x6dbGZtxVzrhTM1eUK"}, {"type": "playlist", "uri": "spotify:playlist:4oYG8MitLWLkbc7fmScvtC"}, {"type": "playlist", "uri": "spotify:playlist:3qehgg4yTj5I8gZ4GBYrbV"}, {"type": "playlist", "uri": "spotify:playlist:3kymwfqpIkfc4C7jskjsNy"}, {"type": "playlist", "uri": "spotify:playlist:2KlIIVJF2vq2FPyaAPhzsK"}, {"type": "playlist", "uri": "spotify:playlist:0cQmRrb34C1Xf11u59kDVC"}, {"type": "playlist", "uri": "spotify:playlist:50WNdOrhIHKwwuENXNarN3"}, {"type": "playlist", "uri": "spotify:playlist:6vSRItZPm2cytWJESVedOt"}], "name": "SongDiary"}

Well seems that we got already far enough. I'm pleasedly surprised. Ok now let's grab each playlist and create a document for each of them.

So let's loop through those elements and fetch the list of each detail

Bearer BQBR_jrqU736i6eQKOh0YH1rwTpjYozsQ4f0G2kVcSo-as2nojg1n-3rpONutq3j2uxe3n3dImgiaahvlclwf8B0QmzzTb1RyU8Y3DDjnsNo_fiMzG7m-DgHJq-eTZ_lhYAjfzl_E4boqwFjdsIkw738lXnuOAc

So now that we have extracted all the information that we need let's template this in a convinient way:

const fs = require("fs");
data = JSON.parse(data);
data.forEach(({ name, id, tracks, images }) => {
  const getPlayer = () => `
<div class="playlist-player">
    <img src="${!!images.length ? images[0].url : ""}" />
    <iframe src="https://open.spotify.com/embed/playlist/${id}" frameBorder="0" allowtransparency="true" allow="encrypted-media"></iframe>
</div>`;

  const itemList = ({ name, album, artists, images }) => `
<li>
    <img class="album-preview" src="${
      images.filter(({ height }) => height < 100)[0].url
    }" />
    <div>
        <span class="track">${name}</span>
        <span class="artist">${artists}</span>
        <span class="album">${album}</span>
    </div>
</li>`;

  const getList = () => `
<ul>
    ${tracks.map(itemList).join("")}
</ul>`;

  fs.writeFileSync(
    `../playlist/${name.replace(/\s/g, "").toLowerCase()}-${id}.org`,
    `
#+TITLE: ${name}
* ${name}

#+begin_export html
<div class="playlist">
    ${getPlayer()}
    ${getList()}
</div>
#+end_export
`
  );
});

๐ŸŽ‰ After the execution of the above script, I basically have my folder with a post for each playlist!

So it's time to enjoy the result ๐ŸŽง!