From 6505d49207da074e7eeda07cd6aa458b36f43bb0 Mon Sep 17 00:00:00 2001 From: Wieland Hoffmann Date: Sat, 6 Oct 2012 12:26:39 +0200 Subject: [PATCH] Use CAA data when embedding images into files This includes both the image type (for vorbis, id3 and asf files) as well as the comments (as description for vorbis, id3 and asf files). Additionally, converts the `images` attribute of picard.metadata.Metadata to a list of dicts instead of tuples for easier access. --- picard/coverart.py | 19 +- picard/file.py | 5 +- picard/formats/apev2.py | 13 +- picard/formats/asf.py | 18 +- picard/formats/id3.py | 42 +- picard/formats/mp4.py | 9 +- picard/formats/vorbis.py | 27 +- picard/metadata.py | 19 +- picard/ui/coverartbox.py | 10 +- picard/ui/infodialog.py | 3 +- picard/ui/options/cover.py | 3 + picard/ui/ui_infodialog.py | 6 +- picard/ui/ui_options_cover.py | 11 +- po/picard.pot | 906 +++++++++++++++++----------------- ui/options_cover.ui | 30 +- 15 files changed, 619 insertions(+), 502 deletions(-) diff --git a/picard/coverart.py b/picard/coverart.py index 20dbed870..51476b5b8 100644 --- a/picard/coverart.py +++ b/picard/coverart.py @@ -89,8 +89,10 @@ AMAZON_SERVER = { AMAZON_IMAGE_PATH = '/images/P/%s.%s.%sZZZZZZZ.jpg' AMAZON_ASIN_URL_REGEX = re.compile(r'^http://(?:www.)?(.*?)(?:\:[0-9]+)?/.*/([0-9B][0-9A-Z]{9})(?:[^0-9A-Z]|$)') -def _coverart_downloaded(album, metadata, release, try_list, imagetype, data, http, error): +def _coverart_downloaded(album, metadata, release, try_list, imagedata, data, http, error): album._requests -= 1 + imagetype = imagedata["type"] + if error or len(data) < 1000: if error: album.log.error(str(http.errorString())) @@ -101,9 +103,11 @@ def _coverart_downloaded(album, metadata, release, try_list, imagetype, data, ht filename = None if imagetype != 'front' and QObject.config.setting["caa_image_type_as_filename"]: filename = imagetype - metadata.add_image(mime, data, filename) + metadata.add_image(mime, data, filename, imagedata["description"], + imagetype) for track in album._new_tracks: - track.metadata.add_image(mime, data, filename) + track.metadata.add_image(mime, data, filename, + imagedata["description"], imagetype) # If the image already was a front image, there might still be some # other front images in the try_list - remove them. @@ -157,7 +161,7 @@ def _caa_append_image_to_trylist(try_list, imagedata): url = QUrl(imagedata["image"]) else: url = QUrl(imagedata["thumbnails"][thumbsize]) - _try_list_append_image_url(try_list, url, imagedata["types"][0]) + _try_list_append_image_url(try_list, url, imagedata["types"][0], imagedata["comment"]) def coverart(album, metadata, release, try_list=None): """ Gets all cover art URLs from the metadata and then attempts to @@ -210,7 +214,7 @@ def _walk_try_list(album, metadata, release, try_list): album.tagger.xmlws.download( url['host'], url['port'], url['path'], partial(_coverart_downloaded, album, metadata, release, - try_list, url['type']), + try_list, url), priority=True, important=True) else: album._finalize_loading(None) @@ -252,7 +256,7 @@ def _process_asin_relation(try_list, relation): }) -def _try_list_append_image_url(try_list, parsedUrl, imagetype="front"): +def _try_list_append_image_url(try_list, parsedUrl, imagetype="front", description=""): QObject.log.debug("Adding %s image %s", imagetype, parsedUrl) path = str(parsedUrl.encodedPath()) if parsedUrl.hasQuery(): @@ -261,6 +265,7 @@ def _try_list_append_image_url(try_list, parsedUrl, imagetype="front"): 'host': str(parsedUrl.host()), 'port': parsedUrl.port(80), 'path': str(path), - 'type': imagetype.lower() + 'type': imagetype.lower(), + 'description': description, }) diff --git a/picard/file.py b/picard/file.py index fc6d36c27..dfd6d4b79 100644 --- a/picard/file.py +++ b/picard/file.py @@ -329,7 +329,10 @@ class File(QtCore.QObject, Item): settings["cover_image_filename"], dirname, metadata, settings) overwrite = settings["save_images_overwrite"] counters = defaultdict(lambda: 0) - for mime, data, filename in metadata.images: + for image in metadata.images: + filename = image["filename"] + data = image["data"] + mime = image["mime"] if filename is None: filename = default_filename else: diff --git a/picard/formats/apev2.py b/picard/formats/apev2.py index 60793c5ab..1d930a43f 100644 --- a/picard/formats/apev2.py +++ b/picard/formats/apev2.py @@ -141,12 +141,13 @@ class APEv2File(File): for name, values in temp.items(): tags[str(name)] = values if settings['save_images_to_tags']: - for mime, data, _fname in metadata.images: - cover_filename = 'Cover Art (Front)' - cover_filename += mimetype.get_extension(mime, '.jpg') - tags['Cover Art (Front)'] = cover_filename + '\0' + data - break # can't save more than one item with the same name - # (mp3tags does this, but it's against the specs) + for image in metadata.images: + if "front" == image["type"]: + cover_filename = 'Cover Art (Front)' + cover_filename += mimetype.get_extension(image["mime"], '.jpg') + tags['Cover Art (Front)'] = cover_filename + '\0' + image["data"] + break # can't save more than one item with the same name + # (mp3tags does this, but it's against the specs) tags.save(encode_filename(filename)) class MusepackFile(APEv2File): diff --git a/picard/formats/asf.py b/picard/formats/asf.py index 1008074e6..58c0e4f2f 100644 --- a/picard/formats/asf.py +++ b/picard/formats/asf.py @@ -18,6 +18,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.file import File +from picard.formats.id3 import ID3_IMAGE_TYPE_MAP, ID3_REVERSE_IMAGE_TYPE_MAP from picard.util import encode_filename from picard.metadata import Metadata from mutagen.asf import ASF, ASFByteArrayAttribute @@ -47,7 +48,7 @@ def unpack_image(data): pos += 2 pos += 2 image_data = data[pos:pos+size] - return (mime.decode("utf-16-le"), image_data, type) + return (mime.decode("utf-16-le"), image_data, type, description.decode("utf-16-le")) def pack_image(mime, data, type=3, description=""): """ @@ -128,9 +129,10 @@ class ASFFile(File): for name, values in file.tags.items(): if name == 'WM/Picture': for image in values: - (mime, data, type) = unpack_image(image.value) - if type == 3: # Only cover images - metadata.add_image(mime, data) + (mime, data, type, description) = unpack_image(image.value) + imagetype = ID3_REVERSE_IMAGE_TYPE_MAP.get(type, "other") + metadata.add_image(mime, data, description=description, + type_=imagetype) continue elif name not in self.__RTRANS: continue @@ -152,8 +154,12 @@ class ASFFile(File): file.tags.clear() if settings['save_images_to_tags']: cover = [] - for mime, data, _fname in metadata.images: - tag_data = pack_image(mime, data, 3) + for image in metadata.images: + if self.config.setting["save_only_front_images_to_tags"] and image["type"] != "front": + continue + imagetype = ID3_IMAGE_TYPE_MAP.get(image["type"], 0) + tag_data = pack_image(image["mime"], image["data"], imagetype, + image["description"]) cover.append(ASFByteArrayAttribute(tag_data)) if cover: file.tags['WM/Picture'] = cover diff --git a/picard/formats/id3.py b/picard/formats/id3.py index 0d2ab45df..c2933bfe5 100644 --- a/picard/formats/id3.py +++ b/picard/formats/id3.py @@ -20,6 +20,7 @@ import mutagen.apev2 import mutagen.mp3 import mutagen.trueaudio +from collections import defaultdict from mutagen import id3 from picard.metadata import Metadata from picard.file import File @@ -34,8 +35,7 @@ from urlparse import urlparse def patched_EncodedTextSpec_write(self, frame, value): try: enc, term = self._encodings[frame.encoding] - except AttributeError: - enc, term = self.encodings[frame.encoding] + except AttributeError: enc, term = self.encodings[frame.encoding] return value.encode(enc, 'ignore') + term id3.EncodedTextSpec.write = patched_EncodedTextSpec_write @@ -61,6 +61,20 @@ id3.MultiSpec.write = patched_MultiSpec_write id3.TCMP = compatid3.TCMP id3.TSO2 = compatid3.TSO2 +ID3_IMAGE_TYPE_MAP = { + "other": 0, + "obi": 0, + "tray": 0, + "spine": 0, + "sticker": 0, + "front": 3, + "back": 4, + "booklet": 5, + "medium": 6, + "track": 6, + } + +ID3_REVERSE_IMAGE_TYPE_MAP = dict([(v,k) for k, v in ID3_IMAGE_TYPE_MAP.iteritems()]) class ID3File(File): """Generic ID3-based file.""" @@ -200,7 +214,9 @@ class ID3File(File): else: metadata['discnumber'] = value[0] elif frameid == 'APIC': - metadata.add_image(frame.mime, frame.data) + imagetype = ID3_REVERSE_IMAGE_TYPE_MAP.get(frame.type, "other") + metadata.add_image(frame.mime, frame.data, + description=frame.desc, type_=imagetype) elif frameid == 'POPM': # Rating in ID3 ranges from 0 to 255, normalize this to the range 0 to 5 if frame.email == self.config.setting['rating_user_email']: @@ -247,8 +263,24 @@ class ID3File(File): tags.add(id3.TPOS(encoding=0, text=text)) if settings['save_images_to_tags']: - for mime, data, _fname in metadata.images: - tags.add(id3.APIC(encoding=0, mime=mime, type=3, desc='', data=data)) + # This is necessary because mutagens HashKey for APIC frames only + # includes the FrameID (APIC) and description - it's basically + # impossible to save two images, even of different types, without + # any description. + counters = defaultdict(lambda: 0) + for image in metadata.images: + desc = image["description"] + if self.config.setting["save_only_front_images_to_tags"] and image["type"] != "front": + continue + type_ = ID3_IMAGE_TYPE_MAP.get(image["type"], 0) + if counters[desc] > 0: + if desc: + image["description"] = "%s (%i)" % (desc, counters[desc]) + else: + image["description"] = "(%i)" % counters[desc] + counters[desc] += 1 + tags.add(id3.APIC(encoding=0, mime=image["mime"], type=type_, + desc=image["description"], data=image["data"])) tmcl = mutagen.id3.TMCL(encoding=encoding, people=[]) tipl = mutagen.id3.TIPL(encoding=encoding, people=[]) diff --git a/picard/formats/mp4.py b/picard/formats/mp4.py index 4f7487b85..24039cad2 100644 --- a/picard/formats/mp4.py +++ b/picard/formats/mp4.py @@ -187,11 +187,14 @@ class MP4File(File): if settings['save_images_to_tags']: covr = [] - for mime, data, _fname in metadata.images: + for image in metadata.images: + if self.config.setting["save_only_front_images_to_tags"] and image["type"] != "front": + continue + mime = image["mime"] if mime == "image/jpeg": - covr.append(MP4Cover(data, MP4Cover.FORMAT_JPEG)) + covr.append(MP4Cover(image["data"], MP4Cover.FORMAT_JPEG)) elif mime == "image/png": - covr.append(MP4Cover(data, MP4Cover.FORMAT_PNG)) + covr.append(MP4Cover(image["data"], MP4Cover.FORMAT_PNG)) if covr: file.tags["covr"] = covr diff --git a/picard/formats/vorbis.py b/picard/formats/vorbis.py index 88746d71d..8b2fbd936 100644 --- a/picard/formats/vorbis.py +++ b/picard/formats/vorbis.py @@ -25,6 +25,7 @@ import mutagen.oggspeex import mutagen.oggtheora import mutagen.oggvorbis from picard.file import File +from picard.formats.id3 import ID3_IMAGE_TYPE_MAP, ID3_REVERSE_IMAGE_TYPE_MAP from picard.metadata import Metadata from picard.util import encode_filename, sanitize_date @@ -78,12 +79,17 @@ class VCommentFile(File): name = "totaldiscs" elif name == "metadata_block_picture": image = mutagen.flac.Picture(base64.standard_b64decode(value)) - metadata.add_image(image.mime, image.data) + imagetype = ID3_REVERSE_IMAGE_TYPE_MAP.get(image.type, "other") + metadata.add_image(image.mime, image.data, + description=image.desc, + type_=imagetype) continue metadata.add(name, value) if self._File == mutagen.flac.FLAC: for image in file.pictures: - metadata.add_image(image.mime, image.data) + imagetype = ID3_REVERSE_IMAGE_TYPE_MAP.get(image.type, "other") + metadata.add_image(image.mime, image.data, + description=image.desc, type_=imagetype) # Read the unofficial COVERART tags, for backward compatibillity only if not "metadata_block_picture" in file.tags: try: @@ -139,16 +145,19 @@ class VCommentFile(File): tags.setdefault(u"DISCTOTAL", []).append(metadata["totaldiscs"]) if settings['save_images_to_tags']: - for mime, data, filename in metadata.images: - image = mutagen.flac.Picture() - image.type = 3 # Cover image - image.data = data - image.mime = mime + for image in metadata.images: + if self.config.setting["save_only_front_images_to_tags"] and image["type"] != "front": + continue + picture = mutagen.flac.Picture() + picture.data = image["data"] + picture.mime = image["mime"] + picture.desc = image["description"] + picture.type = ID3_IMAGE_TYPE_MAP.get(image["type"], 0) if self._File == mutagen.flac.FLAC: - file.add_picture(image) + file.add_picture(picture) else: tags.setdefault(u"METADATA_BLOCK_PICTURE", []).append( - base64.standard_b64encode(image.write())) + base64.standard_b64encode(picture.write())) file.tags.update(tags) kwargs = {} if self._File == mutagen.flac.FLAC and settings["remove_id3_from_flac"]: diff --git a/picard/metadata.py b/picard/metadata.py index 3864109ba..8a05b7a19 100644 --- a/picard/metadata.py +++ b/picard/metadata.py @@ -42,8 +42,23 @@ class Metadata(dict): self.images = [] self.length = 0 - def add_image(self, mime, data, filename=None): - self.images.append((mime, data, filename)) + def add_image(self, mime, data, filename=None, description="", type_="front"): + """Adds the image ``data`` to this Metadata object. + + Arguments: + mime -- The mimetype of the image + data -- The image data + filename -- The image filename, without an extension + description -- A description for the image + type_ -- The image type - this should be a lower-cased name from + http://musicbrainz.org/doc/Cover_Art/Types + """ + imagedict = {'mime': mime, + 'data': data, + 'filename': filename, + 'description': description, + 'type': type_} + self.images.append(imagedict) def remove_image(self, index): self.images.pop(index) diff --git a/picard/ui/coverartbox.py b/picard/ui/coverartbox.py index b99c3ca2e..8f21a7f10 100644 --- a/picard/ui/coverartbox.py +++ b/picard/ui/coverartbox.py @@ -99,7 +99,7 @@ class CoverArtBox(QtGui.QGroupBox): if self.data: if pixmap is None: pixmap = QtGui.QPixmap() - pixmap.loadFromData(self.data[1]) + pixmap.loadFromData(self.data["data"]) if not pixmap.isNull(): cover = QtGui.QPixmap(self.shadow) pixmap = pixmap.scaled(121, 121, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation) @@ -112,7 +112,13 @@ class CoverArtBox(QtGui.QGroupBox): self.item = item data = None if metadata and metadata.images: - data = metadata.images[0] + for image in metadata.images: + if image["type"] == "front": + data = image + break + else: + # There's no front image, choose the first one available + data = metadata.images[0] self.__set_data(data) release = None if metadata: diff --git a/picard/ui/infodialog.py b/picard/ui/infodialog.py index ca8d6125f..7afbe8327 100644 --- a/picard/ui/infodialog.py +++ b/picard/ui/infodialog.py @@ -69,7 +69,8 @@ class InfoDialog(QtGui.QDialog): text = '
'.join(map(lambda i: '%s
%s' % i, info)) self.ui.info.setText(text) - for mime, data, _fname in file.metadata.images: + for image in file.metadata.images: + data = image["data"] item = QtGui.QListWidgetItem() pixmap = QtGui.QPixmap() pixmap.loadFromData(data) diff --git a/picard/ui/options/cover.py b/picard/ui/options/cover.py index 5f27d9f53..1f661b700 100644 --- a/picard/ui/options/cover.py +++ b/picard/ui/options/cover.py @@ -33,6 +33,7 @@ class CoverOptionsPage(OptionsPage): options = [ BoolOption("setting", "save_images_to_tags", True), + BoolOption("setting", "save_only_front_images_to_tags", False), BoolOption("setting", "save_images_to_files", False), TextOption("setting", "cover_image_filename", "cover"), BoolOption("setting", "save_images_overwrite", False), @@ -55,6 +56,7 @@ class CoverOptionsPage(OptionsPage): def load(self): self.ui.save_images_to_tags.setChecked(self.config.setting["save_images_to_tags"]) + self.ui.cb_embed_front_only.setChecked(self.config.setting["save_only_front_images_to_tags"]) self.ui.save_images_to_files.setChecked(self.config.setting["save_images_to_files"]) self.ui.cover_image_filename.setText(self.config.setting["cover_image_filename"]) self.ui.save_images_overwrite.setChecked(self.config.setting["save_images_overwrite"]) @@ -75,6 +77,7 @@ class CoverOptionsPage(OptionsPage): def save(self): self.config.setting["save_images_to_tags"] = self.ui.save_images_to_tags.isChecked() + self.config.setting["save_only_front_images_to_tags"] = self.ui.cb_embed_front_only.isChecked() self.config.setting["save_images_to_files"] = self.ui.save_images_to_files.isChecked() self.config.setting["cover_image_filename"] = unicode(self.ui.cover_image_filename.text()) self.config.setting["ca_provider_use_amazon"] =\ diff --git a/picard/ui/ui_infodialog.py b/picard/ui/ui_infodialog.py index decc7c321..c4118a611 100644 --- a/picard/ui/ui_infodialog.py +++ b/picard/ui/ui_infodialog.py @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/infodialog.ui' # -# Created: Tue May 29 19:44:14 2012 -# by: PyQt4 UI code generator 4.8.3 +# Created: Sat Oct 6 19:08:31 2012 +# by: PyQt4 UI code generator 4.9.4 # # WARNING! All changes made in this file will be lost! @@ -43,7 +43,7 @@ class Ui_InfoDialog(object): self.artwork_list.setIconSize(QtCore.QSize(170, 170)) self.artwork_list.setMovement(QtGui.QListView.Static) self.artwork_list.setFlow(QtGui.QListView.LeftToRight) - self.artwork_list.setProperty(_fromUtf8("isWrapping"), False) + self.artwork_list.setProperty("isWrapping", False) self.artwork_list.setResizeMode(QtGui.QListView.Fixed) self.artwork_list.setSpacing(10) self.artwork_list.setViewMode(QtGui.QListView.IconMode) diff --git a/picard/ui/ui_options_cover.py b/picard/ui/ui_options_cover.py index b961e36ab..8c44909f3 100644 --- a/picard/ui/ui_options_cover.py +++ b/picard/ui/ui_options_cover.py @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/options_cover.ui' # -# Created: Sun Sep 30 11:21:59 2012 -# by: PyQt4 UI code generator 4.8.3 +# Created: Sat Oct 6 19:08:31 2012 +# by: PyQt4 UI code generator 4.9.4 # # WARNING! All changes made in this file will be lost! @@ -17,7 +17,7 @@ except AttributeError: class Ui_CoverOptionsPage(object): def setupUi(self, CoverOptionsPage): CoverOptionsPage.setObjectName(_fromUtf8("CoverOptionsPage")) - CoverOptionsPage.resize(524, 502) + CoverOptionsPage.resize(525, 526) self.verticalLayout = QtGui.QVBoxLayout(CoverOptionsPage) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.rename_files = QtGui.QGroupBox(CoverOptionsPage) @@ -29,6 +29,9 @@ class Ui_CoverOptionsPage(object): self.save_images_to_tags = QtGui.QCheckBox(self.rename_files) self.save_images_to_tags.setObjectName(_fromUtf8("save_images_to_tags")) self.vboxlayout.addWidget(self.save_images_to_tags) + self.cb_embed_front_only = QtGui.QCheckBox(self.rename_files) + self.cb_embed_front_only.setObjectName(_fromUtf8("cb_embed_front_only")) + self.vboxlayout.addWidget(self.cb_embed_front_only) self.save_images_to_files = QtGui.QCheckBox(self.rename_files) self.save_images_to_files.setObjectName(_fromUtf8("save_images_to_files")) self.vboxlayout.addWidget(self.save_images_to_files) @@ -111,6 +114,7 @@ class Ui_CoverOptionsPage(object): self.verticalLayout.addItem(spacerItem1) self.retranslateUi(CoverOptionsPage) + QtCore.QObject.connect(self.save_images_to_tags, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.cb_embed_front_only.setEnabled) QtCore.QMetaObject.connectSlotsByName(CoverOptionsPage) CoverOptionsPage.setTabOrder(self.save_images_to_tags, self.save_images_to_files) CoverOptionsPage.setTabOrder(self.save_images_to_files, self.cover_image_filename) @@ -118,6 +122,7 @@ class Ui_CoverOptionsPage(object): def retranslateUi(self, CoverOptionsPage): self.rename_files.setTitle(_("Location")) self.save_images_to_tags.setText(_("Embed cover images into tags")) + self.cb_embed_front_only.setText(_("Embed only front images")) self.save_images_to_files.setText(_("Save cover images as separate files")) self.label_3.setText(_("Use the following file name for images:")) self.save_images_overwrite.setText(_("Overwrite the file if it already exists")) diff --git a/po/picard.pot b/po/picard.pot index e065ad707..5759d5bc1 100644 --- a/po/picard.pot +++ b/po/picard.pot @@ -8,123 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2012-09-30 11:45+0200\n" +"POT-Creation-Date: 2012-10-09 15:16+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.4\n" - -#: contrib/plugins/no_release.py:48 -msgid "Enable plugin for all releases by default" -msgstr "" - -#: contrib/plugins/no_release.py:49 -msgid "Tags to strip (comma-separated)" -msgstr "" - -#: contrib/plugins/no_release.py:59 -msgid "Remove specific release information..." -msgstr "" - -#: contrib/plugins/open_in_gui.py:30 -msgid "Open Error" -msgstr "" - -#: contrib/plugins/open_in_gui.py:30 -#, python-format -msgid "" -"Error while opening file:\n" -"\n" -"%s" -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:115 -msgid "Last.fm" -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:116 -msgid "Use track tags" -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:117 -msgid "Use artist tags" -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:118 picard/ui/options/tags.py:30 -msgid "Tags" -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:119 -#: picard/ui/ui_options_folksonomy.py:107 -msgid "Ignore tags:" -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:120 -#: picard/ui/ui_options_folksonomy.py:112 -msgid "Join multiple tags with:" -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:121 -#: picard/ui/ui_options_folksonomy.py:113 -msgid " / " -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:122 -#: picard/ui/ui_options_folksonomy.py:114 -msgid ", " -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:123 -#: picard/ui/ui_options_folksonomy.py:109 -msgid "Minimal tag usage:" -msgstr "" - -#: contrib/plugins/lastfm/ui_options_lastfm.py:124 -#: picard/ui/ui_options_folksonomy.py:110 picard/ui/ui_options_matching.py:79 -#: picard/ui/ui_options_matching.py:80 picard/ui/ui_options_matching.py:81 -msgid " %" -msgstr "" - -#: contrib/plugins/replaygain/__init__.py:48 -msgid "Calculate replay &gain..." -msgstr "" - -#: contrib/plugins/replaygain/__init__.py:65 -#, python-format -msgid "Calculating replay gain for \"%s\"..." -msgstr "" - -#: contrib/plugins/replaygain/__init__.py:70 -#, python-format -msgid "Replay gain for \"%s\" successfully calculated." -msgstr "" - -#: contrib/plugins/replaygain/__init__.py:72 -#, python-format -msgid "Could not calculate replay gain for \"%s\"." -msgstr "" - -#: contrib/plugins/replaygain/__init__.py:75 -msgid "Calculate album &gain..." -msgstr "" - -#: contrib/plugins/replaygain/__init__.py:98 -#, python-format -msgid "Calculating album gain for \"%s\"..." -msgstr "" - -#: contrib/plugins/replaygain/__init__.py:106 -#, python-format -msgid "Album gain for \"%s\" successfully calculated." -msgstr "" - -#: contrib/plugins/replaygain/__init__.py:108 -#, python-format -msgid "Could not calculate album gain for \"%s\"." -msgstr "" +"Generated-By: Babel 0.9.6\n" #: picard/acoustid.py:118 #, python-format @@ -189,1212 +80,1212 @@ msgstr "" msgid "Looking up the metadata for cluster %s..." msgstr "" -#: picard/const.py:39 +#: picard/const.py:33 msgid "CD" msgstr "" -#: picard/const.py:40 +#: picard/const.py:34 msgid "CD-R" msgstr "" -#: picard/const.py:41 +#: picard/const.py:35 msgid "HDCD" msgstr "" -#: picard/const.py:42 +#: picard/const.py:36 msgid "8cm CD" msgstr "" -#: picard/const.py:43 +#: picard/const.py:37 msgid "Vinyl" msgstr "" -#: picard/const.py:44 +#: picard/const.py:38 msgid "7\" Vinyl" msgstr "" -#: picard/const.py:45 +#: picard/const.py:39 msgid "10\" Vinyl" msgstr "" -#: picard/const.py:46 +#: picard/const.py:40 msgid "12\" Vinyl" msgstr "" -#: picard/const.py:47 +#: picard/const.py:41 msgid "Digital Media" msgstr "" -#: picard/const.py:48 +#: picard/const.py:42 msgid "USB Flash Drive" msgstr "" -#: picard/const.py:49 +#: picard/const.py:43 msgid "slotMusic" msgstr "" -#: picard/const.py:50 +#: picard/const.py:44 msgid "Cassette" msgstr "" -#: picard/const.py:51 +#: picard/const.py:45 msgid "DVD" msgstr "" -#: picard/const.py:52 +#: picard/const.py:46 msgid "DVD-Audio" msgstr "" -#: picard/const.py:53 +#: picard/const.py:47 msgid "DVD-Video" msgstr "" -#: picard/const.py:54 +#: picard/const.py:48 msgid "SACD" msgstr "" -#: picard/const.py:55 +#: picard/const.py:49 msgid "DualDisc" msgstr "" -#: picard/const.py:56 +#: picard/const.py:50 msgid "MiniDisc" msgstr "" -#: picard/const.py:57 +#: picard/const.py:51 msgid "Blu-ray" msgstr "" -#: picard/const.py:58 +#: picard/const.py:52 msgid "HD-DVD" msgstr "" -#: picard/const.py:59 +#: picard/const.py:53 msgid "Videotape" msgstr "" -#: picard/const.py:60 +#: picard/const.py:54 msgid "VHS" msgstr "" -#: picard/const.py:61 +#: picard/const.py:55 msgid "Betamax" msgstr "" -#: picard/const.py:62 +#: picard/const.py:56 msgid "VCD" msgstr "" -#: picard/const.py:63 +#: picard/const.py:57 msgid "SVCD" msgstr "" -#: picard/const.py:64 +#: picard/const.py:58 msgid "UMD" msgstr "" -#: picard/const.py:65 picard/ui/ui_options_releases.py:226 +#: picard/const.py:59 picard/ui/ui_options_releases.py:226 msgid "Other" msgstr "" -#: picard/const.py:66 +#: picard/const.py:60 msgid "LaserDisc" msgstr "" -#: picard/const.py:67 +#: picard/const.py:61 msgid "Cartridge" msgstr "" -#: picard/const.py:68 +#: picard/const.py:62 msgid "Reel-to-reel" msgstr "" -#: picard/const.py:69 +#: picard/const.py:63 msgid "DAT" msgstr "" -#: picard/const.py:70 +#: picard/const.py:64 msgid "Wax Cylinder" msgstr "" -#: picard/const.py:71 +#: picard/const.py:65 msgid "Piano Roll" msgstr "" -#: picard/const.py:72 +#: picard/const.py:66 msgid "DCC" msgstr "" -#: picard/const.py:77 +#: picard/const.py:71 msgid "Bangladesh" msgstr "" -#: picard/const.py:78 +#: picard/const.py:72 msgid "Belgium" msgstr "" -#: picard/const.py:79 +#: picard/const.py:73 msgid "Burkina Faso" msgstr "" -#: picard/const.py:80 +#: picard/const.py:74 msgid "Bulgaria" msgstr "" -#: picard/const.py:81 +#: picard/const.py:75 msgid "Barbados" msgstr "" -#: picard/const.py:82 +#: picard/const.py:76 msgid "Wallis and Futuna Islands" msgstr "" -#: picard/const.py:83 +#: picard/const.py:77 msgid "Bermuda" msgstr "" -#: picard/const.py:84 +#: picard/const.py:78 msgid "Brunei Darussalam" msgstr "" -#: picard/const.py:85 +#: picard/const.py:79 msgid "Bolivia" msgstr "" -#: picard/const.py:86 +#: picard/const.py:80 msgid "Bahrain" msgstr "" -#: picard/const.py:87 +#: picard/const.py:81 msgid "Burundi" msgstr "" -#: picard/const.py:88 +#: picard/const.py:82 msgid "Benin" msgstr "" -#: picard/const.py:89 +#: picard/const.py:83 msgid "Bhutan" msgstr "" -#: picard/const.py:90 +#: picard/const.py:84 msgid "Jamaica" msgstr "" -#: picard/const.py:91 +#: picard/const.py:85 msgid "Bouvet Island" msgstr "" -#: picard/const.py:92 +#: picard/const.py:86 msgid "Botswana" msgstr "" -#: picard/const.py:93 +#: picard/const.py:87 msgid "Samoa" msgstr "" -#: picard/const.py:94 +#: picard/const.py:88 msgid "Brazil" msgstr "" -#: picard/const.py:95 +#: picard/const.py:89 msgid "Bahamas" msgstr "" -#: picard/const.py:96 +#: picard/const.py:90 msgid "Belarus" msgstr "" -#: picard/const.py:97 +#: picard/const.py:91 msgid "Belize" msgstr "" -#: picard/const.py:98 +#: picard/const.py:92 msgid "Russian Federation" msgstr "" -#: picard/const.py:99 +#: picard/const.py:93 msgid "Rwanda" msgstr "" -#: picard/const.py:100 +#: picard/const.py:94 msgid "Reunion" msgstr "" -#: picard/const.py:101 +#: picard/const.py:95 msgid "Turkmenistan" msgstr "" -#: picard/const.py:102 +#: picard/const.py:96 msgid "Tajikistan" msgstr "" -#: picard/const.py:103 +#: picard/const.py:97 msgid "Romania" msgstr "" -#: picard/const.py:104 +#: picard/const.py:98 msgid "Tokelau" msgstr "" -#: picard/const.py:105 +#: picard/const.py:99 msgid "Guinea-Bissa" msgstr "" -#: picard/const.py:106 +#: picard/const.py:100 msgid "Guam" msgstr "" -#: picard/const.py:107 +#: picard/const.py:101 msgid "Guatemala" msgstr "" -#: picard/const.py:108 +#: picard/const.py:102 msgid "Greece" msgstr "" -#: picard/const.py:109 +#: picard/const.py:103 msgid "Equatorial Guinea" msgstr "" -#: picard/const.py:110 +#: picard/const.py:104 msgid "Guadeloupe" msgstr "" -#: picard/const.py:111 +#: picard/const.py:105 msgid "Japan" msgstr "" -#: picard/const.py:112 +#: picard/const.py:106 msgid "Guyana" msgstr "" -#: picard/const.py:113 +#: picard/const.py:107 msgid "French Guiana" msgstr "" -#: picard/const.py:114 +#: picard/const.py:108 msgid "Georgia" msgstr "" -#: picard/const.py:115 +#: picard/const.py:109 msgid "Grenada" msgstr "" -#: picard/const.py:116 +#: picard/const.py:110 msgid "United Kingdom" msgstr "" -#: picard/const.py:117 +#: picard/const.py:111 msgid "Gabon" msgstr "" -#: picard/const.py:118 +#: picard/const.py:112 msgid "El Salvador" msgstr "" -#: picard/const.py:119 +#: picard/const.py:113 msgid "Guinea" msgstr "" -#: picard/const.py:120 +#: picard/const.py:114 msgid "Gambia" msgstr "" -#: picard/const.py:121 +#: picard/const.py:115 msgid "Greenland" msgstr "" -#: picard/const.py:122 +#: picard/const.py:116 msgid "Gibraltar" msgstr "" -#: picard/const.py:123 +#: picard/const.py:117 msgid "Ghana" msgstr "" -#: picard/const.py:124 +#: picard/const.py:118 msgid "Oman" msgstr "" -#: picard/const.py:125 +#: picard/const.py:119 msgid "Tunisia" msgstr "" -#: picard/const.py:126 +#: picard/const.py:120 msgid "Jordan" msgstr "" -#: picard/const.py:127 +#: picard/const.py:121 msgid "Haiti" msgstr "" -#: picard/const.py:128 +#: picard/const.py:122 msgid "Hungary" msgstr "" -#: picard/const.py:129 +#: picard/const.py:123 msgid "Hong Kong" msgstr "" -#: picard/const.py:130 +#: picard/const.py:124 msgid "Honduras" msgstr "" -#: picard/const.py:131 +#: picard/const.py:125 msgid "Heard and Mc Donald Islands" msgstr "" -#: picard/const.py:132 +#: picard/const.py:126 msgid "Venezuela" msgstr "" -#: picard/const.py:133 +#: picard/const.py:127 msgid "Puerto Rico" msgstr "" -#: picard/const.py:134 +#: picard/const.py:128 msgid "Palau" msgstr "" -#: picard/const.py:135 +#: picard/const.py:129 msgid "Portugal" msgstr "" -#: picard/const.py:136 +#: picard/const.py:130 msgid "Svalbard and Jan Mayen Islands" msgstr "" -#: picard/const.py:137 +#: picard/const.py:131 msgid "Paraguay" msgstr "" -#: picard/const.py:138 +#: picard/const.py:132 msgid "Iraq" msgstr "" -#: picard/const.py:139 +#: picard/const.py:133 msgid "Panama" msgstr "" -#: picard/const.py:140 +#: picard/const.py:134 msgid "French Polynesia" msgstr "" -#: picard/const.py:141 +#: picard/const.py:135 msgid "Papua New Guinea" msgstr "" -#: picard/const.py:142 +#: picard/const.py:136 msgid "Peru" msgstr "" -#: picard/const.py:143 +#: picard/const.py:137 msgid "Pakistan" msgstr "" -#: picard/const.py:144 +#: picard/const.py:138 msgid "Philippines" msgstr "" -#: picard/const.py:145 +#: picard/const.py:139 msgid "Pitcairn" msgstr "" -#: picard/const.py:146 +#: picard/const.py:140 msgid "Poland" msgstr "" -#: picard/const.py:147 +#: picard/const.py:141 msgid "St. Pierre and Miquelon" msgstr "" -#: picard/const.py:148 +#: picard/const.py:142 msgid "Zambia" msgstr "" -#: picard/const.py:149 +#: picard/const.py:143 msgid "Western Sahara" msgstr "" -#: picard/const.py:150 +#: picard/const.py:144 msgid "Estonia" msgstr "" -#: picard/const.py:151 +#: picard/const.py:145 msgid "Egypt" msgstr "" -#: picard/const.py:152 +#: picard/const.py:146 msgid "South Africa" msgstr "" -#: picard/const.py:153 +#: picard/const.py:147 msgid "Ecuador" msgstr "" -#: picard/const.py:154 +#: picard/const.py:148 msgid "Italy" msgstr "" -#: picard/const.py:155 +#: picard/const.py:149 msgid "Viet Nam" msgstr "" -#: picard/const.py:156 +#: picard/const.py:150 msgid "Solomon Islands" msgstr "" -#: picard/const.py:157 +#: picard/const.py:151 msgid "Ethiopia" msgstr "" -#: picard/const.py:158 +#: picard/const.py:152 msgid "Somalia" msgstr "" -#: picard/const.py:159 +#: picard/const.py:153 msgid "Zimbabwe" msgstr "" -#: picard/const.py:160 +#: picard/const.py:154 msgid "Saudi Arabia" msgstr "" -#: picard/const.py:161 +#: picard/const.py:155 msgid "Spain" msgstr "" -#: picard/const.py:162 +#: picard/const.py:156 msgid "Eritrea" msgstr "" -#: picard/const.py:163 +#: picard/const.py:157 msgid "Moldova, Republic of" msgstr "" -#: picard/const.py:164 +#: picard/const.py:158 msgid "Madagascar" msgstr "" -#: picard/const.py:165 +#: picard/const.py:159 msgid "Morocco" msgstr "" -#: picard/const.py:166 +#: picard/const.py:160 msgid "Monaco" msgstr "" -#: picard/const.py:167 +#: picard/const.py:161 msgid "Uzbekistan" msgstr "" -#: picard/const.py:168 +#: picard/const.py:162 msgid "Myanmar" msgstr "" -#: picard/const.py:169 +#: picard/const.py:163 msgid "Mali" msgstr "" -#: picard/const.py:170 +#: picard/const.py:164 msgid "Macau" msgstr "" -#: picard/const.py:171 +#: picard/const.py:165 msgid "Mongolia" msgstr "" -#: picard/const.py:172 +#: picard/const.py:166 msgid "Marshall Islands" msgstr "" -#: picard/const.py:173 +#: picard/const.py:167 msgid "Macedonia, The Former Yugoslav Republic of" msgstr "" -#: picard/const.py:174 +#: picard/const.py:168 msgid "Mauritius" msgstr "" -#: picard/const.py:175 +#: picard/const.py:169 msgid "Malta" msgstr "" -#: picard/const.py:176 +#: picard/const.py:170 msgid "Malawi" msgstr "" -#: picard/const.py:177 +#: picard/const.py:171 msgid "Maldives" msgstr "" -#: picard/const.py:178 +#: picard/const.py:172 msgid "Martinique" msgstr "" -#: picard/const.py:179 +#: picard/const.py:173 msgid "Northern Mariana Islands" msgstr "" -#: picard/const.py:180 +#: picard/const.py:174 msgid "Montserrat" msgstr "" -#: picard/const.py:181 +#: picard/const.py:175 msgid "Mauritania" msgstr "" -#: picard/const.py:182 +#: picard/const.py:176 msgid "Uganda" msgstr "" -#: picard/const.py:183 +#: picard/const.py:177 msgid "Malaysia" msgstr "" -#: picard/const.py:184 +#: picard/const.py:178 msgid "Mexico" msgstr "" -#: picard/const.py:185 +#: picard/const.py:179 msgid "Israel" msgstr "" -#: picard/const.py:186 +#: picard/const.py:180 msgid "France" msgstr "" -#: picard/const.py:187 +#: picard/const.py:181 msgid "British Indian Ocean Territory" msgstr "" -#: picard/const.py:188 +#: picard/const.py:182 msgid "St. Helena" msgstr "" -#: picard/const.py:189 +#: picard/const.py:183 msgid "Finland" msgstr "" -#: picard/const.py:190 +#: picard/const.py:184 msgid "Fiji" msgstr "" -#: picard/const.py:191 +#: picard/const.py:185 msgid "Falkland Islands (Malvinas)" msgstr "" -#: picard/const.py:192 +#: picard/const.py:186 msgid "Micronesia, Federated States of" msgstr "" -#: picard/const.py:193 +#: picard/const.py:187 msgid "Faroe Islands" msgstr "" -#: picard/const.py:194 +#: picard/const.py:188 msgid "Nicaragua" msgstr "" -#: picard/const.py:195 +#: picard/const.py:189 msgid "Netherlands" msgstr "" -#: picard/const.py:196 +#: picard/const.py:190 msgid "Norway" msgstr "" -#: picard/const.py:197 +#: picard/const.py:191 msgid "Namibia" msgstr "" -#: picard/const.py:198 +#: picard/const.py:192 msgid "Vanuatu" msgstr "" -#: picard/const.py:199 +#: picard/const.py:193 msgid "New Caledonia" msgstr "" -#: picard/const.py:200 +#: picard/const.py:194 msgid "Niger" msgstr "" -#: picard/const.py:201 +#: picard/const.py:195 msgid "Norfolk Island" msgstr "" -#: picard/const.py:202 +#: picard/const.py:196 msgid "Nigeria" msgstr "" -#: picard/const.py:203 +#: picard/const.py:197 msgid "New Zealand" msgstr "" -#: picard/const.py:204 +#: picard/const.py:198 msgid "Zaire" msgstr "" -#: picard/const.py:205 +#: picard/const.py:199 msgid "Nepal" msgstr "" -#: picard/const.py:206 +#: picard/const.py:200 msgid "Nauru" msgstr "" -#: picard/const.py:207 +#: picard/const.py:201 msgid "Niue" msgstr "" -#: picard/const.py:208 +#: picard/const.py:202 msgid "Cook Islands" msgstr "" -#: picard/const.py:209 +#: picard/const.py:203 msgid "Cote d'Ivoire" msgstr "" -#: picard/const.py:210 +#: picard/const.py:204 msgid "Switzerland" msgstr "" -#: picard/const.py:211 +#: picard/const.py:205 msgid "Colombia" msgstr "" -#: picard/const.py:212 +#: picard/const.py:206 msgid "China" msgstr "" -#: picard/const.py:213 +#: picard/const.py:207 msgid "Cameroon" msgstr "" -#: picard/const.py:214 +#: picard/const.py:208 msgid "Chile" msgstr "" -#: picard/const.py:215 +#: picard/const.py:209 msgid "Cocos (Keeling) Islands" msgstr "" -#: picard/const.py:216 +#: picard/const.py:210 msgid "Canada" msgstr "" -#: picard/const.py:217 +#: picard/const.py:211 msgid "Congo" msgstr "" -#: picard/const.py:218 +#: picard/const.py:212 msgid "Central African Republic" msgstr "" -#: picard/const.py:219 +#: picard/const.py:213 msgid "Czech Republic" msgstr "" -#: picard/const.py:220 +#: picard/const.py:214 msgid "Cyprus" msgstr "" -#: picard/const.py:221 +#: picard/const.py:215 msgid "Christmas Island" msgstr "" -#: picard/const.py:222 +#: picard/const.py:216 msgid "Costa Rica" msgstr "" -#: picard/const.py:223 +#: picard/const.py:217 msgid "Cape Verde" msgstr "" -#: picard/const.py:224 +#: picard/const.py:218 msgid "Cuba" msgstr "" -#: picard/const.py:225 +#: picard/const.py:219 msgid "Swaziland" msgstr "" -#: picard/const.py:226 +#: picard/const.py:220 msgid "Syrian Arab Republic" msgstr "" -#: picard/const.py:227 +#: picard/const.py:221 msgid "Kyrgyzstan" msgstr "" -#: picard/const.py:228 +#: picard/const.py:222 msgid "Kenya" msgstr "" -#: picard/const.py:229 +#: picard/const.py:223 msgid "Suriname" msgstr "" -#: picard/const.py:230 +#: picard/const.py:224 msgid "Kiribati" msgstr "" -#: picard/const.py:231 +#: picard/const.py:225 msgid "Cambodia" msgstr "" -#: picard/const.py:232 +#: picard/const.py:226 msgid "Saint Kitts and Nevis" msgstr "" -#: picard/const.py:233 +#: picard/const.py:227 msgid "Comoros" msgstr "" -#: picard/const.py:234 +#: picard/const.py:228 msgid "Sao Tome and Principe" msgstr "" -#: picard/const.py:235 +#: picard/const.py:229 msgid "Slovenia" msgstr "" -#: picard/const.py:236 +#: picard/const.py:230 msgid "Kuwait" msgstr "" -#: picard/const.py:237 +#: picard/const.py:231 msgid "Senegal" msgstr "" -#: picard/const.py:238 +#: picard/const.py:232 msgid "San Marino" msgstr "" -#: picard/const.py:239 +#: picard/const.py:233 msgid "Sierra Leone" msgstr "" -#: picard/const.py:240 +#: picard/const.py:234 msgid "Seychelles" msgstr "" -#: picard/const.py:241 +#: picard/const.py:235 msgid "Kazakhstan" msgstr "" -#: picard/const.py:242 +#: picard/const.py:236 msgid "Cayman Islands" msgstr "" -#: picard/const.py:243 +#: picard/const.py:237 msgid "Singapore" msgstr "" -#: picard/const.py:244 +#: picard/const.py:238 msgid "Sweden" msgstr "" -#: picard/const.py:245 +#: picard/const.py:239 msgid "Sudan" msgstr "" -#: picard/const.py:246 +#: picard/const.py:240 msgid "Dominican Republic" msgstr "" -#: picard/const.py:247 +#: picard/const.py:241 msgid "Dominica" msgstr "" -#: picard/const.py:248 +#: picard/const.py:242 msgid "Djibouti" msgstr "" -#: picard/const.py:249 +#: picard/const.py:243 msgid "Denmark" msgstr "" -#: picard/const.py:250 +#: picard/const.py:244 msgid "Virgin Islands (British)" msgstr "" -#: picard/const.py:251 +#: picard/const.py:245 msgid "Germany" msgstr "" -#: picard/const.py:252 +#: picard/const.py:246 msgid "Yemen" msgstr "" -#: picard/const.py:253 +#: picard/const.py:247 msgid "Algeria" msgstr "" -#: picard/const.py:254 +#: picard/const.py:248 msgid "United States" msgstr "" -#: picard/const.py:255 +#: picard/const.py:249 msgid "Uruguay" msgstr "" -#: picard/const.py:256 +#: picard/const.py:250 msgid "Mayotte" msgstr "" -#: picard/const.py:257 +#: picard/const.py:251 msgid "United States Minor Outlying Islands" msgstr "" -#: picard/const.py:258 +#: picard/const.py:252 msgid "Lebanon" msgstr "" -#: picard/const.py:259 +#: picard/const.py:253 msgid "Saint Lucia" msgstr "" -#: picard/const.py:260 +#: picard/const.py:254 msgid "Lao People's Democratic Republic" msgstr "" -#: picard/const.py:261 +#: picard/const.py:255 msgid "Tuvalu" msgstr "" -#: picard/const.py:262 +#: picard/const.py:256 msgid "Taiwan" msgstr "" -#: picard/const.py:263 +#: picard/const.py:257 msgid "Trinidad and Tobago" msgstr "" -#: picard/const.py:264 +#: picard/const.py:258 msgid "Turkey" msgstr "" -#: picard/const.py:265 +#: picard/const.py:259 msgid "Sri Lanka" msgstr "" -#: picard/const.py:266 +#: picard/const.py:260 msgid "Liechtenstein" msgstr "" -#: picard/const.py:267 +#: picard/const.py:261 msgid "Latvia" msgstr "" -#: picard/const.py:268 +#: picard/const.py:262 msgid "Tonga" msgstr "" -#: picard/const.py:269 +#: picard/const.py:263 msgid "Lithuania" msgstr "" -#: picard/const.py:270 +#: picard/const.py:264 msgid "Luxembourg" msgstr "" -#: picard/const.py:271 +#: picard/const.py:265 msgid "Liberia" msgstr "" -#: picard/const.py:272 +#: picard/const.py:266 msgid "Lesotho" msgstr "" -#: picard/const.py:273 +#: picard/const.py:267 msgid "Thailand" msgstr "" -#: picard/const.py:274 +#: picard/const.py:268 msgid "French Southern Territories" msgstr "" -#: picard/const.py:275 +#: picard/const.py:269 msgid "Togo" msgstr "" -#: picard/const.py:276 +#: picard/const.py:270 msgid "Chad" msgstr "" -#: picard/const.py:277 +#: picard/const.py:271 msgid "Turks and Caicos Islands" msgstr "" -#: picard/const.py:278 +#: picard/const.py:272 msgid "Libyan Arab Jamahiriya" msgstr "" -#: picard/const.py:279 +#: picard/const.py:273 msgid "Vatican City State (Holy See)" msgstr "" -#: picard/const.py:280 +#: picard/const.py:274 msgid "Saint Vincent and The Grenadines" msgstr "" -#: picard/const.py:281 +#: picard/const.py:275 msgid "United Arab Emirates" msgstr "" -#: picard/const.py:282 +#: picard/const.py:276 msgid "Andorra" msgstr "" -#: picard/const.py:283 +#: picard/const.py:277 msgid "Antigua and Barbuda" msgstr "" -#: picard/const.py:284 +#: picard/const.py:278 msgid "Afghanistan" msgstr "" -#: picard/const.py:285 +#: picard/const.py:279 msgid "Anguilla" msgstr "" -#: picard/const.py:286 +#: picard/const.py:280 msgid "Virgin Islands (U.S.)" msgstr "" -#: picard/const.py:287 +#: picard/const.py:281 msgid "Iceland" msgstr "" -#: picard/const.py:288 +#: picard/const.py:282 msgid "Iran (Islamic Republic of)" msgstr "" -#: picard/const.py:289 +#: picard/const.py:283 msgid "Armenia" msgstr "" -#: picard/const.py:290 +#: picard/const.py:284 msgid "Albania" msgstr "" -#: picard/const.py:291 +#: picard/const.py:285 msgid "Angola" msgstr "" -#: picard/const.py:292 +#: picard/const.py:286 msgid "Netherlands Antilles" msgstr "" -#: picard/const.py:293 +#: picard/const.py:287 msgid "Antarctica" msgstr "" -#: picard/const.py:294 +#: picard/const.py:288 msgid "American Samoa" msgstr "" -#: picard/const.py:295 +#: picard/const.py:289 msgid "Argentina" msgstr "" -#: picard/const.py:296 +#: picard/const.py:290 msgid "Australia" msgstr "" -#: picard/const.py:297 +#: picard/const.py:291 msgid "Austria" msgstr "" -#: picard/const.py:298 +#: picard/const.py:292 msgid "Aruba" msgstr "" -#: picard/const.py:299 +#: picard/const.py:293 msgid "India" msgstr "" -#: picard/const.py:300 +#: picard/const.py:294 msgid "Tanzania, United Republic of" msgstr "" -#: picard/const.py:301 +#: picard/const.py:295 msgid "Azerbaijan" msgstr "" -#: picard/const.py:302 +#: picard/const.py:296 msgid "Ireland" msgstr "" -#: picard/const.py:303 +#: picard/const.py:297 msgid "Indonesia" msgstr "" -#: picard/const.py:304 +#: picard/const.py:298 msgid "Ukraine" msgstr "" -#: picard/const.py:305 +#: picard/const.py:299 msgid "Qatar" msgstr "" -#: picard/const.py:306 +#: picard/const.py:300 msgid "Mozambique" msgstr "" -#: picard/const.py:307 +#: picard/const.py:301 msgid "Bosnia and Herzegovina" msgstr "" -#: picard/const.py:308 +#: picard/const.py:302 msgid "Congo, The Democratic Republic of the" msgstr "" -#: picard/const.py:309 +#: picard/const.py:303 msgid "Serbia and Montenegro (historical, 2003-2006)" msgstr "" -#: picard/const.py:310 +#: picard/const.py:304 msgid "Serbia" msgstr "" -#: picard/const.py:311 +#: picard/const.py:305 msgid "Montenegro" msgstr "" -#: picard/const.py:312 +#: picard/const.py:306 msgid "Croatia" msgstr "" -#: picard/const.py:313 +#: picard/const.py:307 msgid "Korea (North), Democratic People's Republic of" msgstr "" -#: picard/const.py:314 +#: picard/const.py:308 msgid "Korea (South), Republic of" msgstr "" -#: picard/const.py:315 +#: picard/const.py:309 msgid "Slovakia" msgstr "" -#: picard/const.py:316 +#: picard/const.py:310 msgid "Soviet Union (historical, 1922-1991)" msgstr "" -#: picard/const.py:317 +#: picard/const.py:311 msgid "East Timor" msgstr "" -#: picard/const.py:318 +#: picard/const.py:312 msgid "Czechoslovakia (historical, 1918-1992)" msgstr "" -#: picard/const.py:319 +#: picard/const.py:313 msgid "Europe" msgstr "" -#: picard/const.py:320 +#: picard/const.py:314 msgid "East Germany (historical, 1949-1990)" msgstr "" -#: picard/const.py:321 +#: picard/const.py:315 msgid "[Unknown Country]" msgstr "" -#: picard/const.py:322 +#: picard/const.py:316 msgid "[Worldwide]" msgstr "" -#: picard/const.py:323 +#: picard/const.py:317 msgid "Yugoslavia (historical, 1918-1992)" msgstr "" -#: picard/const.py:335 +#: picard/const.py:329 msgid "Danish" msgstr "" -#: picard/const.py:336 +#: picard/const.py:330 msgid "German" msgstr "" -#: picard/const.py:338 +#: picard/const.py:332 msgid "English" msgstr "" -#: picard/const.py:339 +#: picard/const.py:333 msgid "English (Canada)" msgstr "" -#: picard/const.py:340 +#: picard/const.py:334 msgid "English (UK)" msgstr "" -#: picard/const.py:342 +#: picard/const.py:336 msgid "Spanish" msgstr "" -#: picard/const.py:343 +#: picard/const.py:337 msgid "Estonian" msgstr "" -#: picard/const.py:345 +#: picard/const.py:339 msgid "Finnish" msgstr "" -#: picard/const.py:347 +#: picard/const.py:341 msgid "French" msgstr "" -#: picard/const.py:356 +#: picard/const.py:350 msgid "Italian" msgstr "" -#: picard/const.py:363 +#: picard/const.py:357 msgid "Dutch" msgstr "" -#: picard/const.py:365 +#: picard/const.py:359 msgid "Polish" msgstr "" -#: picard/const.py:367 +#: picard/const.py:361 msgid "Brazilian Portuguese" msgstr "" -#: picard/const.py:374 +#: picard/const.py:368 msgid "Swedish" msgstr "" -#: picard/coverart.py:98 +#: picard/coverart.py:100 #, python-format msgid "Coverart %s downloaded" msgstr "" -#: picard/coverart.py:208 +#: picard/coverart.py:213 #, python-format msgid "Downloading http://%s:%i%s" msgstr "" -#: picard/file.py:520 +#: picard/file.py:523 #, python-format msgid "No matching tracks for file %s" msgstr "" -#: picard/file.py:532 +#: picard/file.py:535 #, python-format msgid "No matching tracks above the threshold for file %s" msgstr "" -#: picard/file.py:535 +#: picard/file.py:538 #, python-format msgid "File %s identified!" msgstr "" -#: picard/file.py:549 +#: picard/file.py:552 #, python-format msgid "Looking up the metadata for file %s..." msgstr "" @@ -1450,7 +1341,7 @@ msgstr "" msgid "Barcode" msgstr "" -#: picard/ui/coverartbox.py:122 +#: picard/ui/coverartbox.py:128 msgid "View release on MusicBrainz" msgstr "" @@ -1925,14 +1816,14 @@ msgid_plural "Use Original Values" msgstr[0] "" msgstr[1] "" -#: picard/ui/passworddialog.py:38 +#: picard/ui/passworddialog.py:37 #, python-format msgid "" "The server %s requires you to login. Please enter your username and " "password." msgstr "" -#: picard/ui/passworddialog.py:76 +#: picard/ui/passworddialog.py:75 #, python-format msgid "" "The proxy %s requires you to login. Please enter your username and " @@ -2000,79 +1891,83 @@ msgstr "" msgid "Default CD-ROM drive to use for lookups:" msgstr "" -#: picard/ui/ui_options_cover.py:119 +#: picard/ui/ui_options_cover.py:123 msgid "Location" msgstr "" -#: picard/ui/ui_options_cover.py:120 +#: picard/ui/ui_options_cover.py:124 msgid "Embed cover images into tags" msgstr "" -#: picard/ui/ui_options_cover.py:121 -msgid "Save cover images as separate files" -msgstr "" - -#: picard/ui/ui_options_cover.py:122 -msgid "Use the following file name for images:" -msgstr "" - -#: picard/ui/ui_options_cover.py:123 -msgid "Overwrite the file if it already exists" -msgstr "" - -#: picard/ui/ui_options_cover.py:124 -msgid "Coverart Providers" -msgstr "" - #: picard/ui/ui_options_cover.py:125 -msgid "Amazon" +msgid "Embed only front images" msgstr "" #: picard/ui/ui_options_cover.py:126 -msgid "CD Baby" +msgid "Save cover images as separate files" msgstr "" -#: picard/ui/ui_options_cover.py:127 picard/ui/ui_options_cover.py:130 -msgid "Cover Art Archive" +#: picard/ui/ui_options_cover.py:127 +msgid "Use the following file name for images:" msgstr "" #: picard/ui/ui_options_cover.py:128 -msgid "Jamendo" +msgid "Overwrite the file if it already exists" msgstr "" #: picard/ui/ui_options_cover.py:129 -msgid "Sites on the whitelist" +msgid "Coverart Providers" +msgstr "" + +#: picard/ui/ui_options_cover.py:130 +msgid "Amazon" msgstr "" #: picard/ui/ui_options_cover.py:131 -msgid "Only use images of the following size:" +msgid "CD Baby" msgstr "" -#: picard/ui/ui_options_cover.py:132 -msgid "250 px" +#: picard/ui/ui_options_cover.py:132 picard/ui/ui_options_cover.py:135 +msgid "Cover Art Archive" msgstr "" #: picard/ui/ui_options_cover.py:133 -msgid "500 px" +msgid "Jamendo" msgstr "" #: picard/ui/ui_options_cover.py:134 -msgid "Full size" -msgstr "" - -#: picard/ui/ui_options_cover.py:135 -msgid "Download only images of the following types:" +msgid "Sites on the whitelist" msgstr "" #: picard/ui/ui_options_cover.py:136 -msgid "Types are separated by spaces, and are not case-sensitive." +msgid "Only use images of the following size:" msgstr "" #: picard/ui/ui_options_cover.py:137 -msgid "Download only approved images" +msgid "250 px" msgstr "" #: picard/ui/ui_options_cover.py:138 +msgid "500 px" +msgstr "" + +#: picard/ui/ui_options_cover.py:139 +msgid "Full size" +msgstr "" + +#: picard/ui/ui_options_cover.py:140 +msgid "Download only images of the following types:" +msgstr "" + +#: picard/ui/ui_options_cover.py:141 +msgid "Types are separated by spaces, and are not case-sensitive." +msgstr "" + +#: picard/ui/ui_options_cover.py:142 +msgid "Download only approved images" +msgstr "" + +#: picard/ui/ui_options_cover.py:143 msgid "" "Use the first image type as the filename. This will not change the " "filename of front images." @@ -2119,14 +2014,45 @@ msgstr "" msgid "Folksonomy Tags" msgstr "" +#: picard/ui/ui_options_folksonomy.py:107 +#: contrib/plugins/lastfm/ui_options_lastfm.py:119 +msgid "Ignore tags:" +msgstr "" + #: picard/ui/ui_options_folksonomy.py:108 msgid "Only use my tags" msgstr "" +#: picard/ui/ui_options_folksonomy.py:109 +#: contrib/plugins/lastfm/ui_options_lastfm.py:123 +msgid "Minimal tag usage:" +msgstr "" + +#: picard/ui/ui_options_folksonomy.py:110 picard/ui/ui_options_matching.py:79 +#: picard/ui/ui_options_matching.py:80 picard/ui/ui_options_matching.py:81 +#: contrib/plugins/lastfm/ui_options_lastfm.py:124 +msgid " %" +msgstr "" + #: picard/ui/ui_options_folksonomy.py:111 msgid "Maximum number of tags:" msgstr "" +#: picard/ui/ui_options_folksonomy.py:112 +#: contrib/plugins/lastfm/ui_options_lastfm.py:120 +msgid "Join multiple tags with:" +msgstr "" + +#: picard/ui/ui_options_folksonomy.py:113 +#: contrib/plugins/lastfm/ui_options_lastfm.py:121 +msgid " / " +msgstr "" + +#: picard/ui/ui_options_folksonomy.py:114 +#: contrib/plugins/lastfm/ui_options_lastfm.py:122 +msgid ", " +msgstr "" + #: picard/ui/ui_options_general.py:92 msgid "MusicBrainz Server" msgstr "" @@ -2544,7 +2470,7 @@ msgstr "" msgid "Cover Art" msgstr "" -#: picard/ui/options/fingerprinting.py:31 +#: picard/ui/options/fingerprinting.py:32 msgid "Fingerprinting" msgstr "" @@ -2606,6 +2532,10 @@ msgstr "" msgid "Script Error" msgstr "" +#: picard/ui/options/tags.py:30 contrib/plugins/lastfm/ui_options_lastfm.py:118 +msgid "Tags" +msgstr "" + #: picard/util/tags.py:25 msgid "Original Release Date" msgstr "" @@ -2850,3 +2780,77 @@ msgid "" "%s" msgstr "" +#: contrib/plugins/no_release.py:48 +msgid "Enable plugin for all releases by default" +msgstr "" + +#: contrib/plugins/no_release.py:49 +msgid "Tags to strip (comma-separated)" +msgstr "" + +#: contrib/plugins/no_release.py:59 +msgid "Remove specific release information..." +msgstr "" + +#: contrib/plugins/open_in_gui.py:30 +msgid "Open Error" +msgstr "" + +#: contrib/plugins/open_in_gui.py:30 +#, python-format +msgid "" +"Error while opening file:\n" +"\n" +"%s" +msgstr "" + +#: contrib/plugins/lastfm/ui_options_lastfm.py:115 +msgid "Last.fm" +msgstr "" + +#: contrib/plugins/lastfm/ui_options_lastfm.py:116 +msgid "Use track tags" +msgstr "" + +#: contrib/plugins/lastfm/ui_options_lastfm.py:117 +msgid "Use artist tags" +msgstr "" + +#: contrib/plugins/replaygain/__init__.py:48 +msgid "Calculate replay &gain..." +msgstr "" + +#: contrib/plugins/replaygain/__init__.py:65 +#, python-format +msgid "Calculating replay gain for \"%s\"..." +msgstr "" + +#: contrib/plugins/replaygain/__init__.py:70 +#, python-format +msgid "Replay gain for \"%s\" successfully calculated." +msgstr "" + +#: contrib/plugins/replaygain/__init__.py:72 +#, python-format +msgid "Could not calculate replay gain for \"%s\"." +msgstr "" + +#: contrib/plugins/replaygain/__init__.py:75 +msgid "Calculate album &gain..." +msgstr "" + +#: contrib/plugins/replaygain/__init__.py:98 +#, python-format +msgid "Calculating album gain for \"%s\"..." +msgstr "" + +#: contrib/plugins/replaygain/__init__.py:106 +#, python-format +msgid "Album gain for \"%s\" successfully calculated." +msgstr "" + +#: contrib/plugins/replaygain/__init__.py:108 +#, python-format +msgid "Could not calculate album gain for \"%s\"." +msgstr "" + diff --git a/ui/options_cover.ui b/ui/options_cover.ui index 666034f21..972e2f926 100644 --- a/ui/options_cover.ui +++ b/ui/options_cover.ui @@ -6,8 +6,8 @@ 0 0 - 524 - 502 + 525 + 526 @@ -30,6 +30,13 @@ + + + + Embed only front images + + + @@ -220,5 +227,22 @@ cover_image_filename - + + + save_images_to_tags + clicked(bool) + cb_embed_front_only + setEnabled(bool) + + + 266 + 44 + + + 266 + 67 + + + +