Steven Smith revised this gist . Go to revision
1 file changed, 9 insertions, 2 deletions
spCSVParse.py
| @@ -1,7 +1,14 @@ | |||
| 1 | - | #!/usr/bin/env python | |
| 1 | + | #!/usr/bin/env python2 | |
| 2 | 2 | # Spotify URI list to CSV with track information | |
| 3 | 3 | # by blha303 <stevensmith.ome@gmail.com> | |
| 4 | - | # Licensed under the Mozilla Public License 2.0 https://www.mozilla.org/MPL/2.0/ | |
| 4 | + | # Licensed under the zlib license: | |
| 5 | + | ||
| 6 | + | # Copyright © 2013 Steven Smith | |
| 7 | + | # 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. | |
| 8 | + | # 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: | |
| 9 | + | # 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. | |
| 10 | + | # 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. | |
| 11 | + | # 3. This notice may not be removed or altered from any source distribution. | |
| 5 | 12 | ||
| 6 | 13 | # Tested under Python 2.7.3. Small changes may need to be made to be backwards-compatible. | |
| 7 | 14 | # Usage: spCSVParse.py <list of spotify uri's separated by spaces> | |
Steven Smith revised this gist . Go to revision
1 file changed, 75 insertions
spCSVParse.py(file created)
| @@ -0,0 +1,75 @@ | |||
| 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 | + | ||
| 19 | + | import json | |
| 20 | + | from urllib import urlopen | |
| 21 | + | import sys | |
| 22 | + | import codecs | |
| 23 | + | import time | |
| 24 | + | ||
| 25 | + | def 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 | + | ||
| 33 | + | def csvEscape (s): | |
| 34 | + | if "," in s: | |
| 35 | + | s.replace(',', '""') | |
| 36 | + | s = '"' + s + '"' | |
| 37 | + | return s | |
| 38 | + | ||
| 39 | + | content = sys.argv[1:] | |
| 40 | + | if content == []: | |
| 41 | + | f = codecs.open("playlists", "r", "utf-8") | |
| 42 | + | content = f.readlines() | |
| 43 | + | f.close() | |
| 44 | + | nf = codecs.open("output.csv", "w", "utf-8") | |
| 45 | + | starttime = time.time() | |
| 46 | + | print "Started at " + str(int(starttime)) | |
| 47 | + | for 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 | + | ||
| 71 | + | nf.close() | |
| 72 | + | endtime = time.time() | |
| 73 | + | print "Completed at " + str(int(endtime)) | |
| 74 | + | duration = endtime - starttime | |
| 75 | + | print "Process completed in " + str(int(duration)) + " seconds" | |