Export Spotify playlists using the Web API. Analyze them in the Jupyter notebook. https://exportify.net
  • Jupyter Notebook 98.6%
  • JavaScript 1.3%
Find a file
2026-07-28 10:39:55 +01:00
.github adding another old checkpoint/record of taste_analysis because spotify seems to be eviscerating the artist genres field, which was one of my favorites 2025-12-10 14:41:54 -08:00
.editorconfig added editorconfig 2024-12-29 00:42:35 -08:00
.gitignore adding archival taste analysis, because it's too interesting to see how things change over time 2024-08-15 15:49:59 -07:00
exportify.js ability to truly log out of spotify is now important due to new re-authentication/stale account token rules, so I've added it back 2026-07-28 10:39:55 +01:00
favicon.png updated favicon and spotify logo written from fontawesome to have new prettier green, the javascript to no longer truly log out the whole session of spotify, to instead just wipe app data and reload the page which is faster and less disruptive in case the user expects spotify to still be logged in in another browser tab, and updated readme to direct users to no longer use localhost for development now that Spotify's policy has changed. Also changed redirect uri whitelist in the dev dashboard so 127.0.0.1 and [::1] work as replacements, and in the process saw again I was allowing uris with and without a final slash. I think location.pathname is totally unnecessary for this single page app, so removed it in the javascript, so now I only ever redirect to location.origin 2025-12-10 13:35:03 -08:00
FileSaver.js updated to Eli Grey's latest FileSaver.js 2024-08-23 10:38:17 -07:00
index.html lots of people have let me know about the rate limiting message getting printed, but it seems to be succeeding for everyone, so I think it's time to just go silent about the 429 responses and let the app do its thing #108 2025-12-10 14:03:57 -08:00
LICENSE changed the way I get list of playlists. Instead of relying on a do-while and awaiting each response, I await only the first one, then make the rest in a volley. Means ~200-300ms between the first and second, and only 100ms between each of the rest. Won't make a difference for most users, but in case someone has 1000 playlists, their load time will go from maybe 5 seconds down to about 2 seconds. 2024-09-12 14:36:58 -07:00
liked_songs.jpeg added photo for liked songs 2024-08-20 13:50:28 -07:00
README.md updated favicon and spotify logo written from fontawesome to have new prettier green, the javascript to no longer truly log out the whole session of spotify, to instead just wipe app data and reload the page which is faster and less disruptive in case the user expects spotify to still be logged in in another browser tab, and updated readme to direct users to no longer use localhost for development now that Spotify's policy has changed. Also changed redirect uri whitelist in the dev dashboard so 127.0.0.1 and [::1] work as replacements, and in the process saw again I was allowing uris with and without a final slash. I think location.pathname is totally unnecessary for this single page app, so removed it in the javascript, so now I only ever redirect to location.origin 2025-12-10 13:35:03 -08:00
requirements.txt Update requirements.txt 2024-08-30 09:16:50 -07:00
screenshot.png updated screenshot to reflect changes to the UI 2024-09-05 09:34:53 -07:00
style.css got rid of a few extraneous things in the css 2024-10-15 11:55:32 -07:00
taste_analysis.ipynb Fix CJK display issues in notebook 2025-12-04 01:47:50 +01:00

Build Status Binder

Export your Spotify playlist metadata for analysis or just safekeeping: exportify.net

Export Format

Playlist data is exported in CSV format with the following fields:

  • Track URI
  • Track Name
  • Album Name
  • Artist Name(s)
  • Release Date
  • Duration (ms)
  • Popularity
  • Explicit
  • Added By
  • Added At
  • Genres
  • Record Label
  • Danceability
  • Energy
  • Key
  • Loudness
  • Mode (Major or Minor)
  • Speechiness
  • Acousticness
  • Instrumentalness
  • Liveness
  • Valence
  • Tempo
  • Time Signature

Analysis

Run the Jupyter Notebook or launch it in Binder to get a variety of plots about the music in a playlist including:

  • Most common artists
  • Most common genres
  • Release date distribution
  • Popularity distribution
  • Your songs' distributions of Acousticness, Valence, etc.
  • Time signatures and keys
  • All songs plotted in 2D to indicate relative similarities

Development

Most of the interesting logic that communicates with the Spotify Web API happens in Javascript in exportify.js. I've left many detailed code comments and tried to structure it as rationally as I can, so take a look. The webpage skin and a few action bindings are defined in index.html.

To experiment with changes, run a local web server. For example, using Python (in the Exportify repo dir):

python3 -m http.server

Then open http://[::1]:8000. The Javascript can be invoked by interacting with this locally-served webpage.

Data science stuff is written with Python in taste_analysis.ipynb, which you can run with python3 -m notebook, then navigating to http://localhost:8888.

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -m "message")
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request