From 0779fc3cce79b174df7d6a455a7e67c74597dce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Sun, 25 Feb 2007 00:13:30 +0100 Subject: [PATCH] Amazon cover art downloader. --- picard/webservice.py | 53 +++++++++++++++++++++++++++----------------- plugins/amazon.py | 34 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 plugins/amazon.py diff --git a/picard/webservice.py b/picard/webservice.py index 44d9fa7f9..1c9daaeaa 100644 --- a/picard/webservice.py +++ b/picard/webservice.py @@ -114,31 +114,41 @@ class XmlWebService(QtNetwork.QHttp): return os.path.join(self._cachedir, filename) def _start_request(self, request_id): - if request_id in self._request_handlers: + try: + handler, xml = self._request_handlers[request_id] + except KeyError: + return + + if xml: self._xml_handler.init() self._new_request = True def _finish_request(self, request_id, error): try: - handler = self._request_handlers[request_id] + handler, xml = self._request_handlers[request_id] except KeyError: - pass - else: - if handler is not None: - response = self.lastResponse() - if response.isValid() and response.statusCode() != 200: - error = True + return + del self._request_handlers[request_id] + + if handler is not None: + response = self.lastResponse() + if response.isValid() and response.statusCode() != 200: + error = True + if xml: handler(self._xml_handler.document, self, error) - del self._request_handlers[request_id] + else: + handler(str(self.readAll()), self, error) def _read_data(self, response): if response.statusCode() == 200: - self._xml_input.setData(self.readAll()) - if self._new_request: - self._xml_reader.parse(self._xml_input, True) - self._new_request = False - else: - self._xml_reader.parseContinue() + handler, xml = self._request_handlers[self.currentId()] + if xml: + self._xml_input.setData(self.readAll()) + if self._new_request: + self._xml_reader.parse(self._xml_input, True) + self._new_request = False + else: + self._xml_reader.parseContinue() elif response.statusCode() == 401 and self.currentId() in self._puid_data: data, handler = self._puid_data[self.currentId()] del self._puid_data[self.currentId()] @@ -157,7 +167,7 @@ class XmlWebService(QtNetwork.QHttp): header.setValue('Authorization', 'Digest ' + ', '.join(['%s="%s"' % a for a in digest.items()])) self.setHost(self.config.setting["server_host"], self.config.setting["server_port"]) requestid = self.request(header, data) - self._request_handlers[requestid] = handler + self._request_handlers[requestid] = (handler, True) def _prepare(self, method, host, port, path): self.log.debug("%s http://%s:%d%s", method, host, port, path) @@ -180,16 +190,16 @@ class XmlWebService(QtNetwork.QHttp): self.setHost(host, port) return header - def get(self, host, port, path, handler): + def get(self, host, port, path, handler, xml=True): header = self._prepare("GET", host, port, path) requestid = self.request(header) - self._request_handlers[requestid] = handler + self._request_handlers[requestid] = (handler, xml) def post(self, host, port, path, data, handler): header = self._prepare("POST", host, port, path) self.log.debug("POST-DATA %s", data) requestid = self.request(header, data) - self._request_handlers[requestid] = handler + self._request_handlers[requestid] = (handler, True) def _get_by_id(self, entitytype, entityid, handler, inc=[]): host = self.config.setting["server_host"] @@ -247,7 +257,10 @@ class XmlWebService(QtNetwork.QHttp): filters.append('%s=%s' % (str(name), value)) self.post(host, port, '/ofa/1/track/', '&'.join(filters), handler) + def download(self, host, port, path, handler): + self.get(host, port, path, handler, xml=False) + def cleanup(self): # FIXME remove old cache entries pass - \ No newline at end of file + diff --git a/plugins/amazon.py b/plugins/amazon.py new file mode 100644 index 000000000..c30d4f984 --- /dev/null +++ b/plugins/amazon.py @@ -0,0 +1,34 @@ +PLUGIN_NAME = 'Amazon Cover Art Downloader' +PLUGIN_AUTHOR = 'Lukas Lalinsky' +PLUGIN_DESCRIPTION = '''Downloads cover art from Amazon.''' + +from picard.metadata import register_album_metadata_processor +from picard.util import partial + +_AMAZON_IMAGE_HOST = 'images.amazon.com' +_AMAZON_IMAGE_PATH = '/images/P/%s.01.LZZZZZZZ.jpg' + +def _coverart_downloaded(album, metadata, data, http, error): + try: + if error: + album.log.error(unicode(http.errorString())) + else: + if len(data) > 1000: + image = ("image/jpeg", data) + metadata.add("~artwork", image) + for track in album._new_tracks: + track.metadata.add("~artwork", image) + finally: + album._requests -= 1 + album._finalize_loading(None) + +def amazon_coverart(album, metadata, release): + asin = metadata['asin'] + if asin: + album._requests += 1 + album.tagger.xmlws.download( + _AMAZON_IMAGE_HOST, 80, + _AMAZON_IMAGE_PATH % asin, + partial(_coverart_downloaded, album, metadata)) + +register_album_metadata_processor(amazon_coverart)