Last active
October 24, 2020 02:50
-
-
Save blha303/5571743 to your computer and use it in GitHub Desktop.
Export Spotify playlists to CSV script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2 | |
# Spotify URI list to CSV with track information | |
# by blha303 <[email protected]> | |
# Licensed under the zlib license: | |
# Copyright © 2013 Steven Smith | |
# This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. | |
# Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: | |
# 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. | |
# 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. | |
# 3. This notice may not be removed or altered from any source distribution. | |
# Tested under Python 2.7.3. Small changes may need to be made to be backwards-compatible. | |
# Usage: spCSVParse.py <list of spotify uri's separated by spaces> | |
# Select songs from a playlist in Spotify, right click when they're all selected, | |
# click Copy Spotify URI, then paste in after 'spCSVParse.py '. | |
# Alternatively, a file called playlists in the same folder | |
# This file can contain other lines (e.g. section headings) if desired. The script | |
# only parses lines starting with 'spotify:track' or 'spotify:local' | |
# If you're making the playlists file by pasting from Spotify, make sure to: | |
# 1. set the linebreaks to \n instead of \r\n (also known as UNIX mode, as opposed | |
# to Windows mode) | |
# 2. replace all spaces with \n. I did this by replacing " spotify" with "\nspotify" | |
# If you have questions about this file, ask below, or on irc.esper.net #blha303 | |
import json | |
from urllib import urlopen | |
import sys | |
import codecs | |
import time | |
def getJson(uri): | |
data = urlopen("http://ws.spotify.com/lookup/1/.json?uri=%s" % uri).read() | |
datad = json.loads(data) | |
if datad["info"]["type"] != "track": #validating | |
print "Invalid api reply for " + s | |
sys.exit() | |
return datad | |
def csvEscape (s): | |
if "," in s: | |
s.replace(',', '""') | |
s = '"' + s + '"' | |
return s | |
content = sys.argv[1:] | |
if content == []: | |
f = codecs.open("playlists", "r", "utf-8") | |
content = f.readlines() | |
f.close() | |
nf = codecs.open("output.csv", "w", "utf-8") | |
starttime = time.time() | |
print "Started at " + str(int(starttime)) | |
for s in content: | |
if s[:13] == "spotify:track": | |
datad = getJson(s) | |
name = csvEscape(datad["track"]["name"]) | |
artist = csvEscape(datad["track"]["artists"][0]["name"]) | |
album = csvEscape(datad["track"]["album"]["name"]) | |
output = artist + "," + name + "," + album | |
nf.write(output + "\n") | |
print s.replace("\n", "") + " : " + output | |
elif s[:13] == "spotify:local": | |
out = s.replace("spotify:local:", "").split(":") | |
artist = csvEscape(out[0].replace("+", " ")) | |
album = csvEscape(out[1].replace("+", " ")) | |
name = csvEscape(out[2].replace("+", " ")) | |
output = artist + "," + name + "," + album | |
nf.write(output + "\n") | |
print s.replace("\n", "") + " : " + output | |
else: | |
print s.replace("\n", "") | |
if "\n" in s: | |
nf.write(s) | |
else: | |
nf.write(s + "\n") | |
nf.close() | |
endtime = time.time() | |
print "Completed at " + str(int(endtime)) | |
duration = endtime - starttime | |
print "Process completed in " + str(int(duration)) + " seconds" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment