Folksonomy tags/genre support.

More or less a direct copy of the Last.fm plugin, but works with MB tags.
This commit is contained in:
Lukáš Lalinský
2008-02-16 21:00:56 +01:00
parent 59cc51b6b4
commit b4b6147eb0
10 changed files with 494 additions and 52 deletions

View File

@@ -33,6 +33,13 @@ from picard.mbxml import release_to_metadata, track_to_metadata
VARIOUS_ARTISTS_ID = '89ad4ac3-39f7-470e-963a-56509c546377'
_TRANSLATE_TAGS = {
"hip hop": u"Hip-Hop",
"synth-pop": u"Synthpop",
"electronica": u"Electronic",
}
class ReleaseEvent(object):
ATTRS = ['date', 'releasecountry', 'label', 'barcode', 'catalognumber']
@@ -76,6 +83,32 @@ class Album(DataObject, Item):
for file in self.unmatched_files.iterfiles():
yield file
def _convert_folksonomy_tags_to_genre(self, track):
# Combine release and track tags
tags = dict(self.folksonomy_tags)
for name, count in track.folksonomy_tags:
tags.setdefault(name, 0)
tags[name] += count
# Convert counts to values from 0 to 100
maxcount = max(tags.values())
taglist = []
for name, count in tags.items():
taglist.append((100 * maxcount / count, name))
taglist.sort(reverse=True)
# And generate the genre metadata tag
maxtags = self.config.setting['max_tags']
minusage = self.config.setting['min_tag_usage']
genre = []
for usage, name in taglist[:maxtags]:
if usage < minusage:
break
name = _TRANSLATE_TAGS.get(name, name.title())
genre.append(name)
join_tags = self.config.setting['join_tags']
if join_tags:
genre = [join_tags.join(genre)]
track.metadata['genre'] = genre
def _parse_release(self, document):
self.log.debug("Loading release %r", self.id)
@@ -130,7 +163,7 @@ class Album(DataObject, Item):
tm = t.metadata
tm.copy(m)
tm['tracknumber'] = str(i + 1)
track_to_metadata(node, tm, config=self.config)
track_to_metadata(node, tm, config=self.config, track=t)
artists.add(tm['musicbrainz_artistid'])
m.length += tm.length
@@ -142,7 +175,10 @@ class Album(DataObject, Item):
if tm['musicbrainz_artistid'] == VARIOUS_ARTISTS_ID:
tm['artistsort'] = tm['artist'] = self.config.setting['va_name']
# Album metadata plugins
if self.config.setting['folksonomy_tags']:
self._convert_folksonomy_tags_to_genre(t)
# Track metadata plugins
try:
run_track_metadata_processors(self, tm, release_node, node)
except:
@@ -215,13 +251,13 @@ class Album(DataObject, Item):
self._new_metadata = Metadata()
self._new_tracks = []
self._requests = 1
inc = ['tracks', 'puids', 'artist', 'release-events']
if self.config.setting['release_ars'] or self.config.setting['track_ars']:
inc += ['artist-rels', 'url-rels']
if self.config.setting['track_ars']:
inc = ('tracks', 'puids', 'artist', 'release-events', 'labels', 'artist-rels', 'url-rels', 'track-level-rels')
else:
inc = ('tracks', 'puids', 'artist', 'release-events', 'labels', 'artist-rels', 'url-rels')
else:
inc = ('tracks', 'puids', 'artist', 'release-events')
inc += ['track-level-rels']
if self.config.setting['folksonomy_tags']:
inc += ['tags']
self.tagger.xmlws.get_release_by_id(self.id, self._release_request_finished, inc=inc)
def update(self, update_tracks=True):

View File

@@ -24,3 +24,8 @@ class DataObject(LockableObject):
def __init__(self, id):
LockableObject.__init__(self)
self.id = id
self.folksonomy_tags = {}
def add_folksonomy_tag(self, name, count):
self.folksonomy_tags.setdefault(name, 0)
self.folksonomy_tags[name] += count

View File

@@ -106,7 +106,7 @@ def artist_to_metadata(node, m, release=False):
_set_artist_item(m, release, 'albumartistsort', 'artistsort', nodes[0].text)
def track_to_metadata(node, m, config=None):
def track_to_metadata(node, m, config=None, track=None):
m['musicbrainz_trackid'] = node.attribs['id']
m.length = 0
for name, nodes in node.children.iteritems():
@@ -122,6 +122,8 @@ def track_to_metadata(node, m, config=None):
_relations_to_metadata(nodes, m, config)
elif name == 'release_list':
release_to_metadata(nodes[0].release[0], m)
elif name == 'tag_list':
add_folksonomy_tags(nodes[0], track)
def release_to_metadata(node, m, config=None, album=None):
@@ -169,3 +171,13 @@ def release_to_metadata(node, m, config=None, album=None):
m['tracknumber'] = str(int(nodes[0].attribs['offset']) + 1)
if 'count' in nodes[0].attribs:
m['totaltracks'] = nodes[0].attribs['count']
elif name == 'tag_list':
add_folksonomy_tags(nodes[0], album)
def add_folksonomy_tags(node, obj):
if obj and 'tag' in node.children:
for tag in node.tag:
name = tag.text
count = int(tag.attribs['count'])
obj.add_folksonomy_tag(name, count)

View File

@@ -29,6 +29,7 @@ from picard.ui.options import (
cover,
general,
interface,
folksonomy,
matching,
metadata,
naming,

View File

@@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
#
# Picard, the next-generation MusicBrainz tagger
# Copyright (C) 2008 Lukáš Lalinský
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from PyQt4 import QtCore, QtGui
from picard.config import BoolOption, TextOption, IntOption
from picard.ui.options import OptionsPage, OptionsCheckError, register_options_page
from picard.ui.ui_options_folksonomy import Ui_FolksonomyOptionsPage
class FolksonomyOptionsPage(OptionsPage):
NAME = "folsonomy"
TITLE = N_("Folksonomy Tags")
PARENT = "metadata"
SORT_ORDER = 20
ACTIVE = True
options = [
IntOption("setting", "max_tags", 5),
IntOption("setting", "min_tag_usage", 90),
TextOption("setting", "ignore_tags", "seen live,favorites,fixme"),
TextOption("setting", "join_tags", ""),
]
def __init__(self, parent=None):
super(FolksonomyOptionsPage, self).__init__(parent)
self.ui = Ui_FolksonomyOptionsPage()
self.ui.setupUi(self)
def load(self):
self.ui.max_tags.setValue(self.config.setting["max_tags"])
self.ui.min_tag_usage.setValue(self.config.setting["min_tag_usage"])
self.ui.join_tags.setEditText(self.config.setting["join_tags"])
self.ui.ignore_tags.setText(self.config.setting["ignore_tags"])
def save(self):
self.config.setting["max_tags"] = self.ui.max_tags.value()
self.config.setting["min_tag_usage"] = self.ui.min_tag_usage.value()
self.config.setting["join_tags"] = self.ui.join_tags.currentText()
self.config.setting["ignore_tags"] = self.ui.ignore_tags.text()
register_options_page(FolksonomyOptionsPage)

View File

@@ -37,6 +37,7 @@ class MetadataOptionsPage(OptionsPage):
BoolOption("setting", "translate_artist_names", False),
BoolOption("setting", "release_ars", True),
BoolOption("setting", "track_ars", False),
BoolOption("setting", "folksonomy_tags", False),
]
def __init__(self, parent=None):
@@ -50,6 +51,7 @@ class MetadataOptionsPage(OptionsPage):
self.ui.translate_artist_names.setChecked(self.config.setting["translate_artist_names"])
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"])
self.ui.va_name.setText(self.config.setting["va_name"])
self.ui.nat_name.setText(self.config.setting["nat_name"])
@@ -57,6 +59,7 @@ class MetadataOptionsPage(OptionsPage):
self.config.setting["translate_artist_names"] = self.ui.translate_artist_names.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()
self.config.setting["va_name"] = self.ui.va_name.text()
self.config.setting["nat_name"] = self.ui.nat_name.text()

View File

@@ -0,0 +1,122 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_folksonomy.ui'
#
# Created: Sat Feb 16 20:39:33 2008
# by: PyQt4 UI code generator 4.3
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
class Ui_FolksonomyOptionsPage(object):
def setupUi(self, FolksonomyOptionsPage):
FolksonomyOptionsPage.setObjectName("FolksonomyOptionsPage")
FolksonomyOptionsPage.resize(QtCore.QSize(QtCore.QRect(0,0,367,267).size()).expandedTo(FolksonomyOptionsPage.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(FolksonomyOptionsPage)
self.vboxlayout.setObjectName("vboxlayout")
self.rename_files_3 = QtGui.QGroupBox(FolksonomyOptionsPage)
self.rename_files_3.setObjectName("rename_files_3")
self.vboxlayout1 = QtGui.QVBoxLayout(self.rename_files_3)
self.vboxlayout1.setObjectName("vboxlayout1")
self.ignore_tags_2 = QtGui.QLabel(self.rename_files_3)
self.ignore_tags_2.setObjectName("ignore_tags_2")
self.vboxlayout1.addWidget(self.ignore_tags_2)
self.ignore_tags = QtGui.QLineEdit(self.rename_files_3)
self.ignore_tags.setObjectName("ignore_tags")
self.vboxlayout1.addWidget(self.ignore_tags)
self.hboxlayout = QtGui.QHBoxLayout()
self.hboxlayout.setSpacing(6)
self.hboxlayout.setMargin(0)
self.hboxlayout.setObjectName("hboxlayout")
self.label_5 = QtGui.QLabel(self.rename_files_3)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth())
self.label_5.setSizePolicy(sizePolicy)
self.label_5.setObjectName("label_5")
self.hboxlayout.addWidget(self.label_5)
self.min_tag_usage = QtGui.QSpinBox(self.rename_files_3)
self.min_tag_usage.setMaximum(100)
self.min_tag_usage.setObjectName("min_tag_usage")
self.hboxlayout.addWidget(self.min_tag_usage)
self.vboxlayout1.addLayout(self.hboxlayout)
self.hboxlayout1 = QtGui.QHBoxLayout()
self.hboxlayout1.setSpacing(6)
self.hboxlayout1.setMargin(0)
self.hboxlayout1.setObjectName("hboxlayout1")
self.label_6 = QtGui.QLabel(self.rename_files_3)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth())
self.label_6.setSizePolicy(sizePolicy)
self.label_6.setObjectName("label_6")
self.hboxlayout1.addWidget(self.label_6)
self.max_tags = QtGui.QSpinBox(self.rename_files_3)
self.max_tags.setMaximum(100)
self.max_tags.setObjectName("max_tags")
self.hboxlayout1.addWidget(self.max_tags)
self.vboxlayout1.addLayout(self.hboxlayout1)
self.hboxlayout2 = QtGui.QHBoxLayout()
self.hboxlayout2.setSpacing(6)
self.hboxlayout2.setMargin(0)
self.hboxlayout2.setObjectName("hboxlayout2")
self.ignore_tags_4 = QtGui.QLabel(self.rename_files_3)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(4)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ignore_tags_4.sizePolicy().hasHeightForWidth())
self.ignore_tags_4.setSizePolicy(sizePolicy)
self.ignore_tags_4.setObjectName("ignore_tags_4")
self.hboxlayout2.addWidget(self.ignore_tags_4)
self.join_tags = QtGui.QComboBox(self.rename_files_3)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.join_tags.sizePolicy().hasHeightForWidth())
self.join_tags.setSizePolicy(sizePolicy)
self.join_tags.setEditable(True)
self.join_tags.setObjectName("join_tags")
self.join_tags.addItem("")
self.hboxlayout2.addWidget(self.join_tags)
self.vboxlayout1.addLayout(self.hboxlayout2)
self.vboxlayout.addWidget(self.rename_files_3)
spacerItem = QtGui.QSpacerItem(181,31,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_5.setBuddy(self.min_tag_usage)
self.label_6.setBuddy(self.min_tag_usage)
self.retranslateUi(FolksonomyOptionsPage)
QtCore.QMetaObject.connectSlotsByName(FolksonomyOptionsPage)
def retranslateUi(self, FolksonomyOptionsPage):
self.rename_files_3.setTitle(_("Folksonomy Tags"))
self.ignore_tags_2.setText(_("Ignore tags:"))
self.label_5.setText(_("Minimal tag usage:"))
self.min_tag_usage.setSuffix(_(" %"))
self.label_6.setText(_("Maximal number of tags:"))
self.ignore_tags_4.setText(_("Join multiple tags with:"))
self.join_tags.addItem(_(" / "))
self.join_tags.addItem(_(", "))

View File

@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'ui/options_metadata.ui'
#
# Created: Sun Jan 13 17:42:15 2008
# Created: Sat Feb 16 19:53:00 2008
# by: PyQt4 UI code generator 4.3
#
# WARNING! All changes made in this file will be lost!
@@ -12,68 +12,68 @@ from PyQt4 import QtCore, QtGui
class Ui_MetadataOptionsPage(object):
def setupUi(self, MetadataOptionsPage):
MetadataOptionsPage.setObjectName("MetadataOptionsPage")
MetadataOptionsPage.resize(QtCore.QSize(QtCore.QRect(0,0,344,356).size()).expandedTo(MetadataOptionsPage.minimumSizeHint()))
MetadataOptionsPage.resize(QtCore.QSize(QtCore.QRect(0,0,387,302).size()).expandedTo(MetadataOptionsPage.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(MetadataOptionsPage)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.rename_files = QtGui.QGroupBox(MetadataOptionsPage)
self.rename_files.setObjectName("rename_files")
self.vboxlayout1 = QtGui.QVBoxLayout(self.rename_files)
self.vboxlayout1.setMargin(9)
self.vboxlayout1.setSpacing(2)
self.vboxlayout1.setObjectName("vboxlayout1")
self.gridlayout = QtGui.QGridLayout(self.rename_files)
self.gridlayout.setObjectName("gridlayout")
self.translate_artist_names = QtGui.QCheckBox(self.rename_files)
self.translate_artist_names.setObjectName("translate_artist_names")
self.vboxlayout1.addWidget(self.translate_artist_names)
self.gridlayout.addWidget(self.translate_artist_names,0,0,1,1)
self.release_ars = QtGui.QCheckBox(self.rename_files)
self.release_ars.setObjectName("release_ars")
self.vboxlayout1.addWidget(self.release_ars)
self.gridlayout.addWidget(self.release_ars,1,0,1,1)
self.track_ars = QtGui.QCheckBox(self.rename_files)
self.track_ars.setObjectName("track_ars")
self.vboxlayout1.addWidget(self.track_ars)
self.gridlayout.addWidget(self.track_ars,2,0,1,1)
self.folksonomy_tags = QtGui.QCheckBox(self.rename_files)
self.folksonomy_tags.setObjectName("folksonomy_tags")
self.gridlayout.addWidget(self.folksonomy_tags,3,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.gridlayout = QtGui.QGridLayout(self.rename_files_2)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.gridlayout1 = QtGui.QGridLayout(self.rename_files_2)
self.gridlayout1.setMargin(9)
self.gridlayout1.setSpacing(2)
self.gridlayout1.setObjectName("gridlayout1")
self.label_3 = QtGui.QLabel(self.rename_files_2)
self.label_3.setObjectName("label_3")
self.gridlayout.addWidget(self.label_3,0,0,1,2)
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.gridlayout.addWidget(self.label_4,2,0,1,2)
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.gridlayout.addWidget(self.nat_name,3,0,1,1)
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.gridlayout.addWidget(self.nat_name_default,3,1,1,1)
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.gridlayout.addWidget(self.va_name_default,1,1,1,1)
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.gridlayout.addWidget(self.va_name,1,0,1,1)
self.gridlayout1.addWidget(self.va_name,1,0,1,1)
self.vboxlayout.addWidget(self.rename_files_2)
spacerItem = QtGui.QSpacerItem(326,51,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
spacerItem = QtGui.QSpacerItem(331,41,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_3.setBuddy(self.va_name_default)
self.label_4.setBuddy(self.nat_name_default)
@@ -90,6 +90,7 @@ class Ui_MetadataOptionsPage(object):
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.rename_files_2.setTitle(_("Custom Fields"))
self.label_3.setText(_("Various artists:"))
self.label_4.setText(_("Non-album tracks:"))

196
ui/options_folksonomy.ui Normal file
View File

@@ -0,0 +1,196 @@
<ui version="4.0" >
<class>FolksonomyOptionsPage</class>
<widget class="QWidget" name="FolksonomyOptionsPage" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>367</width>
<height>267</height>
</rect>
</property>
<layout class="QVBoxLayout" >
<item>
<widget class="QGroupBox" name="rename_files_3" >
<property name="title" >
<string>Folksonomy Tags</string>
</property>
<layout class="QVBoxLayout" >
<item>
<widget class="QLabel" name="ignore_tags_2" >
<property name="text" >
<string>Ignore tags:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="ignore_tags" />
</item>
<item>
<layout class="QHBoxLayout" >
<property name="spacing" >
<number>6</number>
</property>
<property name="leftMargin" >
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_5" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>Minimal tag usage:</string>
</property>
<property name="buddy" >
<cstring>min_tag_usage</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="min_tag_usage" >
<property name="suffix" >
<string> %</string>
</property>
<property name="maximum" >
<number>100</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" >
<property name="spacing" >
<number>6</number>
</property>
<property name="leftMargin" >
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_6" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>Maximal number of tags:</string>
</property>
<property name="buddy" >
<cstring>min_tag_usage</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="max_tags" >
<property name="maximum" >
<number>100</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" >
<property name="spacing" >
<number>6</number>
</property>
<property name="leftMargin" >
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number>
</property>
<item>
<widget class="QLabel" name="ignore_tags_4" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
<horstretch>4</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>Join multiple tags with:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="join_tags" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="editable" >
<bool>true</bool>
</property>
<item>
<property name="text" >
<string/>
</property>
</item>
<item>
<property name="text" >
<string> / </string>
</property>
</item>
<item>
<property name="text" >
<string>, </string>
</property>
</item>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" >
<size>
<width>181</width>
<height>31</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -5,50 +5,45 @@
<rect>
<x>0</x>
<y>0</y>
<width>344</width>
<height>356</height>
<width>387</width>
<height>302</height>
</rect>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QGroupBox" name="rename_files" >
<property name="title" >
<string>Metadata</string>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>2</number>
</property>
<item>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QCheckBox" name="translate_artist_names" >
<property name="text" >
<string>Translate foreign artist names to English where possible</string>
</property>
</widget>
</item>
<item>
<item row="1" column="0" >
<widget class="QCheckBox" name="release_ars" >
<property name="text" >
<string>Use release relationships</string>
</property>
</widget>
</item>
<item>
<item row="2" column="0" >
<widget class="QCheckBox" name="track_ars" >
<property name="text" >
<string>Use track relationships</string>
</property>
</widget>
</item>
<item row="3" column="0" >
<widget class="QCheckBox" name="folksonomy_tags" >
<property name="text" >
<string>Use folksonomy tags as genre</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@@ -58,10 +53,22 @@
<string>Custom Fields</string>
</property>
<layout class="QGridLayout" >
<property name="margin" >
<property name="leftMargin" >
<number>9</number>
</property>
<property name="spacing" >
<property name="topMargin" >
<number>9</number>
</property>
<property name="rightMargin" >
<number>9</number>
</property>
<property name="bottomMargin" >
<number>9</number>
</property>
<property name="horizontalSpacing" >
<number>2</number>
</property>
<property name="verticalSpacing" >
<number>2</number>
</property>
<item row="0" column="0" colspan="2" >
@@ -114,8 +121,8 @@
</property>
<property name="sizeHint" >
<size>
<width>326</width>
<height>51</height>
<width>331</width>
<height>41</height>
</size>
</property>
</spacer>