mirror of
https://github.com/fergalmoran/picard.git
synced 2026-04-27 14:51:20 +00:00
Add an option to replace Unicode punctuation
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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``.
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user