Last active 1603471822

Export Spotify playlists to CSV script

Revision 537725df1afa09af8d9b8213e7c339dea13f7b6c

spCSVParse.py Raw
1#!/usr/bin/env python
2# Spotify URI list to CSV with track information
3# by blha303 <stevensmith.ome@gmail.com>
4# Licensed under the Mozilla Public License 2.0 https://www.mozilla.org/MPL/2.0/
5
6# Tested under Python 2.7.3. Small changes may need to be made to be backwards-compatible.
7# Usage: spCSVParse.py <list of spotify uri's separated by spaces>
8# Select songs from a playlist in Spotify, right click when they're all selected,
9# click Copy Spotify URI, then paste in after 'spCSVParse.py '.
10# Alternatively, a file called playlists in the same folder
11# This file can contain other lines (e.g. section headings) if desired. The script
12# only parses lines starting with 'spotify:track' or 'spotify:local'
13# If you're making the playlists file by pasting from Spotify, make sure to:
14# 1. set the linebreaks to \n instead of \r\n (also known as UNIX mode, as opposed
15# to Windows mode)
16# 2. replace all spaces with \n. I did this by replacing " spotify" with "\nspotify"
17# If you have questions about this file, ask below, or on irc.esper.net #blha303
18
19import json
20from urllib import urlopen
21import sys
22import codecs
23import time
24
25def getJson(uri):
26 data = urlopen("http://ws.spotify.com/lookup/1/.json?uri=%s" % uri).read()
27 datad = json.loads(data)
28 if datad["info"]["type"] != "track": #validating
29 print "Invalid api reply for " + s
30 sys.exit()
31 return datad
32
33def csvEscape (s):
34 if "," in s:
35 s.replace(',', '""')
36 s = '"' + s + '"'
37 return s
38
39content = sys.argv[1:]
40if content == []:
41 f = codecs.open("playlists", "r", "utf-8")
42 content = f.readlines()
43 f.close()
44nf = codecs.open("output.csv", "w", "utf-8")
45starttime = time.time()
46print "Started at " + str(int(starttime))
47for s in content:
48 if s[:13] == "spotify:track":
49 datad = getJson(s)
50 name = csvEscape(datad["track"]["name"])
51 artist = csvEscape(datad["track"]["artists"][0]["name"])
52 album = csvEscape(datad["track"]["album"]["name"])
53 output = artist + "," + name + "," + album
54 nf.write(output + "\n")
55 print s.replace("\n", "") + " : " + output
56 elif s[:13] == "spotify:local":
57 out = s.replace("spotify:local:", "").split(":")
58 artist = csvEscape(out[0].replace("+", " "))
59 album = csvEscape(out[1].replace("+", " "))
60 name = csvEscape(out[2].replace("+", " "))
61 output = artist + "," + name + "," + album
62 nf.write(output + "\n")
63 print s.replace("\n", "") + " : " + output
64 else:
65 print s.replace("\n", "")
66 if "\n" in s:
67 nf.write(s)
68 else:
69 nf.write(s + "\n")
70
71nf.close()
72endtime = time.time()
73print "Completed at " + str(int(endtime))
74duration = endtime - starttime
75print "Process completed in " + str(int(duration)) + " seconds"