Skip to content

Instantly share code, notes, and snippets.

@jmillikan
Created August 4, 2010 04:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jmillikan/507616 to your computer and use it in GitHub Desktop.
Save jmillikan/507616 to your computer and use it in GitHub Desktop.
#!/usr/local/bin/python
import sys
import httplib
import json
import xml
from xml.dom.minidom import Document
disco_url = '/api/band/1/discography?key=YOURKEYHERE&band_id=YOURBANDIDHERE'
album_url = '/api/album/1/info?key=YOURKEYHERE&album_id=%s'
track_url = '/api/track/1/info?key=YOURKEYHERE&track_id=%s'
h = httplib.HTTPConnection('api.bandcamp.com', 80)
h.request('GET',disco_url)
r = h.getresponse()
if r.status != 200:
print("Died with non-okay HTTP status: %d" % (r.status))
exit()
d = r.read()
doc = Document()
disco = doc.createElement("discography")
doc.appendChild(disco)
try:
band_data = json.loads(d)
except ValueError:
print("Failed to load! Raw data: ")
print(d.encode('ascii', 'xmlcharrefreplace'))
exit();
top_level = band_data[u'discography']
def funge_attr(el, js, name, new_name):
if(js.has_key(name)):
el.setAttribute(new_name, unicode(js[name]).encode('ascii', 'xmlcharrefreplace'))
def make_track(doc, track_json):
track_el = doc.createElement("track")
for attr in [u'title', 'number', 'duration', 'release_date', 'downloadable', 'url', 'streaming_url', 'about', 'credits', 'small_art_url', 'large_art_url', 'artist', 'track_id']:
funge_attr(track_el, track_json, attr, attr)
return track_el
def make_album(doc, album_json):
album_el = doc.createElement("album")
for attr in ['title', 'release_date', 'downloadable', 'url', 'about', 'credits', 'small_art_url', 'large_art_url', 'artist', 'album_id']:
funge_attr(album_el, album_json, attr, attr)
return album_el
for t in top_level:
if(t.has_key(u'album_id')):
h.request('GET',album_url % (t[u'album_id']))
r = h.getresponse()
album_json= r.read()
album = json.loads(album_json)
album_el = make_album(doc, album)
for track in album[u'tracks']:
album_el.appendChild(make_track(doc, track))
disco.appendChild(album_el)
if(t.has_key(u'track_id')):
disco.appendChild(make_track(doc, t))
f = open('disco.xml', 'w')
f.write(doc.toprettyxml(indent=" "))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment