Amazon cover art downloader.

This commit is contained in:
Lukáš Lalinský
2007-02-25 00:13:30 +01:00
parent 500bc98861
commit 0779fc3cce
2 changed files with 67 additions and 20 deletions

View File

@@ -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

34
plugins/amazon.py Normal file
View File

@@ -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)