mirror of
https://github.com/fergalmoran/picard.git
synced 2026-02-21 15:14:13 +00:00
123 lines
4.7 KiB
Python
123 lines
4.7 KiB
Python
"""
|
|
A small plugin to download cover art for any releseas that have a
|
|
CoverArtLink relation.
|
|
|
|
|
|
Changelog:
|
|
|
|
[2008-03-10] Added CDBaby support (phw)
|
|
|
|
[2007-09-06] Added Jamendo support (phw)
|
|
|
|
[2007-04-24] Moved parsing code into here
|
|
Swapped to QUrl
|
|
Moved to a list of urls
|
|
|
|
[2007-04-23] Moved it to use the bzr picard
|
|
Took the hack out
|
|
Added Amazon ASIN support
|
|
|
|
[2007-04-23] Initial plugin, uses a hack that relies on Python being
|
|
installed and musicbrainz2 for the query.
|
|
|
|
"""
|
|
|
|
PLUGIN_NAME = 'Cover Art Downloader'
|
|
PLUGIN_AUTHOR = 'Oliver Charles, Philipp Wolfer'
|
|
PLUGIN_DESCRIPTION = '''Downloads cover artwork for releases that have a
|
|
CoverArtLink.'''
|
|
PLUGIN_VERSION = "0.3"
|
|
PLUGIN_API_VERSIONS = ["0.9.0"]
|
|
|
|
from picard.metadata import register_album_metadata_processor
|
|
from picard.util import partial
|
|
from PyQt4.QtCore import QUrl
|
|
import re
|
|
|
|
|
|
_AMAZON_IMAGE_HOST = 'images.amazon.com'
|
|
_AMAZON_IMAGE_PATH = '/images/P/%s.01.LZZZZZZZ.jpg'
|
|
_AMAZON_IMAGE_PATH_SMALL = '/images/P/%s.01.MZZZZZZZ.jpg'
|
|
_AMAZON_IMAGE_PATH2 = '/images/P/%s.02.LZZZZZZZ.jpg'
|
|
_AMAZON_IMAGE_PATH2_SMALL = '/images/P/%s.02.MZZZZZZZ.jpg'
|
|
|
|
_JAMENDO_ALBUM_PAGE_REGEX = re.compile("^http:\/\/(?:www.)?jamendo.com\/(?:[a-z]+\/)?album\/([0-9]+)")
|
|
_JAMENDO_IMAGE_PATH = "http://www.jamendo.com/get/album/id/album/artworkurl/redirect/%s/?artwork_size=0"
|
|
|
|
_CDBABY_ALBUM_PAGE_REGEX = re.compile("^http://cdbaby.com/cd/([a-z0-9]+)")
|
|
_CDBABY_IMAGE_PATH = "http://cdbaby.name/%s/%s/%s.jpg"
|
|
|
|
def _coverart_downloaded(album, metadata, release, try_list, data, http, error):
|
|
try:
|
|
if error or len(data) < 1000:
|
|
if error:
|
|
album.log.error(str(http.errorString()))
|
|
coverart(album, metadata, release, try_list)
|
|
else:
|
|
metadata.add_image("image/jpeg", data)
|
|
for track in album._new_tracks:
|
|
track.metadata.add_image("image/jpeg", data)
|
|
finally:
|
|
album._requests -= 1
|
|
album._finalize_loading(None)
|
|
|
|
|
|
def coverart(album, metadata, release, try_list=None):
|
|
""" Gets the CDBaby URL from the metadata, and the attempts to
|
|
download the album art. """
|
|
|
|
# try_list will be None for the first call
|
|
if try_list is None:
|
|
try_list = []
|
|
|
|
try:
|
|
for relation_list in release.relation_list:
|
|
if relation_list.target_type == 'Url':
|
|
for relation in relation_list.relation:
|
|
if relation.type == 'CoverArtLink':
|
|
jamendoMatch = re.match(_JAMENDO_ALBUM_PAGE_REGEX, relation.target)
|
|
cdbabyMatch = re.match(_CDBABY_ALBUM_PAGE_REGEX, relation.target)
|
|
if jamendoMatch:
|
|
parsedUrl = QUrl(_JAMENDO_IMAGE_PATH % jamendoMatch.group(1))
|
|
elif cdbabyMatch:
|
|
cdbabyName = cdbabyMatch.group(1)
|
|
parsedUrl = QUrl(_CDBABY_IMAGE_PATH % (cdbabyName[0], cdbabyName[1], cdbabyName))
|
|
else:
|
|
parsedUrl = QUrl(relation.target)
|
|
|
|
path = parsedUrl.path()
|
|
if parsedUrl.hasQuery():
|
|
path += '?'+'&'.join(["%s=%s" % (k,v) for k,v in parsedUrl.queryItems()])
|
|
try_list.append({
|
|
'host': str(parsedUrl.host()),
|
|
'port': parsedUrl.port(80),
|
|
'path': str(path)
|
|
})
|
|
except AttributeError:
|
|
pass
|
|
|
|
if metadata['asin']:
|
|
try_list.append({'host': _AMAZON_IMAGE_HOST, 'port': 80,
|
|
'path': _AMAZON_IMAGE_PATH % metadata['asin']
|
|
})
|
|
try_list.append({'host': _AMAZON_IMAGE_HOST, 'port': 80,
|
|
'path': _AMAZON_IMAGE_PATH_SMALL % metadata['asin']
|
|
})
|
|
try_list.append({'host': _AMAZON_IMAGE_HOST, 'port': 80,
|
|
'path': _AMAZON_IMAGE_PATH2 % metadata['asin']
|
|
})
|
|
try_list.append({'host': _AMAZON_IMAGE_HOST, 'port': 80,
|
|
'path': _AMAZON_IMAGE_PATH2_SMALL % metadata['asin']
|
|
})
|
|
|
|
if len(try_list) > 0:
|
|
# We still have some items to try!
|
|
album._requests += 1
|
|
album.tagger.xmlws.download(
|
|
try_list[0]['host'], try_list[0]['port'], try_list[0]['path'],
|
|
partial(_coverart_downloaded, album, metadata, release, try_list[1:]),
|
|
position=1)
|
|
|
|
|
|
register_album_metadata_processor(coverart)
|