Add an option to replace Unicode punctuation

This commit is contained in:
Lukáš Lalinský
2011-04-10 19:34:50 +02:00
parent 5bae5973bb
commit c99aba714c
6 changed files with 150 additions and 125 deletions

View File

@@ -26,7 +26,7 @@ from picard.file import File
from picard.track import Track
from picard.script import ScriptParser
from picard.ui.item import Item
from picard.util import format_time, partial, translate_artist, queue
from picard.util import format_time, partial, translate_artist, queue, asciipunct
from picard.cluster import Cluster
from picard.mbxml import release_to_metadata, track_to_metadata
@@ -246,6 +246,10 @@ class Album(DataObject, Item):
if self.config.setting['folksonomy_tags']:
self._convert_folksonomy_tags_to_genre(t, ignore_tags)
# Convert Unicode punctuation
if self.config.setting['convert_punctuation']:
tm.apply_func(asciipunct)
# Track metadata plugins
try:
run_track_metadata_processors(self, tm, release_node, node)
@@ -265,6 +269,9 @@ class Album(DataObject, Item):
self.log.error(traceback.format_exc())
# Strip leading/trailing whitespace
track.metadata.strip_whitespace()
# Convert Unicode punctuation
if self.config.setting['convert_punctuation']:
track.metadat.apply_func(asciipunct)
# Run tagger script for release events
for rel in self.release_events:
@@ -276,7 +283,7 @@ class Album(DataObject, Item):
rel.from_metadata(temp_metadata)
except:
self.log.error(traceback.format_exc())
# Run tagger script for the album itself
try:
parser.eval(script, m)

View File

@@ -174,6 +174,13 @@ class Metadata(object):
def set_changed(self, changed=True):
self.changed = changed
def apply_func(self, func):
new = Metadata()
for key, values in self.rawitems():
if not key.startswith("~"):
new[key] = map(func, values)
self.update(new)
def strip_whitespace(self):
"""Strip leading/trailing whitespace.
@@ -185,11 +192,7 @@ class Metadata(object):
>>> m["foo"]
"bar"
"""
new = Metadata()
for key, values in self.rawitems():
if not key.startswith("~"):
new[key] = [value.strip() for value in values]
self.update(new)
self.apply_func(lambda s: s.strip())
_album_metadata_processors = ExtensionPoint()

View File

@@ -42,6 +42,7 @@ class MetadataOptionsPage(OptionsPage):
BoolOption("setting", "track_ars", False),
BoolOption("setting", "folksonomy_tags", False),
TextOption("setting", "preferred_release_country", u""),
BoolOption("setting", "convert_punctuation", False),
]
def __init__(self, parent=None):
@@ -58,6 +59,7 @@ class MetadataOptionsPage(OptionsPage):
def load(self):
self.ui.translate_artist_names.setChecked(self.config.setting["translate_artist_names"])
self.ui.convert_punctuation.setChecked(self.config.setting["convert_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 @@ class MetadataOptionsPage(OptionsPage):
def save(self):
self.config.setting["translate_artist_names"] = self.ui.translate_artist_names.isChecked()
self.config.setting["convert_punctuation"] = self.ui.convert_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()

View File

@@ -2,8 +2,8 @@
# 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: Sun Apr 10 19:32:51 2011
# by: PyQt4 UI code generator 4.7.4
#
# WARNING! All changes made in this file will be lost!
@@ -12,93 +12,79 @@ from PyQt4 import QtCore, QtGui
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()))
self.vboxlayout = QtGui.QVBoxLayout(MetadataOptionsPage)
self.vboxlayout.setObjectName("vboxlayout")
MetadataOptionsPage.resize(403, 445)
self.verticalLayout = QtGui.QVBoxLayout(MetadataOptionsPage)
self.verticalLayout.setObjectName("verticalLayout")
self.rename_files = QtGui.QGroupBox(MetadataOptionsPage)
self.rename_files.setObjectName("rename_files")
self.gridlayout = QtGui.QGridLayout(self.rename_files)
self.gridlayout.setObjectName("gridlayout")
self.gridLayout = QtGui.QGridLayout(self.rename_files)
self.gridLayout.setSpacing(2)
self.gridLayout.setObjectName("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.gridLayout.addWidget(self.translate_artist_names, 0, 0, 1, 2)
self.convert_punctuation = QtGui.QCheckBox(self.rename_files)
self.convert_punctuation.setObjectName("convert_punctuation")
self.gridLayout.addWidget(self.convert_punctuation, 1, 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.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.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.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.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.vboxlayout.addWidget(self.rename_files)
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.verticalLayout.addWidget(self.rename_files)
self.rename_files_2 = QtGui.QGroupBox(MetadataOptionsPage)
self.rename_files_2.setObjectName("rename_files_2")
self.gridlayout1 = QtGui.QGridLayout(self.rename_files_2)
self.gridlayout1.setMargin(9)
self.gridlayout1.setSpacing(2)
self.gridlayout1.setObjectName("gridlayout1")
self.gridlayout = QtGui.QGridLayout(self.rename_files_2)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
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.gridlayout.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.gridlayout.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.gridlayout.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.gridlayout.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.gridlayout.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.vboxlayout.addWidget(self.rename_files_2)
spacerItem1 = QtGui.QSpacerItem(261,16,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem1)
self.gridlayout.addWidget(self.va_name, 1, 0, 1, 1)
self.verticalLayout.addWidget(self.rename_files_2)
spacerItem1 = QtGui.QSpacerItem(261, 16, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.verticalLayout.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.convert_punctuation.setText(_("Convert Unicode punctuation characters to ASCII"))
self.release_ars.setText(_("Use release relationships"))
self.track_ars.setText(_("Use track relationships"))
self.folksonomy_tags.setText(_("Use folksonomy tags as genre"))

View File

@@ -27,6 +27,33 @@ from encodings import rot_13;
from string import Template
def asciipunct(s):
mapping = {
u"": u"...",
u"": u"'",
u"": u"'",
u"": u"'",
u"": u"\"",
u"": u"\"",
u"": u"\"",
u"": u"'",
u"": u"\"",
u"": u"<",
u"": u">",
u"«": u"<<",
u"»": u">>",
u"": u"-",
u"": u"-",
u"": u"-",
u"": u"-",
u"": u"-",
u"": u"--",
}
for orig, repl in mapping.iteritems():
s = s.replace(orig, repl)
return s
def needs_read_lock(func):
"""Adds a read lock around ``func``.

View File

@@ -1,65 +1,76 @@
<ui version="4.0" >
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MetadataOptionsPage</class>
<widget class="QWidget" name="MetadataOptionsPage" >
<property name="geometry" >
<widget class="QWidget" name="MetadataOptionsPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>387</width>
<height>355</height>
<width>403</width>
<height>445</height>
</rect>
</property>
<layout class="QVBoxLayout" >
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="rename_files" >
<property name="title" >
<widget class="QGroupBox" name="rename_files">
<property name="title">
<string>Metadata</string>
</property>
<layout class="QGridLayout" >
<item row="0" column="0" colspan="2" >
<widget class="QCheckBox" name="translate_artist_names" >
<property name="text" >
<layout class="QGridLayout" name="gridLayout">
<property name="spacing">
<number>2</number>
</property>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="translate_artist_names">
<property name="text">
<string>Translate foreign artist names to English where possible</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2" >
<widget class="QCheckBox" name="release_ars" >
<property name="text" >
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="convert_punctuation">
<property name="text">
<string>Convert Unicode punctuation characters to ASCII</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="release_ars">
<property name="text">
<string>Use release relationships</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2" >
<widget class="QCheckBox" name="track_ars" >
<property name="text" >
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="track_ars">
<property name="text">
<string>Use track relationships</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2" >
<widget class="QCheckBox" name="folksonomy_tags" >
<property name="text" >
<item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="folksonomy_tags">
<property name="text">
<string>Use folksonomy tags as genre</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2" >
<widget class="QLabel" name="label" >
<property name="text" >
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Preferred release country:</string>
</property>
</widget>
</item>
<item row="5" column="0" >
<widget class="QComboBox" name="preferred_release_country" />
<item row="6" column="0">
<widget class="QComboBox" name="preferred_release_country"/>
</item>
<item row="5" column="1" >
<item row="6" column="1">
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>161</width>
<height>20</height>
@@ -71,78 +82,66 @@
</widget>
</item>
<item>
<widget class="QGroupBox" name="rename_files_2" >
<property name="title" >
<widget class="QGroupBox" name="rename_files_2">
<property name="title">
<string>Custom Fields</string>
</property>
<layout class="QGridLayout" >
<property name="leftMargin" >
<layout class="QGridLayout">
<property name="margin">
<number>9</number>
</property>
<property name="topMargin" >
<number>9</number>
</property>
<property name="rightMargin" >
<number>9</number>
</property>
<property name="bottomMargin" >
<number>9</number>
</property>
<property name="horizontalSpacing" >
<property name="spacing">
<number>2</number>
</property>
<property name="verticalSpacing" >
<number>2</number>
</property>
<item row="0" column="0" colspan="2" >
<widget class="QLabel" name="label_3" >
<property name="text" >
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Various artists:</string>
</property>
<property name="buddy" >
<property name="buddy">
<cstring>va_name_default</cstring>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2" >
<widget class="QLabel" name="label_4" >
<property name="text" >
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Non-album tracks:</string>
</property>
<property name="buddy" >
<property name="buddy">
<cstring>nat_name_default</cstring>
</property>
</widget>
</item>
<item row="3" column="0" >
<widget class="QLineEdit" name="nat_name" />
<item row="3" column="0">
<widget class="QLineEdit" name="nat_name"/>
</item>
<item row="3" column="1" >
<widget class="QPushButton" name="nat_name_default" >
<property name="text" >
<item row="3" column="1">
<widget class="QPushButton" name="nat_name_default">
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QPushButton" name="va_name_default" >
<property name="text" >
<item row="1" column="1">
<widget class="QPushButton" name="va_name_default">
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLineEdit" name="va_name" />
<item row="1" column="0">
<widget class="QLineEdit" name="va_name"/>
</item>
</layout>
</widget>
</item>
<item>
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>261</width>
<height>16</height>