Actually make RegExp-based file renaming work.

This commit is contained in:
LoRd_MuldeR 2015-05-09 23:33:07 +02:00
parent effb417eb5
commit e35aff3907
24 changed files with 3323 additions and 3171 deletions

View File

@ -89,6 +89,7 @@ document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'">'+e+'<\/'+'a'+'>');
// --> // -->
</script><noscript>&#122;&#x69;&#116;&#x79;&#x69;&#x73;&#x6f;&#102;&#116;&#32;&#x61;&#116;&#32;&#x67;&#x6d;&#x61;&#x69;&#108;&#32;&#100;&#x6f;&#116;&#32;&#x63;&#x6f;&#x6d;</noscript><br /></li> </script><noscript>&#122;&#x69;&#116;&#x79;&#x69;&#x73;&#x6f;&#102;&#116;&#32;&#x61;&#116;&#32;&#x67;&#x6d;&#x61;&#x69;&#108;&#32;&#100;&#x6f;&#116;&#32;&#x63;&#x6f;&#x6d;</noscript><br /></li>
<li>Added optional support for the <em>libfdk-aac</em> encoder, using the <a href="https://github.com/nu774/fdkaac">fdkaac</a> front-end by nu774<br /></li> <li>Added optional support for the <em>libfdk-aac</em> encoder, using the <a href="https://github.com/nu774/fdkaac">fdkaac</a> front-end by nu774<br /></li>
<li>Added enhanced file renaming options: Files can now be renamed based on <a href="http://www.regular-expressions.info/quickstart.html">regular expressions</a><br /></li>
<li>Updated MediaInfo to v0.7.73 (2015-04-09), compiled with ICL 15.0 and MSVC 12.0<br /></li> <li>Updated MediaInfo to v0.7.73 (2015-04-09), compiled with ICL 15.0 and MSVC 12.0<br /></li>
<li>Updated ALAC decoder to refalac v1.47 (2015-02-15), based on reference implementation by Apple<br /></li> <li>Updated ALAC decoder to refalac v1.47 (2015-02-15), based on reference implementation by Apple<br /></li>
<li>Fixed potential deadlock in Cue Sheet import dialog when &quot;Browse...&quot; button is clicked<br /></li> <li>Fixed potential deadlock in Cue Sheet import dialog when &quot;Browse...&quot; button is clicked<br /></li>

View File

@ -6,6 +6,7 @@
* Added Hungarian translation, thanks to Zityi's Translator Team <zityisoft@gmail.com> * Added Hungarian translation, thanks to Zityi's Translator Team <zityisoft@gmail.com>
* Added optional support for the *libfdk-aac* encoder, using the [fdkaac](https://github.com/nu774/fdkaac) front-end by nu774 * Added optional support for the *libfdk-aac* encoder, using the [fdkaac](https://github.com/nu774/fdkaac) front-end by nu774
* Added enhanced file renaming options: Files can now be renamed based on [regular expressions](http://www.regular-expressions.info/quickstart.html)
* Updated MediaInfo to v0.7.73 (2015-04-09), compiled with ICL 15.0 and MSVC 12.0 * Updated MediaInfo to v0.7.73 (2015-04-09), compiled with ICL 15.0 and MSVC 12.0
* Updated ALAC decoder to refalac v1.47 (2015-02-15), based on reference implementation by Apple * Updated ALAC decoder to refalac v1.47 (2015-02-15), based on reference implementation by Apple
* Fixed potential deadlock in Cue Sheet import dialog when "Browse..." button is clicked * Fixed potential deadlock in Cue Sheet import dialog when "Browse..." button is clicked

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -31,7 +31,7 @@
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_MainWindow.cpp" line="827"/> <location filename="../../src/Dialog_MainWindow.cpp" line="834"/>
<source>%n file(s) have been rejected, because read access was not granted!</source> <source>%n file(s) have been rejected, because read access was not granted!</source>
<translation> <translation>
<numerusform>%n file have been rejected, because read access was not granted!</numerusform> <numerusform>%n file have been rejected, because read access was not granted!</numerusform>
@ -39,7 +39,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_MainWindow.cpp" line="831"/> <location filename="../../src/Dialog_MainWindow.cpp" line="838"/>
<source>%n file(s) have been rejected, because they are dummy CDDA files!</source> <source>%n file(s) have been rejected, because they are dummy CDDA files!</source>
<translation> <translation>
<numerusform>%n file have been rejected, because they are dummy CDDA files!</numerusform> <numerusform>%n file have been rejected, because they are dummy CDDA files!</numerusform>
@ -47,7 +47,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_MainWindow.cpp" line="835"/> <location filename="../../src/Dialog_MainWindow.cpp" line="842"/>
<source>%n file(s) have been rejected, because they appear to be Cue Sheet images!</source> <source>%n file(s) have been rejected, because they appear to be Cue Sheet images!</source>
<translation> <translation>
<numerusform>%n file have been rejected, because they appear to be Cue Sheet images!</numerusform> <numerusform>%n file have been rejected, because they appear to be Cue Sheet images!</numerusform>
@ -55,7 +55,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_MainWindow.cpp" line="839"/> <location filename="../../src/Dialog_MainWindow.cpp" line="846"/>
<source>%n file(s) have been rejected, because the file format could not be recognized!</source> <source>%n file(s) have been rejected, because the file format could not be recognized!</source>
<translation> <translation>
<numerusform>%n file have been rejected, because the file format could not be recognized!</numerusform> <numerusform>%n file have been rejected, because the file format could not be recognized!</numerusform>
@ -63,7 +63,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_MainWindow.cpp" line="3986"/> <location filename="../../src/Dialog_MainWindow.cpp" line="4083"/>
<source>%n Instance(s)</source> <source>%n Instance(s)</source>
<translation> <translation>
<numerusform>%n Instance</numerusform> <numerusform>%n Instance</numerusform>
@ -74,7 +74,7 @@
<context> <context>
<name>ProcessingDialog</name> <name>ProcessingDialog</name>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="667"/> <location filename="../../src/Dialog_Processing.cpp" line="671"/>
<source>Encoding: %n file(s) of %1 completed so far, please wait...</source> <source>Encoding: %n file(s) of %1 completed so far, please wait...</source>
<translation> <translation>
<numerusform>Encoding: %n file of %1 completed so far, please wait...</numerusform> <numerusform>Encoding: %n file of %1 completed so far, please wait...</numerusform>
@ -82,7 +82,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="699"/> <location filename="../../src/Dialog_Processing.cpp" line="703"/>
<source>Process was aborted by the user after %n file(s)!</source> <source>Process was aborted by the user after %n file(s)!</source>
<translation> <translation>
<numerusform>Process was aborted by the user after %n file!</numerusform> <numerusform>Process was aborted by the user after %n file!</numerusform>
@ -90,7 +90,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="720"/> <location filename="../../src/Dialog_Processing.cpp" line="724"/>
<source>Error: %1 of %n file(s) failed (%2). Double-click failed items for detailed information!</source> <source>Error: %1 of %n file(s) failed (%2). Double-click failed items for detailed information!</source>
<translation> <translation>
<numerusform>Error: %1 of %n file failed (%2). Double-click failed items for detailed information!</numerusform> <numerusform>Error: %1 of %n file failed (%2). Double-click failed items for detailed information!</numerusform>
@ -98,7 +98,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="720"/> <location filename="../../src/Dialog_Processing.cpp" line="724"/>
<source>%n file(s) skipped</source> <source>%n file(s) skipped</source>
<translation> <translation>
<numerusform>%n file skipped</numerusform> <numerusform>%n file skipped</numerusform>
@ -106,7 +106,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="724"/> <location filename="../../src/Dialog_Processing.cpp" line="728"/>
<source>Error: %1 of %n file(s) failed. Double-click failed items for detailed information!</source> <source>Error: %1 of %n file(s) failed. Double-click failed items for detailed information!</source>
<translation> <translation>
<numerusform>Error: %1 of %n file failed. Double-click failed items for detailed information!</numerusform> <numerusform>Error: %1 of %n file failed. Double-click failed items for detailed information!</numerusform>
@ -114,7 +114,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="738"/> <location filename="../../src/Dialog_Processing.cpp" line="742"/>
<source>All files completed successfully. Skipped %n file(s).</source> <source>All files completed successfully. Skipped %n file(s).</source>
<translation> <translation>
<numerusform>All files completed successfully. Skipped %n file.</numerusform> <numerusform>All files completed successfully. Skipped %n file.</numerusform>
@ -122,7 +122,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="1157"/> <location filename="../../src/Dialog_Processing.cpp" line="1161"/>
<source>%n hour(s)</source> <source>%n hour(s)</source>
<translation> <translation>
<numerusform>%n hour</numerusform> <numerusform>%n hour</numerusform>
@ -130,8 +130,8 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="1158"/>
<location filename="../../src/Dialog_Processing.cpp" line="1162"/> <location filename="../../src/Dialog_Processing.cpp" line="1162"/>
<location filename="../../src/Dialog_Processing.cpp" line="1166"/>
<source>%n minute(s)</source> <source>%n minute(s)</source>
<translation> <translation>
<numerusform>%n minute</numerusform> <numerusform>%n minute</numerusform>
@ -139,8 +139,8 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="1163"/>
<location filename="../../src/Dialog_Processing.cpp" line="1167"/> <location filename="../../src/Dialog_Processing.cpp" line="1167"/>
<location filename="../../src/Dialog_Processing.cpp" line="1171"/>
<source>%n second(s)</source> <source>%n second(s)</source>
<translation> <translation>
<numerusform>%n second</numerusform> <numerusform>%n second</numerusform>
@ -148,7 +148,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../src/Dialog_Processing.cpp" line="1168"/> <location filename="../../src/Dialog_Processing.cpp" line="1172"/>
<source>%n millisecond(s)</source> <source>%n millisecond(s)</source>
<translation> <translation>
<numerusform>%n millisecond</numerusform> <numerusform>%n millisecond</numerusform>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -34,8 +34,8 @@
#define VER_LAMEXP_MINOR_HI 1 #define VER_LAMEXP_MINOR_HI 1
#define VER_LAMEXP_MINOR_LO 2 #define VER_LAMEXP_MINOR_LO 2
#define VER_LAMEXP_TYPE Alpha #define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 1 #define VER_LAMEXP_PATCH 2
#define VER_LAMEXP_BUILD 1723 #define VER_LAMEXP_BUILD 1725
#define VER_LAMEXP_CONFG 1700 #define VER_LAMEXP_CONFG 1700
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -487,20 +487,23 @@ MainWindow::MainWindow(MUtils::IPCChannel *const ipcChannel, FileListModel *cons
SET_CHECKBOX_STATE(ui->checkBoxNormalizationFilterCoupled, m_settings->normalizationFilterCoupled()); SET_CHECKBOX_STATE(ui->checkBoxNormalizationFilterCoupled, m_settings->normalizationFilterCoupled());
SET_CHECKBOX_STATE(ui->checkBoxAutoDetectInstances, (m_settings->maximumInstances() < 1)); SET_CHECKBOX_STATE(ui->checkBoxAutoDetectInstances, (m_settings->maximumInstances() < 1));
SET_CHECKBOX_STATE(ui->checkBoxUseSystemTempFolder, (!m_settings->customTempPathEnabled())); SET_CHECKBOX_STATE(ui->checkBoxUseSystemTempFolder, (!m_settings->customTempPathEnabled()));
SET_CHECKBOX_STATE(ui->checkBoxRename_Rename, m_settings->renameOutputFilesEnabled()); SET_CHECKBOX_STATE(ui->checkBoxRename_Rename, m_settings->renameFiles_renameEnabled());
SET_CHECKBOX_STATE(ui->checkBoxRename_RegExp, m_settings->renameFiles_regExpEnabled());
SET_CHECKBOX_STATE(ui->checkBoxForceStereoDownmix, m_settings->forceStereoDownmix()); SET_CHECKBOX_STATE(ui->checkBoxForceStereoDownmix, m_settings->forceStereoDownmix());
SET_CHECKBOX_STATE(ui->checkBoxOpusDisableResample, m_settings->opusDisableResample()); SET_CHECKBOX_STATE(ui->checkBoxOpusDisableResample, m_settings->opusDisableResample());
ui->checkBoxNeroAAC2PassMode->setEnabled(aacEncoder == SettingsModel::AAC_ENCODER_NERO); ui->checkBoxNeroAAC2PassMode->setEnabled(aacEncoder == SettingsModel::AAC_ENCODER_NERO);
ui->lineEditCustomParamLAME ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::MP3Encoder)); ui->lineEditCustomParamLAME ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::MP3Encoder));
ui->lineEditCustomParamOggEnc ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::VorbisEncoder)); ui->lineEditCustomParamOggEnc ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::VorbisEncoder));
ui->lineEditCustomParamNeroAAC->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::AACEncoder)); ui->lineEditCustomParamNeroAAC ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::AACEncoder));
ui->lineEditCustomParamFLAC ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::FLACEncoder)); ui->lineEditCustomParamFLAC ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::FLACEncoder));
ui->lineEditCustomParamAften ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::AC3Encoder)); ui->lineEditCustomParamAften ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::AC3Encoder));
ui->lineEditCustomParamOpus ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::OpusEncoder)); ui->lineEditCustomParamOpus ->setText(EncoderRegistry::loadEncoderCustomParams(m_settings, SettingsModel::OpusEncoder));
ui->lineEditCustomTempFolder ->setText(QDir::toNativeSeparators(m_settings->customTempPath())); ui->lineEditCustomTempFolder ->setText(QDir::toNativeSeparators(m_settings->customTempPath()));
ui->lineEditRenamePattern ->setText(m_settings->renameOutputFilesPattern()); ui->lineEditRenamePattern ->setText(m_settings->renameFiles_renamePattern());
ui->lineEditRenameRegExp_Search ->setText(m_settings->renameFiles_regExpSearch ());
ui->lineEditRenameRegExp_Replace->setText(m_settings->renameFiles_regExpReplace());
m_evenFilterCustumParamsHelp = new CustomEventFilter(); m_evenFilterCustumParamsHelp = new CustomEventFilter();
ui->helpCustomParamLAME->installEventFilter(m_evenFilterCustumParamsHelp); ui->helpCustomParamLAME->installEventFilter(m_evenFilterCustumParamsHelp);
@ -553,9 +556,13 @@ MainWindow::MainWindow(MUtils::IPCChannel *const ipcChannel, FileListModel *cons
connect(ui->checkBoxUseSystemTempFolder, SIGNAL(clicked(bool)), this, SLOT(useCustomTempFolderChanged(bool))); connect(ui->checkBoxUseSystemTempFolder, SIGNAL(clicked(bool)), this, SLOT(useCustomTempFolderChanged(bool)));
connect(ui->buttonResetAdvancedOptions, SIGNAL(clicked()), this, SLOT(resetAdvancedOptionsButtonClicked())); connect(ui->buttonResetAdvancedOptions, SIGNAL(clicked()), this, SLOT(resetAdvancedOptionsButtonClicked()));
connect(ui->checkBoxRename_Rename, SIGNAL(clicked(bool)), this, SLOT(renameOutputEnabledChanged(bool))); connect(ui->checkBoxRename_Rename, SIGNAL(clicked(bool)), this, SLOT(renameOutputEnabledChanged(bool)));
connect(ui->checkBoxRename_RegExp, SIGNAL(clicked(bool)), this, SLOT(renameOutputEnabledChanged(bool))); connect(ui->checkBoxRename_RegExp, SIGNAL(clicked(bool)), this, SLOT(renameRegExpEnabledChanged(bool)));
connect(ui->lineEditRenamePattern, SIGNAL(editingFinished()), this, SLOT(renameOutputPatternChanged())); connect(ui->lineEditRenamePattern, SIGNAL(editingFinished()), this, SLOT(renameOutputPatternChanged()));
connect(ui->lineEditRenamePattern, SIGNAL(textChanged(QString)), this, SLOT(renameOutputPatternChanged(QString))); connect(ui->lineEditRenamePattern, SIGNAL(textChanged(QString)), this, SLOT(renameOutputPatternChanged(QString)));
connect(ui->lineEditRenameRegExp_Search, SIGNAL(editingFinished()), this, SLOT(renameRegExpValueChanged()));
connect(ui->lineEditRenameRegExp_Search, SIGNAL(textChanged(QString)), this, SLOT(renameRegExpSearchChanged(QString)));
connect(ui->lineEditRenameRegExp_Replace, SIGNAL(editingFinished()), this, SLOT(renameRegExpValueChanged()));
connect(ui->lineEditRenameRegExp_Replace, SIGNAL(textChanged(QString)), this, SLOT(renameRegExpReplaceChanged(QString)));
connect(ui->labelShowRenameMacros, SIGNAL(linkActivated(QString)), this, SLOT(showRenameMacros(QString))); connect(ui->labelShowRenameMacros, SIGNAL(linkActivated(QString)), this, SLOT(showRenameMacros(QString)));
connect(ui->labelShowRegExpHelp, SIGNAL(linkActivated(QString)), this, SLOT(showRenameMacros(QString))); connect(ui->labelShowRegExpHelp, SIGNAL(linkActivated(QString)), this, SLOT(showRenameMacros(QString)));
connect(ui->checkBoxForceStereoDownmix, SIGNAL(clicked(bool)), this, SLOT(forceStereoDownmixEnabledChanged(bool))); connect(ui->checkBoxForceStereoDownmix, SIGNAL(clicked(bool)), this, SLOT(forceStereoDownmixEnabledChanged(bool)));
@ -1140,6 +1147,8 @@ void MainWindow::changeEvent(QEvent *e)
updateLameAlgoQuality(ui->sliderLameAlgoQuality->value()); updateLameAlgoQuality(ui->sliderLameAlgoQuality->value());
updateMaximumInstances(ui->sliderMaxInstances->value()); updateMaximumInstances(ui->sliderMaxInstances->value());
renameOutputPatternChanged(ui->lineEditRenamePattern->text(), true); renameOutputPatternChanged(ui->lineEditRenamePattern->text(), true);
renameRegExpSearchChanged (ui->lineEditRenameRegExp_Search ->text(), true);
renameRegExpReplaceChanged(ui->lineEditRenameRegExp_Replace->text(), true);
//Re-install shell integration //Re-install shell integration
if(m_settings->shellIntegrationEnabled()) if(m_settings->shellIntegrationEnabled())
@ -3887,9 +3896,9 @@ void MainWindow::renameButtonClicked(bool checked)
/* /*
* Rename output files enabled changed * Rename output files enabled changed
*/ */
void MainWindow::renameOutputEnabledChanged(bool checked) void MainWindow::renameOutputEnabledChanged(const bool &checked)
{ {
m_settings->renameOutputFilesEnabled(checked); m_settings->renameFiles_renameEnabled(checked);
} }
/* /*
@ -3898,14 +3907,14 @@ void MainWindow::renameOutputEnabledChanged(bool checked)
void MainWindow::renameOutputPatternChanged(void) void MainWindow::renameOutputPatternChanged(void)
{ {
QString temp = ui->lineEditRenamePattern->text().simplified(); QString temp = ui->lineEditRenamePattern->text().simplified();
ui->lineEditRenamePattern->setText(temp.isEmpty() ? m_settings->renameOutputFilesPatternDefault() : temp); ui->lineEditRenamePattern->setText(temp.isEmpty() ? m_settings->renameFiles_renamePatternDefault() : temp);
m_settings->renameOutputFilesPattern(ui->lineEditRenamePattern->text()); m_settings->renameFiles_renamePattern(ui->lineEditRenamePattern->text());
} }
/* /*
* Rename output files patterm changed * Rename output files patterm changed
*/ */
void MainWindow::renameOutputPatternChanged(const QString &text, bool silent) void MainWindow::renameOutputPatternChanged(const QString &text, const bool &silent)
{ {
QString pattern(text.simplified()); QString pattern(text.simplified());
@ -3939,6 +3948,94 @@ void MainWindow::renameOutputPatternChanged(const QString &text, bool silent)
ui->labelRanameExample->setText(patternClean); ui->labelRanameExample->setText(patternClean);
} }
/*
* Regular expression enabled changed
*/
void MainWindow::renameRegExpEnabledChanged(const bool &checked)
{
m_settings->renameFiles_regExpEnabled(checked);
}
/*
* Regular expression value has changed
*/
void MainWindow::renameRegExpValueChanged(void)
{
const QString search = ui->lineEditRenameRegExp_Search->text() .trimmed();
const QString replace = ui->lineEditRenameRegExp_Replace->text().simplified();
ui->lineEditRenameRegExp_Search ->setText(search.isEmpty() ? m_settings->renameFiles_regExpSearchDefault() : search);
ui->lineEditRenameRegExp_Replace->setText(replace.isEmpty() ? m_settings->renameFiles_regExpReplaceDefault() : replace);
m_settings->renameFiles_regExpSearch (ui->lineEditRenameRegExp_Search ->text());
m_settings->renameFiles_regExpReplace(ui->lineEditRenameRegExp_Replace->text());
}
/*
* Regular expression search pattern has changed
*/
void MainWindow::renameRegExpSearchChanged(const QString &text, const bool &silent)
{
const QString pattern(text.trimmed());
if((!pattern.isEmpty()) && (!QRegExp(pattern.trimmed()).isValid()))
{
if(ui->lineEditRenameRegExp_Search->palette().color(QPalette::Text) != Qt::red)
{
if(!silent) MUtils::Sound::beep(MUtils::Sound::BEEP_ERR);
SET_TEXT_COLOR(ui->lineEditRenameRegExp_Search, Qt::red);
}
}
else
{
if(ui->lineEditRenameRegExp_Search->palette() != QPalette())
{
if(!silent) MUtils::Sound::beep(MUtils::Sound::BEEP_NFO);
ui->lineEditRenameRegExp_Search->setPalette(QPalette());
}
}
renameRegExpReplaceChanged(ui->lineEditRenameRegExp_Replace->text(), silent);
}
/*
* Regular expression replacement string changed
*/
void MainWindow::renameRegExpReplaceChanged(const QString &text, const bool &silent)
{
QString replacement(text.simplified());
const QString search(ui->lineEditRenameRegExp_Search->text().trimmed());
if(!search.isEmpty())
{
const QRegExp regexp(search);
if(regexp.isValid())
{
const int count = regexp.captureCount();
const QString blank;
for(int i = 0; i < count; i++)
{
replacement.replace(QString("\\%0").arg(QString::number(i+1)), blank);
}
}
}
if(replacement.compare(MUtils::clean_file_name(replacement)))
{
if(ui->lineEditRenameRegExp_Replace->palette().color(QPalette::Text) != Qt::red)
{
if(!silent) MUtils::Sound::beep(MUtils::Sound::BEEP_ERR);
SET_TEXT_COLOR(ui->lineEditRenameRegExp_Replace, Qt::red);
}
}
else
{
if(ui->lineEditRenameRegExp_Replace->palette() != QPalette())
{
if(!silent) MUtils::Sound::beep(MUtils::Sound::BEEP_NFO);
ui->lineEditRenameRegExp_Replace->setPalette(QPalette());
}
}
}
/* /*
* Show list of rename macros * Show list of rename macros
*/ */
@ -3946,7 +4043,7 @@ void MainWindow::showRenameMacros(const QString &text)
{ {
if(text.compare("reset", Qt::CaseInsensitive) == 0) if(text.compare("reset", Qt::CaseInsensitive) == 0)
{ {
ui->lineEditRenamePattern->setText(m_settings->renameOutputFilesPatternDefault()); ui->lineEditRenamePattern->setText(m_settings->renameFiles_renamePatternDefault());
return; return;
} }
@ -4192,24 +4289,30 @@ void MainWindow::resetAdvancedOptionsButtonClicked(void)
SET_CHECKBOX_STATE(ui->checkBoxAutoDetectInstances, (m_settings->maximumInstancesDefault() < 1)); SET_CHECKBOX_STATE(ui->checkBoxAutoDetectInstances, (m_settings->maximumInstancesDefault() < 1));
SET_CHECKBOX_STATE(ui->checkBoxUseSystemTempFolder, (!m_settings->customTempPathEnabledDefault())); SET_CHECKBOX_STATE(ui->checkBoxUseSystemTempFolder, (!m_settings->customTempPathEnabledDefault()));
SET_CHECKBOX_STATE(ui->checkBoxAftenFastAllocation, m_settings->aftenFastBitAllocationDefault()); SET_CHECKBOX_STATE(ui->checkBoxAftenFastAllocation, m_settings->aftenFastBitAllocationDefault());
SET_CHECKBOX_STATE(ui->checkBoxRename_Rename, m_settings->renameOutputFilesEnabledDefault()); SET_CHECKBOX_STATE(ui->checkBoxRename_Rename, m_settings->renameFiles_renameEnabledDefault());
SET_CHECKBOX_STATE(ui->checkBoxRename_RegExp, m_settings->renameFiles_regExpEnabledDefault());
SET_CHECKBOX_STATE(ui->checkBoxForceStereoDownmix, m_settings->forceStereoDownmixDefault()); SET_CHECKBOX_STATE(ui->checkBoxForceStereoDownmix, m_settings->forceStereoDownmixDefault());
SET_CHECKBOX_STATE(ui->checkBoxOpusDisableResample, m_settings->opusDisableResampleDefault()); SET_CHECKBOX_STATE(ui->checkBoxOpusDisableResample, m_settings->opusDisableResampleDefault());
ui->lineEditCustomParamLAME ->setText(m_settings->customParametersLAMEDefault()); ui->lineEditCustomParamLAME ->setText(m_settings->customParametersLAMEDefault());
ui->lineEditCustomParamOggEnc ->setText(m_settings->customParametersOggEncDefault()); ui->lineEditCustomParamOggEnc ->setText(m_settings->customParametersOggEncDefault());
ui->lineEditCustomParamNeroAAC->setText(m_settings->customParametersAacEncDefault()); ui->lineEditCustomParamNeroAAC ->setText(m_settings->customParametersAacEncDefault());
ui->lineEditCustomParamFLAC ->setText(m_settings->customParametersFLACDefault()); ui->lineEditCustomParamFLAC ->setText(m_settings->customParametersFLACDefault());
ui->lineEditCustomParamOpus ->setText(m_settings->customParametersOpusEncDefault()); ui->lineEditCustomParamOpus ->setText(m_settings->customParametersOpusEncDefault());
ui->lineEditCustomTempFolder ->setText(QDir::toNativeSeparators(m_settings->customTempPathDefault())); ui->lineEditCustomTempFolder ->setText(QDir::toNativeSeparators(m_settings->customTempPathDefault()));
ui->lineEditRenamePattern ->setText(m_settings->renameOutputFilesPatternDefault()); ui->lineEditRenamePattern ->setText(m_settings->renameFiles_renamePatternDefault());
ui->lineEditRenameRegExp_Search ->setText(m_settings->renameFiles_regExpSearchDefault());
ui->lineEditRenameRegExp_Replace->setText(m_settings->renameFiles_regExpReplaceDefault());
if(m_settings->overwriteModeDefault() == SettingsModel::Overwrite_KeepBoth) ui->radioButtonOverwriteModeKeepBoth->click(); if(m_settings->overwriteModeDefault() == SettingsModel::Overwrite_KeepBoth) ui->radioButtonOverwriteModeKeepBoth->click();
if(m_settings->overwriteModeDefault() == SettingsModel::Overwrite_SkipFile) ui->radioButtonOverwriteModeSkipFile->click(); if(m_settings->overwriteModeDefault() == SettingsModel::Overwrite_SkipFile) ui->radioButtonOverwriteModeSkipFile->click();
if(m_settings->overwriteModeDefault() == SettingsModel::Overwrite_Replaces) ui->radioButtonOverwriteModeReplaces->click(); if(m_settings->overwriteModeDefault() == SettingsModel::Overwrite_Replaces) ui->radioButtonOverwriteModeReplaces->click();
customParamsChanged();
ui->scrollArea->verticalScrollBar()->setValue(0); ui->scrollArea->verticalScrollBar()->setValue(0);
ui->buttonRename_Rename->click();
customParamsChanged();
renameOutputPatternChanged();
renameRegExpValueChanged();
} }
// ========================================================= // =========================================================

View File

@ -152,9 +152,13 @@ private slots:
void refreshFolderContextActionTriggered(void); void refreshFolderContextActionTriggered(void);
void removeFileButtonClicked(void); void removeFileButtonClicked(void);
void renameButtonClicked(bool checked); void renameButtonClicked(bool checked);
void renameOutputEnabledChanged(bool checked); void renameOutputEnabledChanged(const bool &checked);
void renameOutputPatternChanged(void); void renameOutputPatternChanged(void);
void renameOutputPatternChanged(const QString &text, bool silent = false); void renameOutputPatternChanged(const QString &text, const bool &silent = false);
void renameRegExpEnabledChanged(const bool &checked);
void renameRegExpValueChanged(void);
void renameRegExpSearchChanged (const QString &text, const bool &silent = false);
void renameRegExpReplaceChanged(const QString &text, const bool &silent = false);
void resetAdvancedOptionsButtonClicked(void); void resetAdvancedOptionsButtonClicked(void);
void restoreCursor(void); void restoreCursor(void);
void samplingRateChanged(int value); void samplingRateChanged(int value);

View File

@ -616,9 +616,13 @@ void ProcessingDialog::startNextJob(void)
{ {
thread->addFilter(new NormalizeFilter(m_settings->normalizationFilterMaxVolume(), m_settings->normalizationFilterDynamic(), m_settings->normalizationFilterCoupled(), m_settings->normalizationFilterSize())); thread->addFilter(new NormalizeFilter(m_settings->normalizationFilterMaxVolume(), m_settings->normalizationFilterDynamic(), m_settings->normalizationFilterCoupled(), m_settings->normalizationFilterSize()));
} }
if(m_settings->renameOutputFilesEnabled() && (!m_settings->renameOutputFilesPattern().simplified().isEmpty())) if(m_settings->renameFiles_renameEnabled() && (!m_settings->renameFiles_renamePattern().simplified().isEmpty()))
{ {
thread->setRenamePattern(m_settings->renameOutputFilesPattern()); thread->setRenamePattern(m_settings->renameFiles_renamePattern());
}
if(m_settings->renameFiles_regExpEnabled() && (!m_settings->renameFiles_regExpSearch().trimmed().isEmpty()) && (!m_settings->renameFiles_regExpReplace().simplified().isEmpty()))
{
thread->setRenameRegExp(m_settings->renameFiles_regExpSearch(), m_settings->renameFiles_regExpReplace());
} }
if(m_settings->overwriteMode() != SettingsModel::Overwrite_KeepBoth) if(m_settings->overwriteMode() != SettingsModel::Overwrite_KeepBoth)
{ {

View File

@ -274,8 +274,11 @@ LAMEXP_MAKE_ID(outputDir, "OutputDirectory/SelectedPath");
LAMEXP_MAKE_ID(outputToSourceDir, "OutputDirectory/OutputToSourceFolder"); LAMEXP_MAKE_ID(outputToSourceDir, "OutputDirectory/OutputToSourceFolder");
LAMEXP_MAKE_ID(overwriteMode, "AdvancedOptions/OverwriteMode"); LAMEXP_MAKE_ID(overwriteMode, "AdvancedOptions/OverwriteMode");
LAMEXP_MAKE_ID(prependRelativeSourcePath, "OutputDirectory/PrependRelativeSourcePath"); LAMEXP_MAKE_ID(prependRelativeSourcePath, "OutputDirectory/PrependRelativeSourcePath");
LAMEXP_MAKE_ID(renameOutputFilesEnabled, "AdvancedOptions/RenameOutputFiles/Enabled"); LAMEXP_MAKE_ID(renameFiles_regExpEnabled, "AdvancedOptions/RenameOutputFiles/RegExp/Enabled");
LAMEXP_MAKE_ID(renameOutputFilesPattern, "AdvancedOptions/RenameOutputFiles/Pattern"); LAMEXP_MAKE_ID(renameFiles_regExpSearch, "AdvancedOptions/RenameOutputFiles/RegExp/SearchPattern");
LAMEXP_MAKE_ID(renameFiles_regExpReplace, "AdvancedOptions/RenameOutputFiles/RegExp/Replacement");
LAMEXP_MAKE_ID(renameFiles_renameEnabled, "AdvancedOptions/RenameOutputFiles/Rename/Enabled");
LAMEXP_MAKE_ID(renameFiles_renamePattern, "AdvancedOptions/RenameOutputFiles/Rename/Pattern");
LAMEXP_MAKE_ID(samplingRate, "AdvancedOptions/Common/Resampling"); LAMEXP_MAKE_ID(samplingRate, "AdvancedOptions/Common/Resampling");
LAMEXP_MAKE_ID(shellIntegrationEnabled, "Flags/EnableShellIntegration"); LAMEXP_MAKE_ID(shellIntegrationEnabled, "Flags/EnableShellIntegration");
LAMEXP_MAKE_ID(slowStartup, "Flags/SlowStartupDetected"); LAMEXP_MAKE_ID(slowStartup, "Flags/SlowStartupDetected");
@ -652,8 +655,11 @@ LAMEXP_MAKE_OPTION_S(outputDir, defaultDirectory())
LAMEXP_MAKE_OPTION_B(outputToSourceDir, false) LAMEXP_MAKE_OPTION_B(outputToSourceDir, false)
LAMEXP_MAKE_OPTION_I(overwriteMode, Overwrite_KeepBoth) LAMEXP_MAKE_OPTION_I(overwriteMode, Overwrite_KeepBoth)
LAMEXP_MAKE_OPTION_B(prependRelativeSourcePath, false) LAMEXP_MAKE_OPTION_B(prependRelativeSourcePath, false)
LAMEXP_MAKE_OPTION_B(renameOutputFilesEnabled, false) LAMEXP_MAKE_OPTION_B(renameFiles_regExpEnabled, false)
LAMEXP_MAKE_OPTION_S(renameOutputFilesPattern, "[<TrackNo>] <Artist> - <Title>") LAMEXP_MAKE_OPTION_S(renameFiles_regExpSearch, QString())
LAMEXP_MAKE_OPTION_S(renameFiles_regExpReplace, QString())
LAMEXP_MAKE_OPTION_B(renameFiles_renameEnabled, false)
LAMEXP_MAKE_OPTION_S(renameFiles_renamePattern, "[<TrackNo>] <Artist> - <Title>")
LAMEXP_MAKE_OPTION_I(samplingRate, 0) LAMEXP_MAKE_OPTION_I(samplingRate, 0)
LAMEXP_MAKE_OPTION_B(shellIntegrationEnabled, !lamexp_version_portable()) LAMEXP_MAKE_OPTION_B(shellIntegrationEnabled, !lamexp_version_portable())
LAMEXP_MAKE_OPTION_B(slowStartup, false) LAMEXP_MAKE_OPTION_B(slowStartup, false)

View File

@ -192,8 +192,11 @@ public:
LAMEXP_MAKE_OPTION_B(outputToSourceDir) LAMEXP_MAKE_OPTION_B(outputToSourceDir)
LAMEXP_MAKE_OPTION_I(overwriteMode) LAMEXP_MAKE_OPTION_I(overwriteMode)
LAMEXP_MAKE_OPTION_B(prependRelativeSourcePath) LAMEXP_MAKE_OPTION_B(prependRelativeSourcePath)
LAMEXP_MAKE_OPTION_B(renameOutputFilesEnabled) LAMEXP_MAKE_OPTION_B(renameFiles_regExpEnabled)
LAMEXP_MAKE_OPTION_S(renameOutputFilesPattern) LAMEXP_MAKE_OPTION_S(renameFiles_regExpSearch)
LAMEXP_MAKE_OPTION_S(renameFiles_regExpReplace)
LAMEXP_MAKE_OPTION_B(renameFiles_renameEnabled)
LAMEXP_MAKE_OPTION_S(renameFiles_renamePattern)
LAMEXP_MAKE_OPTION_I(samplingRate) LAMEXP_MAKE_OPTION_I(samplingRate)
LAMEXP_MAKE_OPTION_B(shellIntegrationEnabled) LAMEXP_MAKE_OPTION_B(shellIntegrationEnabled)
LAMEXP_MAKE_OPTION_B(slowStartup) LAMEXP_MAKE_OPTION_B(slowStartup)

View File

@ -380,7 +380,7 @@ int ProcessThread::generateOutFileName(QString &outFileName)
outFileName.clear(); outFileName.clear();
//Make sure the source file exists //Make sure the source file exists
QFileInfo sourceFile(m_audioFile.filePath()); const QFileInfo sourceFile(m_audioFile.filePath());
if(!(sourceFile.exists() && sourceFile.isFile())) if(!(sourceFile.exists() && sourceFile.isFile()))
{ {
handleMessage(QString("%1\n%2").arg(tr("The source audio file could not be found:"), sourceFile.absoluteFilePath())); handleMessage(QString("%1\n%2").arg(tr("The source audio file could not be found:"), sourceFile.absoluteFilePath()));
@ -399,7 +399,7 @@ int ProcessThread::generateOutFileName(QString &outFileName)
readTest.close(); readTest.close();
} }
QString baseName = sourceFile.completeBaseName(); const QString baseName = sourceFile.completeBaseName();
QDir targetDir(m_outputDirectory.isEmpty() ? sourceFile.canonicalPath() : m_outputDirectory); QDir targetDir(m_outputDirectory.isEmpty() ? sourceFile.canonicalPath() : m_outputDirectory);
//Prepend relative source file path? //Prepend relative source file path?
@ -437,7 +437,7 @@ int ProcessThread::generateOutFileName(QString &outFileName)
} }
//Apply rename pattern //Apply rename pattern
QString fileName = applyRenamePattern(baseName, m_audioFile.metaInfo()); const QString fileName = MUtils::clean_file_name(applyRegularExpression(applyRenamePattern(baseName, m_audioFile.metaInfo())));
//Generate full output path //Generate full output path
outFileName = QString("%1/%2.%3").arg(targetDir.canonicalPath(), fileName, m_encoder->extension()); outFileName = QString("%1/%2.%3").arg(targetDir.canonicalPath(), fileName, m_encoder->extension());
@ -493,18 +493,34 @@ QString ProcessThread::applyRenamePattern(const QString &baseName, const AudioFi
{ {
QString fileName = m_renamePattern; QString fileName = m_renamePattern;
fileName.replace("<BaseName>", STRDEF(baseName, tr("Unknown File Name")), Qt::CaseInsensitive); fileName.replace("<BaseName>", STRDEF(baseName, tr("Unknown File Name")), Qt::CaseInsensitive);
fileName.replace("<TrackNo>", QString().sprintf("%02d", metaInfo.position()), Qt::CaseInsensitive); fileName.replace("<TrackNo>", QString().sprintf("%02d", metaInfo.position()), Qt::CaseInsensitive);
fileName.replace("<Title>", STRDEF(metaInfo.title(), tr("Unknown Title")) , Qt::CaseInsensitive); fileName.replace("<Title>", STRDEF(metaInfo.title(), tr("Unknown Title")) , Qt::CaseInsensitive);
fileName.replace("<Artist>", STRDEF(metaInfo.artist(), tr("Unknown Artist")), Qt::CaseInsensitive); fileName.replace("<Artist>", STRDEF(metaInfo.artist(), tr("Unknown Artist")), Qt::CaseInsensitive);
fileName.replace("<Album>", STRDEF(metaInfo.album(), tr("Unknown Album")), Qt::CaseInsensitive); fileName.replace("<Album>", STRDEF(metaInfo.album(), tr("Unknown Album")), Qt::CaseInsensitive);
fileName.replace("<Year>", QString().sprintf("%04d", metaInfo.year()), Qt::CaseInsensitive); fileName.replace("<Year>", QString().sprintf("%04d", metaInfo.year()), Qt::CaseInsensitive);
fileName.replace("<Comment>", STRDEF(metaInfo.comment(), tr("Unknown Comment")), Qt::CaseInsensitive); fileName.replace("<Comment>", STRDEF(metaInfo.comment(), tr("Unknown Comment")), Qt::CaseInsensitive);
fileName = MUtils::clean_file_name(fileName);
return fileName; return fileName;
} }
QString ProcessThread::applyRegularExpression(const QString &fileName)
{
if(m_renameRegExp_Search.isEmpty() || m_renameRegExp_Replace.isEmpty())
{
return fileName;
}
QRegExp regExp(m_renameRegExp_Search);
if(!regExp.isValid())
{
qWarning("Invalid regular expression detected -> cannot rename!");
return fileName;
}
return (QString(fileName).replace(regExp, m_renameRegExp_Replace));
}
QString ProcessThread::generateTempFileName(void) QString ProcessThread::generateTempFileName(void)
{ {
bool bOkay = false; bool bOkay = false;
@ -680,10 +696,20 @@ void ProcessThread::addFilter(AbstractFilter *filter)
void ProcessThread::setRenamePattern(const QString &pattern) void ProcessThread::setRenamePattern(const QString &pattern)
{ {
QString newPattern = pattern.simplified(); const QString newPattern = pattern.simplified();
if(!newPattern.isEmpty()) m_renamePattern = newPattern; if(!newPattern.isEmpty()) m_renamePattern = newPattern;
} }
void ProcessThread::setRenameRegExp(const QString &search, const QString &replace)
{
const QString newSearch = search.trimmed(), newReplace = replace.simplified();
if((!newSearch.isEmpty()) && (!newReplace.isEmpty()))
{
m_renameRegExp_Search = newSearch;
m_renameRegExp_Replace = newReplace;
}
}
void ProcessThread::setOverwriteMode(const bool &bSkipExistingFile, const bool &bReplacesExisting) void ProcessThread::setOverwriteMode(const bool &bSkipExistingFile, const bool &bReplacesExisting)
{ {
if(bSkipExistingFile && bReplacesExisting) if(bSkipExistingFile && bReplacesExisting)

View File

@ -47,6 +47,7 @@ public:
QUuid getId(void) { return m_jobId; } QUuid getId(void) { return m_jobId; }
void setRenamePattern(const QString &pattern); void setRenamePattern(const QString &pattern);
void setRenameRegExp(const QString &search, const QString &replace);
void setOverwriteMode(const bool &bSkipExistingFile, const bool &bReplacesExisting = false); void setOverwriteMode(const bool &bSkipExistingFile, const bool &bReplacesExisting = false);
void addFilter(AbstractFilter *filter); void addFilter(AbstractFilter *filter);
@ -87,6 +88,7 @@ private:
void processFile(); void processFile();
int generateOutFileName(QString &outFileName); int generateOutFileName(QString &outFileName);
QString applyRenamePattern(const QString &baseName, const AudioFileModel_MetaInfo &metaInfo); QString applyRenamePattern(const QString &baseName, const AudioFileModel_MetaInfo &metaInfo);
QString applyRegularExpression(const QString &fileName);
QString generateTempFileName(void); QString generateTempFileName(void);
void insertDownmixFilter(void); void insertDownmixFilter(void);
void insertDownsampleFilter(void); void insertDownsampleFilter(void);
@ -104,6 +106,8 @@ private:
const bool m_prependRelativeSourcePath; const bool m_prependRelativeSourcePath;
QList<AbstractFilter*> m_filters; QList<AbstractFilter*> m_filters;
QString m_renamePattern; QString m_renamePattern;
QString m_renameRegExp_Search;
QString m_renameRegExp_Replace;
int m_overwriteMode; int m_overwriteMode;
WaveProperties *m_propDetect; WaveProperties *m_propDetect;
QString m_outFileName; QString m_outFileName;