yading@7: #!/usr/bin/env python yading@7: """A python interface to 7digital's locker endpoint""" yading@7: import os yading@7: from xml.dom.minidom import parseString yading@7: yading@7: yading@7: class Locker(object): yading@7: def __init__(self, xml_response): yading@7: self.xml_response = parseString(xml_response) yading@7: yading@7: def get_contents(self): yading@7: results = [] yading@7: locker_items = self.xml_response.getElementsByTagName('lockerRelease') yading@7: yading@7: for item in locker_items: yading@7: results.append(LockerItem(item)) yading@7: yading@7: return results yading@7: yading@7: def get_artists(self): yading@7: results = [] yading@7: artist_nodes = self.xml_response.getElementsByTagName('artist') yading@7: yading@7: for artist in artist_nodes: yading@7: results.append(LockerArtist(artist)) yading@7: yading@7: return results yading@7: yading@7: def get_releases(self): yading@7: results = [] yading@7: release_nodes = self.xml_response.getElementsByTagName('release') yading@7: for release in release_nodes: yading@7: results.append(LockerRelease(release)) yading@7: yading@7: return results yading@7: yading@7: def get_tracks(self): yading@7: results = [] yading@7: track_nodes = self.xml_response.getElementsByTagName('lockerTrack') yading@7: for track in track_nodes: yading@7: results.append(LockerTrack(track)) yading@7: yading@7: return results yading@7: yading@7: class _LockerBase(object): yading@7: def extract(self, node, name, index = 0): yading@7: """Extracts a value from the xml string""" yading@7: try: yading@7: nodes = node.getElementsByTagName(name) yading@7: yading@7: if len(nodes): yading@7: if nodes[index].firstChild: yading@7: return nodes[index].firstChild.data.strip() yading@7: else: yading@7: return None yading@7: except: yading@7: return None yading@7: yading@7: class LockerItem(_LockerBase): yading@7: def __init__(self, xml): yading@7: self.release = LockerRelease(xml.getElementsByTagName('release')[0]) yading@7: self.tracks = self.__get_release_tracks(xml.getElementsByTagName('lockerTrack')) yading@7: yading@7: def __get_release_tracks(self, tracks): yading@7: result = [] yading@7: for track in tracks: yading@7: result.append(LockerTrack(track)) yading@7: return result yading@7: yading@7: class LockerTrack(_LockerBase): yading@7: def __init__(self, xml): yading@7: self.track = Track(xml.getElementsByTagName('track')[0]) yading@7: self.remaining_downloads = self.extract(xml, 'remainingDownloads') yading@7: self.purchaseDate = self.extract(xml, 'purchaseDate') yading@7: self.download_urls = self.__get_download_urls(xml.getElementsByTagName('downloadUrls')) yading@7: yading@7: def __get_download_urls(self, urls): yading@7: result = [] yading@7: for url in urls: yading@7: result.append(DownloadUrls(url)) yading@7: return result yading@7: yading@7: class DownloadUrls(_LockerBase): yading@7: def __init__(self, xml): yading@7: self.url = self.extract(xml, 'url') yading@7: self.format = Format(xml.getElementsByTagName('format')[0]) yading@7: yading@7: class Format(_LockerBase): yading@7: def __init__(self, xml): yading@7: self.id = xml.getAttribute('id') yading@7: self.file_format = self.extract(xml, 'fileFormat') yading@7: self.bit_rate = self.extract(xml, 'bitRate') yading@7: yading@7: class Track(_LockerBase): yading@7: def __init__(self, xml): yading@7: self.id = xml.getAttribute('id') yading@7: self.title = self.extract(xml, 'title') yading@7: self.version = self.extract(xml, 'version') yading@7: self.artist = LockerArtist(xml.getElementsByTagName('artist')[0]) yading@7: self.url = self.extract(xml, 'url') yading@7: yading@7: class LockerRelease(_LockerBase): yading@7: def __init__(self, xml): yading@7: self.id = xml.getAttribute('id') yading@7: self.title = self.extract(xml, 'title') yading@7: self.type = self.extract(xml, 'type') yading@7: self.artist = LockerArtist(xml.getElementsByTagName('artist')[0]) yading@7: self.url = self.extract(xml, 'url') yading@7: self.image = self.extract(xml, 'image') yading@7: self.release_date = self.extract(xml, 'releaseDate') yading@7: yading@7: class LockerArtist(_LockerBase): yading@7: def __init__(self, xml): yading@7: self.id = xml.getAttribute('id') yading@7: self.name = self.extract(xml, 'name') yading@7: self.url = self.extract(xml, 'url') yading@7: yading@7: