From 90b4aec5925e74ac6fba7d05c9bbf66d085ee10d Mon Sep 17 00:00:00 2001 From: Sophist Date: Wed, 26 Mar 2014 11:03:22 +0000 Subject: [PATCH 1/7] Add View Variables plugin --- contrib/plugins/viewvariables/__init__.py | 94 ++++++++++++++++++ .../viewvariables/ui_variables_dialog.py | 79 +++++++++++++++ .../plugins/viewvariables/variables_dialog.ui | 98 +++++++++++++++++++ 3 files changed, 271 insertions(+) create mode 100644 contrib/plugins/viewvariables/__init__.py create mode 100644 contrib/plugins/viewvariables/ui_variables_dialog.py create mode 100644 contrib/plugins/viewvariables/variables_dialog.ui diff --git a/contrib/plugins/viewvariables/__init__.py b/contrib/plugins/viewvariables/__init__.py new file mode 100644 index 000000000..84b937d70 --- /dev/null +++ b/contrib/plugins/viewvariables/__init__.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- + +PLUGIN_NAME = u'View script variables' +PLUGIN_AUTHOR = u'Sophist' +PLUGIN_DESCRIPTION = u'''Display a dialog box listing the metadata variables for the file''' +PLUGIN_VERSION = '0.1' +PLUGIN_API_VERSIONS = ['1.0'] + +from PyQt4 import QtGui, QtCore +from picard.util.tags import MEDIA_TAGS +from picard.track import Track +from picard.ui.itemviews import BaseAction, register_file_action +from picard.plugins.viewvariables.ui_variables_dialog import Ui_VariablesDialog + +class ViewVariables(BaseAction): + NAME = 'View script variables' + + def callback(self, objs): + file = self.tagger.get_files_from_objects(objs)[0] + dialog = ViewVariablesDialog(file) + dialog.exec_() + +class ViewVariablesDialog(QtGui.QDialog): + + def __init__(self, file, parent=None): + QtGui.QDialog.__init__(self, parent) + self.obj = file + self.ui = Ui_VariablesDialog() + self.ui.setupUi(self) + self.ui.buttonBox.accepted.connect(self.accept) + self.ui.buttonBox.rejected.connect(self.reject) + self.setWindowTitle(_("File Info - %s") % file.base_filename) + self._display_metadata() + + def _display_metadata(self): + metadata = self.obj.metadata + keys = metadata.keys() + keys.sort(key=lambda x: + '0' + x if x in MEDIA_TAGS else + '1' + x if x.startswith('~') else + '2' + x + ) + media = hidden = album = False + table = self.ui.metadata_table + key_example, value_example = self.get_table_items(table, 0) + self.key_flags = key_example.flags() + self.value_flags = value_example.flags() + table.setRowCount(len(keys)+3) + i = 0 + for key in keys: + if key in MEDIA_TAGS: + if not media: + self.add_separator_row(table, i, _("File variables")) + i += 1 + media = True + elif key.startswith('~'): + if not hidden: + self.add_separator_row(table, i, _("Hidden variables")) + i += 1 + hidden = True + else: + if not album: + self.add_separator_row(table, i, _("Tag variables")) + i += 1 + album = True + + key_item, value_item = self.get_table_items(table, i) + i += 1 + key_item.setText(u"_" + key[1:] if key.startswith('~') else key) + if key in metadata: + value_item.setText(metadata[key]) + + def add_separator_row(self, table, i, title): + key_item, value_item = self.get_table_items(table, i) + font = key_item.font() + font.setBold(True) + key_item.setFont(font) + key_item.setText(title) + + def get_table_items(self, table, i): + key_item = table.item(i, 0) + value_item = table.item(i, 1) + if not key_item: + key_item = QtGui.QTableWidgetItem() + key_item.setFlags(self.key_flags) + table.setItem(i, 0, key_item) + if not value_item: + value_item = QtGui.QTableWidgetItem() + value_item.setFlags(self.value_flags) + table.setItem(i, 1, value_item) + return key_item, value_item + + +register_file_action(ViewVariables()) diff --git a/contrib/plugins/viewvariables/ui_variables_dialog.py b/contrib/plugins/viewvariables/ui_variables_dialog.py new file mode 100644 index 000000000..dcfae1895 --- /dev/null +++ b/contrib/plugins/viewvariables/ui_variables_dialog.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui\variables_dialog.ui' +# +# Created: Wed Mar 26 06:58:04 2014 +# by: PyQt4 UI code generator 4.10.3 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_VariablesDialog(object): + def setupUi(self, VariablesDialog): + VariablesDialog.setObjectName(_fromUtf8("VariablesDialog")) + VariablesDialog.resize(600, 450) + self.verticalLayout = QtGui.QVBoxLayout(VariablesDialog) + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) + self.metadata_table = QtGui.QTableWidget(VariablesDialog) + self.metadata_table.setAutoFillBackground(False) + self.metadata_table.setSelectionMode(QtGui.QAbstractItemView.ContiguousSelection) + self.metadata_table.setRowCount(1) + self.metadata_table.setColumnCount(2) + self.metadata_table.setObjectName(_fromUtf8("metadata_table")) + item = QtGui.QTableWidgetItem() + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + item.setFont(font) + self.metadata_table.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + item.setFont(font) + self.metadata_table.setHorizontalHeaderItem(1, item) + item = QtGui.QTableWidgetItem() + item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled) + self.metadata_table.setItem(0, 0, item) + item = QtGui.QTableWidgetItem() + item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled) + self.metadata_table.setItem(0, 1, item) + self.metadata_table.horizontalHeader().setDefaultSectionSize(150) + self.metadata_table.horizontalHeader().setSortIndicatorShown(False) + self.metadata_table.horizontalHeader().setStretchLastSection(True) + self.metadata_table.verticalHeader().setVisible(False) + self.metadata_table.verticalHeader().setDefaultSectionSize(20) + self.metadata_table.verticalHeader().setMinimumSectionSize(20) + self.verticalLayout.addWidget(self.metadata_table) + self.buttonBox = QtGui.QDialogButtonBox(VariablesDialog) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) + self.buttonBox.setObjectName(_fromUtf8("buttonBox")) + self.verticalLayout.addWidget(self.buttonBox) + + self.retranslateUi(VariablesDialog) + QtCore.QMetaObject.connectSlotsByName(VariablesDialog) + + def retranslateUi(self, VariablesDialog): + item = self.metadata_table.horizontalHeaderItem(0) + item.setText(_("Variable")) + item = self.metadata_table.horizontalHeaderItem(1) + item.setText(_("Value")) + __sortingEnabled = self.metadata_table.isSortingEnabled() + self.metadata_table.setSortingEnabled(False) + self.metadata_table.setSortingEnabled(__sortingEnabled) + diff --git a/contrib/plugins/viewvariables/variables_dialog.ui b/contrib/plugins/viewvariables/variables_dialog.ui new file mode 100644 index 000000000..4d167b2ea --- /dev/null +++ b/contrib/plugins/viewvariables/variables_dialog.ui @@ -0,0 +1,98 @@ + + + VariablesDialog + + + + 0 + 0 + 600 + 450 + + + + + + + false + + + QAbstractItemView::ContiguousSelection + + + 1 + + + 2 + + + 150 + + + false + + + true + + + false + + + 20 + + + 20 + + + + + Variable + + + + 75 + true + + + + + + Value + + + + 75 + true + + + + + + + + + ItemIsSelectable|ItemIsEnabled + + + + + ItemIsSelectable|ItemIsEnabled + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + buttonBox + + + + From a850c0133f90d0a697d06a6bc97c02f8a792f8fa Mon Sep 17 00:00:00 2001 From: Sophist Date: Wed, 26 Mar 2014 12:21:10 +0000 Subject: [PATCH 2/7] Handle pre/post #261 --- contrib/plugins/viewvariables/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/contrib/plugins/viewvariables/__init__.py b/contrib/plugins/viewvariables/__init__.py index 84b937d70..f1c372207 100644 --- a/contrib/plugins/viewvariables/__init__.py +++ b/contrib/plugins/viewvariables/__init__.py @@ -7,7 +7,12 @@ PLUGIN_VERSION = '0.1' PLUGIN_API_VERSIONS = ['1.0'] from PyQt4 import QtGui, QtCore -from picard.util.tags import MEDIA_TAGS +try: + from picard.util.tags import MEDIA_TAGS +except ImportError: + from picard.file import File + MEDIA_TAGS = File._default_preserved_tags + from picard.track import Track from picard.ui.itemviews import BaseAction, register_file_action from picard.plugins.viewvariables.ui_variables_dialog import Ui_VariablesDialog From fabd16b62cc282995b01815f0fca933326f95db3 Mon Sep 17 00:00:00 2001 From: Sophist Date: Wed, 26 Mar 2014 12:28:09 +0000 Subject: [PATCH 3/7] Remove unneeded import of track. --- contrib/plugins/viewvariables/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/plugins/viewvariables/__init__.py b/contrib/plugins/viewvariables/__init__.py index f1c372207..94a993803 100644 --- a/contrib/plugins/viewvariables/__init__.py +++ b/contrib/plugins/viewvariables/__init__.py @@ -13,7 +13,6 @@ except ImportError: from picard.file import File MEDIA_TAGS = File._default_preserved_tags -from picard.track import Track from picard.ui.itemviews import BaseAction, register_file_action from picard.plugins.viewvariables.ui_variables_dialog import Ui_VariablesDialog From 0688daa8bbdb5c2f3d96b008f734013f1201b817 Mon Sep 17 00:00:00 2001 From: Sophist Date: Fri, 28 Mar 2014 14:07:13 +0000 Subject: [PATCH 4/7] Show variables for tracks without files --- contrib/plugins/viewvariables/__init__.py | 37 +++++++++++++++-------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/contrib/plugins/viewvariables/__init__.py b/contrib/plugins/viewvariables/__init__.py index 94a993803..b7e129d29 100644 --- a/contrib/plugins/viewvariables/__init__.py +++ b/contrib/plugins/viewvariables/__init__.py @@ -3,7 +3,7 @@ PLUGIN_NAME = u'View script variables' PLUGIN_AUTHOR = u'Sophist' PLUGIN_DESCRIPTION = u'''Display a dialog box listing the metadata variables for the file''' -PLUGIN_VERSION = '0.1' +PLUGIN_VERSION = '0.2' PLUGIN_API_VERSIONS = ['1.0'] from PyQt4 import QtGui, QtCore @@ -13,31 +13,43 @@ except ImportError: from picard.file import File MEDIA_TAGS = File._default_preserved_tags -from picard.ui.itemviews import BaseAction, register_file_action +from picard.file import File +from picard.track import Track +from picard.ui.itemviews import BaseAction, register_file_action, register_track_action from picard.plugins.viewvariables.ui_variables_dialog import Ui_VariablesDialog class ViewVariables(BaseAction): NAME = 'View script variables' def callback(self, objs): - file = self.tagger.get_files_from_objects(objs)[0] - dialog = ViewVariablesDialog(file) + obj = objs[0] + files = self.tagger.get_files_from_objects(objs) + if files: + obj = files[0] + dialog = ViewVariablesDialog(obj) dialog.exec_() class ViewVariablesDialog(QtGui.QDialog): - def __init__(self, file, parent=None): + def __init__(self, obj, parent=None): QtGui.QDialog.__init__(self, parent) - self.obj = file self.ui = Ui_VariablesDialog() self.ui.setupUi(self) self.ui.buttonBox.accepted.connect(self.accept) self.ui.buttonBox.rejected.connect(self.reject) - self.setWindowTitle(_("File Info - %s") % file.base_filename) - self._display_metadata() + metadata = obj.metadata + if isinstance(obj,File): + self.setWindowTitle(_("File: %s") % obj.base_filename) + elif isinstance(obj,Track): + tn = metadata['tracknumber'] + if len(tn) == 1: + tn = u"0" + tn + self.setWindowTitle(_("Track: %s %s ") % (tn, metadata['title'])) + else: + self.setWindowTitle(_("Variables")) + self._display_metadata(metadata) - def _display_metadata(self): - metadata = self.obj.metadata + def _display_metadata(self, metadata): keys = metadata.keys() keys.sort(key=lambda x: '0' + x if x in MEDIA_TAGS else @@ -94,5 +106,6 @@ class ViewVariablesDialog(QtGui.QDialog): table.setItem(i, 1, value_item) return key_item, value_item - -register_file_action(ViewVariables()) +vv = ViewVariables() +register_file_action(vv) +register_track_action(vv) From 3731ba833f06524322382b2b4d897f32603d9b9f Mon Sep 17 00:00:00 2001 From: Sophist Date: Sat, 29 Mar 2014 15:27:38 +0000 Subject: [PATCH 5/7] Show multi-value variables as lists. --- contrib/plugins/viewvariables/__init__.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/contrib/plugins/viewvariables/__init__.py b/contrib/plugins/viewvariables/__init__.py index b7e129d29..c40857d5f 100644 --- a/contrib/plugins/viewvariables/__init__.py +++ b/contrib/plugins/viewvariables/__init__.py @@ -2,8 +2,8 @@ PLUGIN_NAME = u'View script variables' PLUGIN_AUTHOR = u'Sophist' -PLUGIN_DESCRIPTION = u'''Display a dialog box listing the metadata variables for the file''' -PLUGIN_VERSION = '0.2' +PLUGIN_DESCRIPTION = u'''Display a dialog box listing the metadata variables for the track / file.''' +PLUGIN_VERSION = '0.3' PLUGIN_API_VERSIONS = ['1.0'] from PyQt4 import QtGui, QtCore @@ -84,7 +84,12 @@ class ViewVariablesDialog(QtGui.QDialog): i += 1 key_item.setText(u"_" + key[1:] if key.startswith('~') else key) if key in metadata: - value_item.setText(metadata[key]) + value = metadata.getall(key) + if len(value) == 1: + value = value[0] + else: + value = repr(value) + value_item.setText(value) def add_separator_row(self, table, i, title): key_item, value_item = self.get_table_items(table, i) From 0fcf46c9bf2cd324791c3f737e0944932e8b32f1 Mon Sep 17 00:00:00 2001 From: Sophist Date: Mon, 31 Mar 2014 11:05:19 +0100 Subject: [PATCH 6/7] Fix display of multi-value for id3v23 --- contrib/plugins/viewvariables/__init__.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/contrib/plugins/viewvariables/__init__.py b/contrib/plugins/viewvariables/__init__.py index c40857d5f..8617b7335 100644 --- a/contrib/plugins/viewvariables/__init__.py +++ b/contrib/plugins/viewvariables/__init__.py @@ -3,15 +3,15 @@ PLUGIN_NAME = u'View script variables' PLUGIN_AUTHOR = u'Sophist' PLUGIN_DESCRIPTION = u'''Display a dialog box listing the metadata variables for the track / file.''' -PLUGIN_VERSION = '0.3' +PLUGIN_VERSION = '0.4' PLUGIN_API_VERSIONS = ['1.0'] from PyQt4 import QtGui, QtCore try: - from picard.util.tags import MEDIA_TAGS + from picard.util.tags import PRESERVED_TAGS except ImportError: from picard.file import File - MEDIA_TAGS = File._default_preserved_tags + PRESERVED_TAGS = File._default_preserved_tags from picard.file import File from picard.track import Track @@ -51,10 +51,10 @@ class ViewVariablesDialog(QtGui.QDialog): def _display_metadata(self, metadata): keys = metadata.keys() - keys.sort(key=lambda x: - '0' + x if x in MEDIA_TAGS else - '1' + x if x.startswith('~') else - '2' + x + keys.sort(key=lambda key: + '0' + key if key in PRESERVED_TAGS and key.startswith('~') else + '1' + key if key.startswith('~') else + '2' + key ) media = hidden = album = False table = self.ui.metadata_table @@ -64,7 +64,7 @@ class ViewVariablesDialog(QtGui.QDialog): table.setRowCount(len(keys)+3) i = 0 for key in keys: - if key in MEDIA_TAGS: + if key in PRESERVED_TAGS and key.startswith('~') : if not media: self.add_separator_row(table, i, _("File variables")) i += 1 @@ -84,7 +84,7 @@ class ViewVariablesDialog(QtGui.QDialog): i += 1 key_item.setText(u"_" + key[1:] if key.startswith('~') else key) if key in metadata: - value = metadata.getall(key) + value = dict.get(metadata, key, []) if len(value) == 1: value = value[0] else: From 08444f4d6252c1936a9a32f25433aa6779767a2f Mon Sep 17 00:00:00 2001 From: Sophist Date: Fri, 4 Apr 2014 18:32:59 +0100 Subject: [PATCH 7/7] Minor tweak to display if variable is null string --- contrib/plugins/viewvariables/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/plugins/viewvariables/__init__.py b/contrib/plugins/viewvariables/__init__.py index 8617b7335..2a9b87d44 100644 --- a/contrib/plugins/viewvariables/__init__.py +++ b/contrib/plugins/viewvariables/__init__.py @@ -3,7 +3,7 @@ PLUGIN_NAME = u'View script variables' PLUGIN_AUTHOR = u'Sophist' PLUGIN_DESCRIPTION = u'''Display a dialog box listing the metadata variables for the track / file.''' -PLUGIN_VERSION = '0.4' +PLUGIN_VERSION = '0.5' PLUGIN_API_VERSIONS = ['1.0'] from PyQt4 import QtGui, QtCore @@ -84,8 +84,8 @@ class ViewVariablesDialog(QtGui.QDialog): i += 1 key_item.setText(u"_" + key[1:] if key.startswith('~') else key) if key in metadata: - value = dict.get(metadata, key, []) - if len(value) == 1: + value = dict.get(metadata, key) + if len(value) == 1 and value[0] != '': value = value[0] else: value = repr(value)