diff -rU3 picard-0.12.1/picard/album.py picard-0.12.1-unsmartquote/picard/album.py --- picard-0.12.1/picard/album.py 2009-11-01 10:10:27.000000000 -0800 +++ picard-0.12.1-unsmartquote/picard/album.py 2011-01-01 20:58:41.000000000 -0800 @@ -40,6 +40,33 @@ "electronica": u"Electronic", } +_TRANSLATE_TYPOGRAPHIC_PUNCTUATION = { + u"…": u"...", + u"‘": u"'", + u"’": u"'", + u"‚": u"'", + u"“": u"\"", + u"”": u"\"", + u"„": u"\"", + u"′": u"'", + u"″": u"\"", + u"‹": u"<", + u"›": u">", + } + +_TYPOGRAPHIC_PUNCTUATION_ALBUM_FIELDS = [ + 'album', + 'artist', 'artistsort', 'albumartist', 'albumartistsort', + 'label', + ] + +_TYPOGRAPHIC_PUNCTUATION_TRACK_FIELDS = [ + 'album', + 'artist', 'artistsort', 'albumartist', 'albumartistsort', + 'label', + 'composer', 'conductor', 'arranger', 'lyricist', + 'remixer', 'producer', 'engineer', 'mixer', 'djmixer' + ] class ReleaseEvent(object): @@ -188,6 +215,13 @@ if m['musicbrainz_artistid'] == VARIOUS_ARTISTS_ID: m['albumartistsort'] = m['artistsort'] = m['albumartist'] = m['artist'] = self.config.setting['va_name'] + # Remove typographic punctuation + if self.config.setting['convert_typographic_punctuation']: + for field in _TYPOGRAPHIC_PUNCTUATION_ALBUM_FIELDS: + for i, j in _TRANSLATE_TYPOGRAPHIC_PUNCTUATION.iteritems(): + if hasattr(m, field): + m[field] = m[field].replace(i, j) + # Album metadata plugins try: run_album_metadata_processors(self, m, release_node) @@ -230,6 +264,14 @@ if self.config.setting['folksonomy_tags']: self._convert_folksonomy_tags_to_genre(t, ignore_tags) + # Remove typographic punctuation + if self.config.setting['convert_typographic_punctuation']: + for field in _TYPOGRAPHIC_PUNCTUATION_TRACK_FIELDS: + for i, j in _TRANSLATE_TYPOGRAPHIC_PUNCTUATION.iteritems(): + if hasattr(tm, field): + + tm[field] = tm[field].replace(i, j) + # Track metadata plugins try: run_track_metadata_processors(self, tm, release_node, node) diff -rU3 picard-0.12.1/picard/ui/options/metadata.py picard-0.12.1-unsmartquote/picard/ui/options/metadata.py --- picard-0.12.1/picard/ui/options/metadata.py 2009-11-01 10:10:27.000000000 -0800 +++ picard-0.12.1-unsmartquote/picard/ui/options/metadata.py 2011-01-01 21:06:14.000000000 -0800 @@ -38,6 +38,7 @@ TextOption("setting", "va_name", u"Various Artists"), TextOption("setting", "nat_name", u"[non-album tracks]"), BoolOption("setting", "translate_artist_names", False), + BoolOption("setting", "convert_typographic_punctuation", False), BoolOption("setting", "release_ars", True), BoolOption("setting", "track_ars", False), BoolOption("setting", "folksonomy_tags", False), @@ -58,6 +59,7 @@ def load(self): self.ui.translate_artist_names.setChecked(self.config.setting["translate_artist_names"]) + self.ui.convert_typographic_punctuation.setChecked(self.config.setting["convert_typographic_punctuation"]) self.ui.release_ars.setChecked(self.config.setting["release_ars"]) self.ui.track_ars.setChecked(self.config.setting["track_ars"]) self.ui.folksonomy_tags.setChecked(self.config.setting["folksonomy_tags"]) @@ -68,6 +70,7 @@ def save(self): self.config.setting["translate_artist_names"] = self.ui.translate_artist_names.isChecked() + self.config.setting["convert_typographic_punctuation"] = self.ui.convert_typographic_punctuation.isChecked() self.config.setting["release_ars"] = self.ui.release_ars.isChecked() self.config.setting["track_ars"] = self.ui.track_ars.isChecked() self.config.setting["folksonomy_tags"] = self.ui.folksonomy_tags.isChecked() diff -rU3 picard-0.12.1/picard/ui/ui_options_metadata.py picard-0.12.1-unsmartquote/picard/ui/ui_options_metadata.py --- picard-0.12.1/picard/ui/ui_options_metadata.py 2009-11-01 10:10:27.000000000 -0800 +++ picard-0.12.1-unsmartquote/picard/ui/ui_options_metadata.py 2011-01-01 21:04:03.000000000 -0800 @@ -2,110 +2,100 @@ # Form implementation generated from reading ui file 'ui/options_metadata.ui' # -# Created: Wed Apr 2 08:48:11 2008 -# by: PyQt4 UI code generator 4.3 +# Created: Sat Jan 1 21:04:03 2011 +# by: PyQt4 UI code generator 4.8.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + _fromUtf8 = lambda s: s + class Ui_MetadataOptionsPage(object): def setupUi(self, MetadataOptionsPage): - MetadataOptionsPage.setObjectName("MetadataOptionsPage") - MetadataOptionsPage.resize(QtCore.QSize(QtCore.QRect(0,0,387,355).size()).expandedTo(MetadataOptionsPage.minimumSizeHint())) - + MetadataOptionsPage.setObjectName(_fromUtf8("MetadataOptionsPage")) + MetadataOptionsPage.resize(423, 360) self.vboxlayout = QtGui.QVBoxLayout(MetadataOptionsPage) - self.vboxlayout.setObjectName("vboxlayout") - + self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) self.rename_files = QtGui.QGroupBox(MetadataOptionsPage) - self.rename_files.setObjectName("rename_files") - + self.rename_files.setObjectName(_fromUtf8("rename_files")) self.gridlayout = QtGui.QGridLayout(self.rename_files) - self.gridlayout.setObjectName("gridlayout") - + self.gridlayout.setObjectName(_fromUtf8("gridlayout")) self.translate_artist_names = QtGui.QCheckBox(self.rename_files) - self.translate_artist_names.setObjectName("translate_artist_names") - self.gridlayout.addWidget(self.translate_artist_names,0,0,1,2) - + self.translate_artist_names.setObjectName(_fromUtf8("translate_artist_names")) + self.gridlayout.addWidget(self.translate_artist_names, 0, 0, 1, 2) self.release_ars = QtGui.QCheckBox(self.rename_files) - self.release_ars.setObjectName("release_ars") - self.gridlayout.addWidget(self.release_ars,1,0,1,2) - + self.release_ars.setObjectName(_fromUtf8("release_ars")) + self.gridlayout.addWidget(self.release_ars, 2, 0, 1, 2) self.track_ars = QtGui.QCheckBox(self.rename_files) - self.track_ars.setObjectName("track_ars") - self.gridlayout.addWidget(self.track_ars,2,0,1,2) - + self.track_ars.setObjectName(_fromUtf8("track_ars")) + self.gridlayout.addWidget(self.track_ars, 3, 0, 1, 2) self.folksonomy_tags = QtGui.QCheckBox(self.rename_files) - self.folksonomy_tags.setObjectName("folksonomy_tags") - self.gridlayout.addWidget(self.folksonomy_tags,3,0,1,2) - + self.folksonomy_tags.setObjectName(_fromUtf8("folksonomy_tags")) + self.gridlayout.addWidget(self.folksonomy_tags, 4, 0, 1, 2) self.label = QtGui.QLabel(self.rename_files) - self.label.setObjectName("label") - self.gridlayout.addWidget(self.label,4,0,1,2) - + self.label.setObjectName(_fromUtf8("label")) + self.gridlayout.addWidget(self.label, 5, 0, 1, 2) self.preferred_release_country = QtGui.QComboBox(self.rename_files) - self.preferred_release_country.setObjectName("preferred_release_country") - self.gridlayout.addWidget(self.preferred_release_country,5,0,1,1) - - spacerItem = QtGui.QSpacerItem(161,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum) - self.gridlayout.addItem(spacerItem,5,1,1,1) + self.preferred_release_country.setObjectName(_fromUtf8("preferred_release_country")) + self.gridlayout.addWidget(self.preferred_release_country, 6, 0, 1, 1) + spacerItem = QtGui.QSpacerItem(161, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridlayout.addItem(spacerItem, 6, 1, 1, 1) + self.convert_typographic_punctuation = QtGui.QCheckBox(self.rename_files) + self.convert_typographic_punctuation.setObjectName(_fromUtf8("convert_typographic_punctuation")) + self.gridlayout.addWidget(self.convert_typographic_punctuation, 1, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files) - self.rename_files_2 = QtGui.QGroupBox(MetadataOptionsPage) - self.rename_files_2.setObjectName("rename_files_2") - + self.rename_files_2.setObjectName(_fromUtf8("rename_files_2")) self.gridlayout1 = QtGui.QGridLayout(self.rename_files_2) self.gridlayout1.setMargin(9) self.gridlayout1.setSpacing(2) - self.gridlayout1.setObjectName("gridlayout1") - + self.gridlayout1.setObjectName(_fromUtf8("gridlayout1")) self.label_3 = QtGui.QLabel(self.rename_files_2) - self.label_3.setObjectName("label_3") - self.gridlayout1.addWidget(self.label_3,0,0,1,2) - + self.label_3.setObjectName(_fromUtf8("label_3")) + self.gridlayout1.addWidget(self.label_3, 0, 0, 1, 2) self.label_4 = QtGui.QLabel(self.rename_files_2) - self.label_4.setObjectName("label_4") - self.gridlayout1.addWidget(self.label_4,2,0,1,2) - + self.label_4.setObjectName(_fromUtf8("label_4")) + self.gridlayout1.addWidget(self.label_4, 2, 0, 1, 2) self.nat_name = QtGui.QLineEdit(self.rename_files_2) - self.nat_name.setObjectName("nat_name") - self.gridlayout1.addWidget(self.nat_name,3,0,1,1) - + self.nat_name.setObjectName(_fromUtf8("nat_name")) + self.gridlayout1.addWidget(self.nat_name, 3, 0, 1, 1) self.nat_name_default = QtGui.QPushButton(self.rename_files_2) - self.nat_name_default.setObjectName("nat_name_default") - self.gridlayout1.addWidget(self.nat_name_default,3,1,1,1) - + self.nat_name_default.setObjectName(_fromUtf8("nat_name_default")) + self.gridlayout1.addWidget(self.nat_name_default, 3, 1, 1, 1) self.va_name_default = QtGui.QPushButton(self.rename_files_2) - self.va_name_default.setObjectName("va_name_default") - self.gridlayout1.addWidget(self.va_name_default,1,1,1,1) - + self.va_name_default.setObjectName(_fromUtf8("va_name_default")) + self.gridlayout1.addWidget(self.va_name_default, 1, 1, 1, 1) self.va_name = QtGui.QLineEdit(self.rename_files_2) - self.va_name.setObjectName("va_name") - self.gridlayout1.addWidget(self.va_name,1,0,1,1) + self.va_name.setObjectName(_fromUtf8("va_name")) + self.gridlayout1.addWidget(self.va_name, 1, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files_2) - - spacerItem1 = QtGui.QSpacerItem(261,16,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding) + spacerItem1 = QtGui.QSpacerItem(261, 16, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem1) self.label_3.setBuddy(self.va_name_default) self.label_4.setBuddy(self.nat_name_default) self.retranslateUi(MetadataOptionsPage) QtCore.QMetaObject.connectSlotsByName(MetadataOptionsPage) - MetadataOptionsPage.setTabOrder(self.translate_artist_names,self.va_name) - MetadataOptionsPage.setTabOrder(self.va_name,self.va_name_default) - MetadataOptionsPage.setTabOrder(self.va_name_default,self.nat_name) - MetadataOptionsPage.setTabOrder(self.nat_name,self.nat_name_default) + MetadataOptionsPage.setTabOrder(self.translate_artist_names, self.va_name) + MetadataOptionsPage.setTabOrder(self.va_name, self.va_name_default) + MetadataOptionsPage.setTabOrder(self.va_name_default, self.nat_name) + MetadataOptionsPage.setTabOrder(self.nat_name, self.nat_name_default) def retranslateUi(self, MetadataOptionsPage): - self.rename_files.setTitle(_("Metadata")) - self.translate_artist_names.setText(_("Translate foreign artist names to English where possible")) - self.release_ars.setText(_("Use release relationships")) - self.track_ars.setText(_("Use track relationships")) - self.folksonomy_tags.setText(_("Use folksonomy tags as genre")) - self.label.setText(_("Preferred release country:")) - self.rename_files_2.setTitle(_("Custom Fields")) - self.label_3.setText(_("Various artists:")) - self.label_4.setText(_("Non-album tracks:")) - self.nat_name_default.setText(_("Default")) - self.va_name_default.setText(_("Default")) + self.rename_files.setTitle(QtGui.QApplication.translate("MetadataOptionsPage", "Metadata", None, QtGui.QApplication.UnicodeUTF8)) + self.translate_artist_names.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Translate foreign artist names to English where possible", None, QtGui.QApplication.UnicodeUTF8)) + self.release_ars.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Use release relationships", None, QtGui.QApplication.UnicodeUTF8)) + self.track_ars.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Use track relationships", None, QtGui.QApplication.UnicodeUTF8)) + self.folksonomy_tags.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Use folksonomy tags as genre", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Preferred release country:", None, QtGui.QApplication.UnicodeUTF8)) + self.convert_typographic_punctuation.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Convert typographic punctuation into searchable ASCII", None, QtGui.QApplication.UnicodeUTF8)) + self.rename_files_2.setTitle(QtGui.QApplication.translate("MetadataOptionsPage", "Custom Fields", None, QtGui.QApplication.UnicodeUTF8)) + self.label_3.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Various artists:", None, QtGui.QApplication.UnicodeUTF8)) + self.label_4.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Non-album tracks:", None, QtGui.QApplication.UnicodeUTF8)) + self.nat_name_default.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Default", None, QtGui.QApplication.UnicodeUTF8)) + self.va_name_default.setText(QtGui.QApplication.translate("MetadataOptionsPage", "Default", None, QtGui.QApplication.UnicodeUTF8)) diff -rU3 picard-0.12.1/ui/options_metadata.ui picard-0.12.1-unsmartquote/ui/options_metadata.ui --- picard-0.12.1/ui/options_metadata.ui 2009-11-01 10:10:27.000000000 -0800 +++ picard-0.12.1-unsmartquote/ui/options_metadata.ui 2011-01-01 21:01:11.000000000 -0800 @@ -1,65 +1,66 @@ - + + MetadataOptionsPage - - + + 0 0 - 387 - 355 + 423 + 360 - + - - + + Metadata - - - - + + + + Translate foreign artist names to English where possible - - - + + + Use release relationships - - - + + + Use track relationships - - - + + + Use folksonomy tags as genre - - - + + + Preferred release country: - - + + - + - + Qt::Horizontal - + 161 20 @@ -67,82 +68,77 @@ + + + + Convert typographic punctuation into searchable ASCII + + + - - + + Custom Fields - - + + 9 - - 9 - - - 9 - - - 9 - - - 2 - - + 2 - - - + + + Various artists: - + va_name_default - - - + + + Non-album tracks: - + nat_name_default - - + + - - - + + + Default - - - + + + Default - - + + - + Qt::Vertical - + 261 16