yading@7
|
1 #!/usr/bin/env python
|
yading@7
|
2 """A python interface to 7digital's locker endpoint"""
|
yading@7
|
3 import os
|
yading@7
|
4 from xml.dom.minidom import parseString
|
yading@7
|
5
|
yading@7
|
6
|
yading@7
|
7 class Locker(object):
|
yading@7
|
8 def __init__(self, xml_response):
|
yading@7
|
9 self.xml_response = parseString(xml_response)
|
yading@7
|
10
|
yading@7
|
11 def get_contents(self):
|
yading@7
|
12 results = []
|
yading@7
|
13 locker_items = self.xml_response.getElementsByTagName('lockerRelease')
|
yading@7
|
14
|
yading@7
|
15 for item in locker_items:
|
yading@7
|
16 results.append(LockerItem(item))
|
yading@7
|
17
|
yading@7
|
18 return results
|
yading@7
|
19
|
yading@7
|
20 def get_artists(self):
|
yading@7
|
21 results = []
|
yading@7
|
22 artist_nodes = self.xml_response.getElementsByTagName('artist')
|
yading@7
|
23
|
yading@7
|
24 for artist in artist_nodes:
|
yading@7
|
25 results.append(LockerArtist(artist))
|
yading@7
|
26
|
yading@7
|
27 return results
|
yading@7
|
28
|
yading@7
|
29 def get_releases(self):
|
yading@7
|
30 results = []
|
yading@7
|
31 release_nodes = self.xml_response.getElementsByTagName('release')
|
yading@7
|
32 for release in release_nodes:
|
yading@7
|
33 results.append(LockerRelease(release))
|
yading@7
|
34
|
yading@7
|
35 return results
|
yading@7
|
36
|
yading@7
|
37 def get_tracks(self):
|
yading@7
|
38 results = []
|
yading@7
|
39 track_nodes = self.xml_response.getElementsByTagName('lockerTrack')
|
yading@7
|
40 for track in track_nodes:
|
yading@7
|
41 results.append(LockerTrack(track))
|
yading@7
|
42
|
yading@7
|
43 return results
|
yading@7
|
44
|
yading@7
|
45 class _LockerBase(object):
|
yading@7
|
46 def extract(self, node, name, index = 0):
|
yading@7
|
47 """Extracts a value from the xml string"""
|
yading@7
|
48 try:
|
yading@7
|
49 nodes = node.getElementsByTagName(name)
|
yading@7
|
50
|
yading@7
|
51 if len(nodes):
|
yading@7
|
52 if nodes[index].firstChild:
|
yading@7
|
53 return nodes[index].firstChild.data.strip()
|
yading@7
|
54 else:
|
yading@7
|
55 return None
|
yading@7
|
56 except:
|
yading@7
|
57 return None
|
yading@7
|
58
|
yading@7
|
59 class LockerItem(_LockerBase):
|
yading@7
|
60 def __init__(self, xml):
|
yading@7
|
61 self.release = LockerRelease(xml.getElementsByTagName('release')[0])
|
yading@7
|
62 self.tracks = self.__get_release_tracks(xml.getElementsByTagName('lockerTrack'))
|
yading@7
|
63
|
yading@7
|
64 def __get_release_tracks(self, tracks):
|
yading@7
|
65 result = []
|
yading@7
|
66 for track in tracks:
|
yading@7
|
67 result.append(LockerTrack(track))
|
yading@7
|
68 return result
|
yading@7
|
69
|
yading@7
|
70 class LockerTrack(_LockerBase):
|
yading@7
|
71 def __init__(self, xml):
|
yading@7
|
72 self.track = Track(xml.getElementsByTagName('track')[0])
|
yading@7
|
73 self.remaining_downloads = self.extract(xml, 'remainingDownloads')
|
yading@7
|
74 self.purchaseDate = self.extract(xml, 'purchaseDate')
|
yading@7
|
75 self.download_urls = self.__get_download_urls(xml.getElementsByTagName('downloadUrls'))
|
yading@7
|
76
|
yading@7
|
77 def __get_download_urls(self, urls):
|
yading@7
|
78 result = []
|
yading@7
|
79 for url in urls:
|
yading@7
|
80 result.append(DownloadUrls(url))
|
yading@7
|
81 return result
|
yading@7
|
82
|
yading@7
|
83 class DownloadUrls(_LockerBase):
|
yading@7
|
84 def __init__(self, xml):
|
yading@7
|
85 self.url = self.extract(xml, 'url')
|
yading@7
|
86 self.format = Format(xml.getElementsByTagName('format')[0])
|
yading@7
|
87
|
yading@7
|
88 class Format(_LockerBase):
|
yading@7
|
89 def __init__(self, xml):
|
yading@7
|
90 self.id = xml.getAttribute('id')
|
yading@7
|
91 self.file_format = self.extract(xml, 'fileFormat')
|
yading@7
|
92 self.bit_rate = self.extract(xml, 'bitRate')
|
yading@7
|
93
|
yading@7
|
94 class Track(_LockerBase):
|
yading@7
|
95 def __init__(self, xml):
|
yading@7
|
96 self.id = xml.getAttribute('id')
|
yading@7
|
97 self.title = self.extract(xml, 'title')
|
yading@7
|
98 self.version = self.extract(xml, 'version')
|
yading@7
|
99 self.artist = LockerArtist(xml.getElementsByTagName('artist')[0])
|
yading@7
|
100 self.url = self.extract(xml, 'url')
|
yading@7
|
101
|
yading@7
|
102 class LockerRelease(_LockerBase):
|
yading@7
|
103 def __init__(self, xml):
|
yading@7
|
104 self.id = xml.getAttribute('id')
|
yading@7
|
105 self.title = self.extract(xml, 'title')
|
yading@7
|
106 self.type = self.extract(xml, 'type')
|
yading@7
|
107 self.artist = LockerArtist(xml.getElementsByTagName('artist')[0])
|
yading@7
|
108 self.url = self.extract(xml, 'url')
|
yading@7
|
109 self.image = self.extract(xml, 'image')
|
yading@7
|
110 self.release_date = self.extract(xml, 'releaseDate')
|
yading@7
|
111
|
yading@7
|
112 class LockerArtist(_LockerBase):
|
yading@7
|
113 def __init__(self, xml):
|
yading@7
|
114 self.id = xml.getAttribute('id')
|
yading@7
|
115 self.name = self.extract(xml, 'name')
|
yading@7
|
116 self.url = self.extract(xml, 'url')
|
yading@7
|
117
|
yading@7
|
118
|