mirror of
https://github.com/fergalmoran/picard.git
synced 2026-01-09 18:13:58 +00:00
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:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -29,6 +29,7 @@ from picard.ui.options import (
|
||||
cover,
|
||||
general,
|
||||
interface,
|
||||
folksonomy,
|
||||
matching,
|
||||
metadata,
|
||||
naming,
|
||||
|
||||
59
picard/ui/options/folksonomy.py
Normal file
59
picard/ui/options/folksonomy.py
Normal 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)
|
||||
@@ -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()
|
||||
|
||||
|
||||
122
picard/ui/ui_options_folksonomy.py
Normal file
122
picard/ui/ui_options_folksonomy.py
Normal 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(_(", "))
|
||||
|
||||
@@ -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
196
ui/options_folksonomy.ui
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user