mirror of
https://github.com/fergalmoran/picard.git
synced 2026-01-06 16:44:06 +00:00
Added file naming format tester. (#2448)
This commit is contained in:
@@ -21,13 +21,25 @@
|
||||
import glob
|
||||
import os.path
|
||||
import shutil
|
||||
import sys
|
||||
import traceback
|
||||
from PyQt4 import QtCore
|
||||
from picard.metadata import Metadata
|
||||
from picard.ui.item import Item
|
||||
from picard.script import ScriptParser
|
||||
from picard.similarity import similarity2
|
||||
from picard.util import LockableObject, encode_filename, decode_filename, format_time, partial
|
||||
from picard.util.thread import spawn, proxy_to_main
|
||||
from picard.util import (
|
||||
decode_filename,
|
||||
encode_filename,
|
||||
make_short_filename,
|
||||
replace_win32_incompat,
|
||||
replace_non_ascii,
|
||||
sanitize_filename,
|
||||
partial,
|
||||
format_time,
|
||||
LockableObject,
|
||||
)
|
||||
|
||||
class File(LockableObject, Item):
|
||||
|
||||
@@ -117,6 +129,49 @@ class File(LockableObject, Item):
|
||||
"""Save the metadata."""
|
||||
raise NotImplementedError
|
||||
|
||||
def make_filename(self, settings=None):
|
||||
"""Constructs file name based on metadata and file naming formats."""
|
||||
|
||||
if settings is None:
|
||||
settings = self.config.setting
|
||||
|
||||
filename = self.filename
|
||||
metadata = Metadata()
|
||||
metadata.copy(self.metadata)
|
||||
|
||||
if settings["move_files"]:
|
||||
new_dirname = settings["move_files_to"]
|
||||
else:
|
||||
new_dirname = os.path.dirname(filename)
|
||||
old_dirname = new_dirname
|
||||
new_filename, ext = os.path.splitext(os.path.basename(filename))
|
||||
|
||||
if settings["rename_files"]:
|
||||
# replace incompatible characters
|
||||
for name in metadata.keys():
|
||||
value = metadata[name]
|
||||
if isinstance(value, basestring):
|
||||
value = sanitize_filename(value)
|
||||
if settings["windows_compatible_filenames"] or sys.platform == "win32":
|
||||
value = replace_win32_incompat(value)
|
||||
if settings["ascii_filenames"]:
|
||||
value = replace_non_ascii(value)
|
||||
metadata[name] = value
|
||||
# expand the naming format
|
||||
if metadata['compilation'] == '1':
|
||||
format = settings['va_file_naming_format']
|
||||
else:
|
||||
format = settings['file_naming_format']
|
||||
new_filename = ScriptParser().eval(format, metadata)
|
||||
if not settings['move_files']:
|
||||
new_filename = os.path.basename(new_filename)
|
||||
new_filename = make_short_filename(new_dirname, new_filename)
|
||||
# win32 compatibility fixes
|
||||
if settings['windows_compatible_filenames'] or sys.platform == 'win32':
|
||||
new_filename = new_filename.replace('./', '_/').replace('.\\', '_\\')
|
||||
|
||||
return os.path.join(new_dirname, new_filename + ext)
|
||||
|
||||
def save_images(self):
|
||||
"""Save the cover images to disk."""
|
||||
if not "~artwork" in self.metadata:
|
||||
|
||||
@@ -21,6 +21,7 @@ import os.path
|
||||
import sys
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from picard.config import BoolOption, TextOption
|
||||
from picard.file import File
|
||||
from picard.script import ScriptParser
|
||||
from picard.ui.options import OptionsPage, OptionsCheckError, register_options_page
|
||||
from picard.ui.ui_options_naming import Ui_NamingOptionsPage
|
||||
@@ -55,6 +56,7 @@ class NamingOptionsPage(OptionsPage):
|
||||
self.connect(self.ui.va_file_naming_format_default, QtCore.SIGNAL("clicked()"), self.set_va_file_naming_format_default)
|
||||
self.connect(self.ui.move_files_to_browse, QtCore.SIGNAL("clicked()"), self.move_files_to_browse)
|
||||
self.connect(self.ui.move_additional_files, QtCore.SIGNAL("clicked()"), self.update_move_additional_files)
|
||||
self.connect(self.ui.test_button, QtCore.SIGNAL("clicked()"), self.test)
|
||||
|
||||
def load(self):
|
||||
if sys.platform == "win32":
|
||||
@@ -118,5 +120,41 @@ class NamingOptionsPage(OptionsPage):
|
||||
def update_move_additional_files(self):
|
||||
self.ui.move_additional_files_pattern.setEnabled(self.ui.move_additional_files.isChecked())
|
||||
|
||||
def test(self):
|
||||
settings = {
|
||||
'windows_compatible_filenames': self.ui.windows_compatible_filenames.isChecked(),
|
||||
'ascii_filenames': self.ui.ascii_filenames.isChecked(),
|
||||
'rename_files': self.ui.rename_files.isChecked(),
|
||||
'move_files': self.ui.move_files.isChecked(),
|
||||
'file_naming_format': unicode(self.ui.file_naming_format.text()),
|
||||
'va_file_naming_format': unicode(self.ui.va_file_naming_format.text()),
|
||||
'move_files_to': os.path.normpath(unicode(self.ui.move_files_to.text())),
|
||||
}
|
||||
|
||||
file = File("ticket_to_ride.mp3")
|
||||
file.metadata['album'] = 'Help!'
|
||||
file.metadata['title'] = 'Ticket to Ride'
|
||||
file.metadata['artist'] = 'The Beatles'
|
||||
file.metadata['albumartist'] = 'The Beatles'
|
||||
file.metadata['tracknumber'] = '7'
|
||||
file.metadata['totaltracks'] = '14'
|
||||
file.metadata['date'] = '1965-08-06'
|
||||
file.metadata['~extension'] = 'mp3'
|
||||
filename = file.make_filename(settings=settings)
|
||||
self.ui.example_filename.setText(filename)
|
||||
|
||||
file = File("track05.mp3")
|
||||
file.metadata['album'] = 'Explosive Doowops, Volume 4'
|
||||
file.metadata['title'] = 'Why? Oh Why?'
|
||||
file.metadata['artist'] = 'The Fantasys'
|
||||
file.metadata['albumartist'] = 'Various Artists'
|
||||
file.metadata['tracknumber'] = '5'
|
||||
file.metadata['totaltracks'] = '26'
|
||||
file.metadata['date'] = '1999-02-03'
|
||||
file.metadata['compilation'] = '1'
|
||||
file.metadata['~extension'] = 'mp3'
|
||||
filename = file.make_filename(settings=settings)
|
||||
self.ui.example_va_filename.setText(filename)
|
||||
|
||||
|
||||
register_options_page(NamingOptionsPage)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'ui/options_naming.ui'
|
||||
#
|
||||
# Created: Sat Mar 3 19:09:31 2007
|
||||
# Created: Sun Mar 4 09:56:45 2007
|
||||
# by: PyQt4 UI code generator 4.1
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
@@ -13,7 +13,7 @@ from PyQt4 import QtCore, QtGui
|
||||
class Ui_NamingOptionsPage(object):
|
||||
def setupUi(self, NamingOptionsPage):
|
||||
NamingOptionsPage.setObjectName("NamingOptionsPage")
|
||||
NamingOptionsPage.resize(QtCore.QSize(QtCore.QRect(0,0,348,397).size()).expandedTo(NamingOptionsPage.minimumSizeHint()))
|
||||
NamingOptionsPage.resize(QtCore.QSize(QtCore.QRect(0,0,396,519).size()).expandedTo(NamingOptionsPage.minimumSizeHint()))
|
||||
|
||||
self.vboxlayout = QtGui.QVBoxLayout(NamingOptionsPage)
|
||||
self.vboxlayout.setMargin(9)
|
||||
@@ -102,8 +102,52 @@ class Ui_NamingOptionsPage(object):
|
||||
self.vboxlayout1.addWidget(self.delete_empty_dirs)
|
||||
self.vboxlayout.addWidget(self.move_files)
|
||||
|
||||
spacerItem = QtGui.QSpacerItem(330,20,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
|
||||
self.vboxlayout.addItem(spacerItem)
|
||||
self.groupBox = QtGui.QGroupBox(NamingOptionsPage)
|
||||
self.groupBox.setObjectName("groupBox")
|
||||
|
||||
self.gridlayout1 = QtGui.QGridLayout(self.groupBox)
|
||||
self.gridlayout1.setMargin(9)
|
||||
self.gridlayout1.setSpacing(2)
|
||||
self.gridlayout1.setObjectName("gridlayout1")
|
||||
|
||||
self.label = QtGui.QLabel(self.groupBox)
|
||||
self.label.setObjectName("label")
|
||||
self.gridlayout1.addWidget(self.label,0,0,1,2)
|
||||
|
||||
self.example_va_filename = QtGui.QLabel(self.groupBox)
|
||||
|
||||
font = QtGui.QFont(self.example_va_filename.font())
|
||||
font.setItalic(True)
|
||||
self.example_va_filename.setFont(font)
|
||||
self.example_va_filename.setTextFormat(QtCore.Qt.PlainText)
|
||||
self.example_va_filename.setWordWrap(True)
|
||||
self.example_va_filename.setObjectName("example_va_filename")
|
||||
self.gridlayout1.addWidget(self.example_va_filename,3,0,1,2)
|
||||
|
||||
self.label_5 = QtGui.QLabel(self.groupBox)
|
||||
self.label_5.setObjectName("label_5")
|
||||
self.gridlayout1.addWidget(self.label_5,2,0,1,2)
|
||||
|
||||
self.example_filename = QtGui.QLabel(self.groupBox)
|
||||
|
||||
font = QtGui.QFont(self.example_filename.font())
|
||||
font.setItalic(True)
|
||||
self.example_filename.setFont(font)
|
||||
self.example_filename.setTextFormat(QtCore.Qt.PlainText)
|
||||
self.example_filename.setWordWrap(True)
|
||||
self.example_filename.setObjectName("example_filename")
|
||||
self.gridlayout1.addWidget(self.example_filename,1,0,1,2)
|
||||
|
||||
spacerItem = QtGui.QSpacerItem(301,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
|
||||
self.gridlayout1.addItem(spacerItem,4,1,1,1)
|
||||
|
||||
self.test_button = QtGui.QPushButton(self.groupBox)
|
||||
self.test_button.setObjectName("test_button")
|
||||
self.gridlayout1.addWidget(self.test_button,4,0,1,1)
|
||||
self.vboxlayout.addWidget(self.groupBox)
|
||||
|
||||
spacerItem1 = QtGui.QSpacerItem(311,20,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
|
||||
self.vboxlayout.addItem(spacerItem1)
|
||||
self.label_4.setBuddy(self.va_file_naming_format)
|
||||
self.label_3.setBuddy(self.file_naming_format)
|
||||
self.label_2.setBuddy(self.move_files_to_browse)
|
||||
@@ -131,4 +175,8 @@ class Ui_NamingOptionsPage(object):
|
||||
self.move_files_to_browse.setText(_(u"Browse..."))
|
||||
self.move_additional_files.setText(_(u"Move additional files:"))
|
||||
self.delete_empty_dirs.setText(_(u"Delete empty directories"))
|
||||
self.groupBox.setTitle(_(u"Example"))
|
||||
self.label.setText(_(u"File name:"))
|
||||
self.label_5.setText(_(u"Multiple artist file name:"))
|
||||
self.test_button.setText(_(u"&Test"))
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>348</width>
|
||||
<height>397</height>
|
||||
<width>396</width>
|
||||
<height>519</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" >
|
||||
@@ -153,6 +153,91 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox" >
|
||||
<property name="title" >
|
||||
<string>Example</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<property name="margin" >
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item row="0" column="0" colspan="2" >
|
||||
<widget class="QLabel" name="label" >
|
||||
<property name="text" >
|
||||
<string>File name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2" >
|
||||
<widget class="QLabel" name="example_va_filename" >
|
||||
<property name="font" >
|
||||
<font>
|
||||
<italic>true</italic>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textFormat" >
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
<property name="wordWrap" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2" >
|
||||
<widget class="QLabel" name="label_5" >
|
||||
<property name="text" >
|
||||
<string>Multiple artist file name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2" >
|
||||
<widget class="QLabel" name="example_filename" >
|
||||
<property name="font" >
|
||||
<font>
|
||||
<italic>true</italic>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textFormat" >
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
<property name="wordWrap" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>301</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="4" column="0" >
|
||||
<widget class="QPushButton" name="test_button" >
|
||||
<property name="text" >
|
||||
<string>&Test</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
@@ -160,7 +245,7 @@
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<size>
|
||||
<width>330</width>
|
||||
<width>311</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
|
||||
Reference in New Issue
Block a user