1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 from xml.dom import minidom
20 import re
21 import locale
22 import urllib
23
24 LICENSE_KEY = "18C3VZN9HCECM5G3HQG2"
25 DEFAULT_LOCALE = "en_US"
26 ASSOCIATE = "webservices-20"
27
28
30
33 self.searching = False
34 self.cancel = False
35 self.loader = loader
36 self._supportedLocales = {
37 "en_US" : ("us", "xml.amazon.com"),
38 "en_GB" : ("uk", "xml-eu.amazon.com"),
39 "de" : ("de", "xml-eu.amazon.com"),
40 "ja" : ("jp", "xml.amazon.co.jp")
41 }
42
44 default = locale.getdefaultlocale ()
45 lc_id = DEFAULT_LOCALE
46 if default[0] is not None:
47 if self._supportedLocales.has_key (default[0]):
48 lc_id = default[0]
49
50 lc_host = self._supportedLocales[lc_id][1]
51 lc_name = self._supportedLocales[lc_id][0]
52 return ((lc_host, lc_name))
53
54 - def search (self, artist, album, on_search_completed_callback, *args):
55 self.searching = True
56 self.cancel = False
57 self.on_search_completed_callback = on_search_completed_callback
58 self.args = args
59 self.keywords = []
60
61 self.album = album
62 self.artist = artist
63
64 st_artist = artist or "Unknown"
65 st_album = album or "Unknown"
66
67
68
69
70
71 for char in ["\""]:
72 st_artist = st_artist.replace (char, '')
73 st_album = st_album.replace (char, '')
74
75
76 self.st_album = st_album
77 self.st_artist = st_artist
78
79
80 for exp in ["\([Dd]isc *[1-9]+\)", "\([Cc][Dd] *[1-9]+\)"]:
81 p = re.compile (exp)
82 st_album = p.sub ('', st_album)
83
84 st_album_no_vol = st_album
85 for exp in ["\(*[Vv]ol.*[1-9]+\)*"]:
86 p = re.compile (exp)
87 st_album_no_vol = p.sub ('', st_album_no_vol)
88
89 self.st_album_no_vol = st_album_no_vol
90
91
92 self.search_album = st_album
93 self.search_artist = st_artist
94 self.search_album_no_vol = st_album_no_vol
95
96
97
98 if st_album == "Unknown":
99 self.keywords.append ("%s Best of" % (st_artist))
100 self.keywords.append ("%s Greatest Hits" % (st_artist))
101 self.keywords.append ("%s Essential" % (st_artist))
102 self.keywords.append ("%s Collection" % (st_artist))
103 self.keywords.append ("%s" % (st_artist))
104 elif st_artist == "Unknown":
105 self.keywords.append ("%s" % (st_album))
106 if st_album_no_vol != st_artist:
107 self.keywords.append ("%s" % (st_album_no_vol))
108 self.keywords.append ("Various %s" % (st_album))
109 else:
110 if st_album != st_artist:
111 self.keywords.append ("%s %s" % (st_artist, st_album))
112 if st_album_no_vol != st_album:
113 self.keywords.append ("%s %s" % (st_artist, st_album_no_vol))
114 if (st_album != "Unknown"):
115 self.keywords.append ("Various %s" % (st_album))
116 self.keywords.append ("%s" % (st_artist))
117
118
119 self.search_next ();
120
122 try:
123 (lc_host, lc_name) = self.__get_locale ()
124
125 url = "http://" + lc_host + "/onca/xml3?f=xml"
126 url += "&t=%s" % ASSOCIATE
127 url += "&dev-t=%s" % LICENSE_KEY
128 url += "&type=%s" % 'lite'
129 url += "&locale=%s" % lc_name
130 url += "&mode=%s" % 'music'
131 url += "&%s=%s" % ('KeywordSearch', urllib.quote (keyword))
132
133 return url
134 except:return None
135
137 self.searching = True
138
139 if len (self.keywords)==0:
140 keyword = None
141 else:
142 keyword = self.keywords.pop (0)
143
144 if keyword is None:
145
146 self.on_search_completed (None)
147 ret = False
148 else:
149
150 url = self.__build_url (keyword.strip ())
151 if url != None:
152 self.loader.get_url (url, self.on_search_response)
153 ret = True
154 else:
155 ret = False
156
157 return ret
158
160 rc = Bag ()
161 if isinstance (element, minidom.Element) and (element.tagName == 'Details'):
162 rc.URL = element.attributes["url"].value
163 childElements = [e for e in element.childNodes if isinstance (e, minidom.Element)]
164 if childElements:
165 for child in childElements:
166 key = child.tagName
167 if hasattr (rc, key):
168 if type (getattr (rc, key)) <> type ([]):
169 setattr (rc, key, [getattr (rc, key)])
170 setattr (rc, key, getattr (rc, key) + [self.__unmarshal (child)])
171 elif isinstance(child, minidom.Element) and (child.tagName == 'Details'):
172 setattr (rc,key,[self.__unmarshal(child)])
173 else:
174 setattr (rc, key, self.__unmarshal(child))
175 else:
176 rc = "".join ([e.data for e in element.childNodes if isinstance (e, minidom.Text)])
177 if element.tagName == 'SalesRank':
178 rc = rc.replace ('.', '')
179 rc = rc.replace (',', '')
180 rc = int (rc)
181 return rc
182
184 if result_data is None:
185 self.search_next()
186 return
187
188 try:
189 xmldoc = minidom.parseString (result_data)
190 except:
191 self.search_next()
192 return
193
194 data = self.__unmarshal (xmldoc).ProductInfo
195
196 if hasattr(data, 'ErrorMsg'):
197
198 self.search_next ()
199 else:
200
201 self.on_search_results (data.Details)
202
205
207 self.on_search_completed_callback (self, self.artist, self.album, result, *self.args)
208 self.searching = False
209
211
212 s = s.lower ()
213
214 s = s.strip ()
215
216
217 s = s.replace (" - ", " ")
218 s = s.replace (": ", " ")
219 s = s.replace (" & ", " and ")
220
221 return s
222
224
225 best_match = None
226
227 try:
228 if self.search_album != "Unknown":
229 album_check = self.__tidy_up_string (self.search_album)
230 for item in search_results:
231
232 product_name = self.__tidy_up_string (item.ProductName)
233
234 if product_name == album_check:
235
236 best_match = item
237 break
238
239 elif (best_match is None) and (product_name.find (album_check) != -1):
240 best_match = item
241
242
243 if (self.search_album == "Unknown" and self.search_artist != "Unknown"):
244 artist_check = self.__tidy_up_string (self.search_artist)
245 if best_match is None:
246
247 hit = False
248 for item in search_results:
249 if type (item.Artists.Artist) <> type ([]):
250 artists = [item.Artists.Artist]
251 else:
252 artists = item.Artists.Artist
253
254 for artist in artists:
255 artist = self.__tidy_up_string (artist)
256 if artist.find (artist_check) != -1:
257 best_match = item
258 hit = True
259 break
260 if hit:
261 break
262
263 if best_match:
264 return [best_match.ImageUrlLarge, best_match.ImageUrlMedium]
265 else:
266 return []
267
268 except TypeError:
269 return []
270