From 2a54cb17e786e84d5597530f82e347518ce95c48 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sat, 29 Dec 2018 15:37:16 +0100 Subject: [PATCH] Move organise files, add option to strip all non-fat characters --- src/CMakeLists.txt | 24 ++++----- src/collection/collectionview.cpp | 2 +- src/context/contextalbumsview.cpp | 2 +- src/core/mainwindow.cpp | 2 +- src/core/song.h | 1 + src/device/deviceview.cpp | 4 +- src/{core => organise}/organise.cpp | 6 +-- src/{core => organise}/organise.h | 0 src/{dialogs => organise}/organisedialog.cpp | 30 +++++------ src/{dialogs => organise}/organisedialog.h | 4 +- src/{dialogs => organise}/organisedialog.ui | 54 +++++++++---------- .../organiseerrordialog.cpp | 0 .../organiseerrordialog.h | 0 .../organiseerrordialog.ui | 0 src/{core => organise}/organiseformat.cpp | 43 +++++++-------- src/{core => organise}/organiseformat.h | 17 +++--- src/widgets/fileview.cpp | 2 +- 17 files changed, 96 insertions(+), 95 deletions(-) rename src/{core => organise}/organise.cpp (99%) rename src/{core => organise}/organise.h (100%) rename src/{dialogs => organise}/organisedialog.cpp (92%) rename src/{dialogs => organise}/organisedialog.h (97%) rename src/{dialogs => organise}/organisedialog.ui (91%) rename src/{dialogs => organise}/organiseerrordialog.cpp (100%) rename src/{dialogs => organise}/organiseerrordialog.h (100%) rename src/{dialogs => organise}/organiseerrordialog.ui (100%) rename src/{core => organise}/organiseformat.cpp (92%) rename src/{core => organise}/organiseformat.h (87%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c3b2a88c1..eb694cf0d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -771,11 +771,10 @@ optional_source(HAVE_LIBPULSE # MusicBrainz, Organise and transcode require GStreamer optional_source(HAVE_GSTREAMER SOURCES - core/organise.cpp - core/organiseformat.cpp - settings/transcodersettingspage.cpp - dialogs/organisedialog.cpp - dialogs/organiseerrordialog.cpp + organise/organise.cpp + organise/organiseformat.cpp + organise/organisedialog.cpp + organise/organiseerrordialog.cpp transcoder/transcoder.cpp transcoder/transcodedialog.cpp transcoder/transcoderoptionsaac.cpp @@ -786,19 +785,19 @@ SOURCES transcoder/transcoderoptionsspeex.cpp transcoder/transcoderoptionsvorbis.cpp transcoder/transcoderoptionswma.cpp + settings/transcodersettingspage.cpp HEADERS - core/organise.h - settings/transcodersettingspage.h - dialogs/organisedialog.h - dialogs/organiseerrordialog.h + organise/organise.h + organise/organisedialog.h + organise/organiseerrordialog.h transcoder/transcoder.h transcoder/transcodedialog.h transcoder/transcoderoptionsdialog.h transcoder/transcoderoptionsmp3.h + settings/transcodersettingspage.h UI - settings/transcodersettingspage.ui - dialogs/organisedialog.ui - dialogs/organiseerrordialog.ui + organise/organisedialog.ui + organise/organiseerrordialog.ui transcoder/transcodedialog.ui transcoder/transcodelogdialog.ui transcoder/transcoderoptionsaac.ui @@ -809,6 +808,7 @@ UI transcoder/transcoderoptionsspeex.ui transcoder/transcoderoptionsvorbis.ui transcoder/transcoderoptionswma.ui + settings/transcodersettingspage.ui ) # CDIO backend and device diff --git a/src/collection/collectionview.cpp b/src/collection/collectionview.cpp index a10232584..4a34d1806 100644 --- a/src/collection/collectionview.cpp +++ b/src/collection/collectionview.cpp @@ -74,7 +74,7 @@ #endif #include "dialogs/edittagdialog.h" #ifdef HAVE_GSTREAMER -#include "dialogs/organisedialog.h" +#include "organise/organisedialog.h" #endif #include "settings/collectionsettingspage.h" diff --git a/src/context/contextalbumsview.cpp b/src/context/contextalbumsview.cpp index 857eca67a..f805f3db8 100644 --- a/src/context/contextalbumsview.cpp +++ b/src/context/contextalbumsview.cpp @@ -74,7 +74,7 @@ #endif #include "dialogs/edittagdialog.h" #ifdef HAVE_GSTREAMER -#include "dialogs/organisedialog.h" +#include "organise/organisedialog.h" #endif #include "settings/collectionsettingspage.h" diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 44d0880dc..af096d7c0 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -85,7 +85,7 @@ #include "dialogs/trackselectiondialog.h" #include "dialogs/edittagdialog.h" #ifdef HAVE_GSTREAMER -# include "dialogs/organisedialog.h" +# include "organise/organisedialog.h" #endif #include "widgets/fancytabwidget.h" #include "widgets/playingwidget.h" diff --git a/src/core/song.h b/src/core/song.h index 39c4f8a3b..be201fe40 100644 --- a/src/core/song.h +++ b/src/core/song.h @@ -84,6 +84,7 @@ class Song { static const QString kEmbeddedCover; static const QRegExp kCoverRemoveDisc; + static const QRegExp kFilenameRemoveNonFatChars; static QString JoinSpec(const QString &table); diff --git a/src/device/deviceview.cpp b/src/device/deviceview.cpp index 1d5fe7bde..1da504884 100644 --- a/src/device/deviceview.cpp +++ b/src/device/deviceview.cpp @@ -57,8 +57,8 @@ #include "core/mergedproxymodel.h" #include "core/mimedata.h" #include "core/musicstorage.h" -#include "dialogs/organisedialog.h" -#include "dialogs/organiseerrordialog.h" +#include "organise/organisedialog.h" +#include "organise/organiseerrordialog.h" #include "collection/collectiondirectorymodel.h" #include "collection/collectionmodel.h" #include "collection/collectionview.h" diff --git a/src/core/organise.cpp b/src/organise/organise.cpp similarity index 99% rename from src/core/organise.cpp rename to src/organise/organise.cpp index f271e1952..30631656a 100644 --- a/src/core/organise.cpp +++ b/src/organise/organise.cpp @@ -31,9 +31,9 @@ #include #include "core/logging.h" -#include "utilities.h" -#include "taskmanager.h" -#include "musicstorage.h" +#include "core/utilities.h" +#include "core/taskmanager.h" +#include "core/musicstorage.h" #include "organise.h" #include "transcoder/transcoder.h" diff --git a/src/core/organise.h b/src/organise/organise.h similarity index 100% rename from src/core/organise.h rename to src/organise/organise.h diff --git a/src/dialogs/organisedialog.cpp b/src/organise/organisedialog.cpp similarity index 92% rename from src/dialogs/organisedialog.cpp rename to src/organise/organisedialog.cpp index 5a5488cf8..ad1ba015e 100644 --- a/src/dialogs/organisedialog.cpp +++ b/src/organise/organisedialog.cpp @@ -55,11 +55,11 @@ #include "core/closure.h" #include "core/iconloader.h" #include "core/musicstorage.h" -#include "core/organise.h" #include "core/tagreaderclient.h" #include "core/utilities.h" #include "widgets/freespacebar.h" #include "widgets/linetextedit.h" +#include "organise.h" #include "organisedialog.h" #include "organiseerrordialog.h" #include "ui_organisedialog.h" @@ -109,8 +109,8 @@ OrganiseDialog::OrganiseDialog(TaskManager *task_manager, QWidget *parent) connect(ui_->destination, SIGNAL(currentIndexChanged(int)), SLOT(UpdatePreviews())); connect(ui_->naming, SIGNAL(textChanged()), SLOT(UpdatePreviews())); - connect(ui_->replace_ascii, SIGNAL(toggled(bool)), SLOT(UpdatePreviews())); - connect(ui_->replace_the, SIGNAL(toggled(bool)), SLOT(UpdatePreviews())); + connect(ui_->remove_non_fat, SIGNAL(toggled(bool)), SLOT(UpdatePreviews())); + connect(ui_->remove_non_ascii, SIGNAL(toggled(bool)), SLOT(UpdatePreviews())); connect(ui_->replace_spaces, SIGNAL(toggled(bool)), SLOT(UpdatePreviews())); // Get the titles of the tags to put in the insert menu @@ -293,9 +293,9 @@ void OrganiseDialog::UpdatePreviews() { // Update the format object format_.set_format(ui_->naming->toPlainText()); - format_.set_replace_non_ascii(ui_->replace_ascii->isChecked()); + format_.set_remove_non_fat(ui_->remove_non_fat->isChecked()); + format_.set_remove_non_ascii(ui_->remove_non_ascii->isChecked()); format_.set_replace_spaces(ui_->replace_spaces->isChecked()); - format_.set_replace_the(ui_->replace_the->isChecked()); const bool format_valid = !has_local_destination || format_.IsValid(); @@ -310,8 +310,8 @@ void OrganiseDialog::UpdatePreviews() { // Update the previews ui_->preview->clear(); - ui_->preview_group->setVisible(has_local_destination); - ui_->naming_group->setVisible(has_local_destination); + ui_->groupbox_preview->setVisible(has_local_destination); + ui_->groupbox_naming->setVisible(has_local_destination); if (has_local_destination) { for (const Organise::NewSongInfo &song_info : new_songs_info_) { QString filename = storage->LocalPath() + "/" + song_info.new_filename_; @@ -330,9 +330,9 @@ QSize OrganiseDialog::sizeHint() const { return QSize(650, 0); } void OrganiseDialog::Reset() { ui_->naming->setPlainText(kDefaultFormat); - ui_->replace_ascii->setChecked(false); - ui_->replace_spaces->setChecked(false); - ui_->replace_the->setChecked(false); + ui_->remove_non_fat->setChecked(false); + ui_->remove_non_ascii->setChecked(false); + ui_->replace_spaces->setChecked(true); ui_->overwrite->setChecked(false); ui_->mark_as_listened->setChecked(false); ui_->eject_after->setChecked(false); @@ -346,9 +346,9 @@ void OrganiseDialog::showEvent(QShowEvent*) { QSettings s; s.beginGroup(kSettingsGroup); ui_->naming->setPlainText(s.value("format", kDefaultFormat).toString()); - ui_->replace_ascii->setChecked(s.value("replace_ascii", false).toBool()); - ui_->replace_spaces->setChecked(s.value("replace_spaces", false).toBool()); - ui_->replace_the->setChecked(s.value("replace_the", false).toBool()); + ui_->remove_non_fat->setChecked(s.value("remove_non_fat", false).toBool()); + ui_->remove_non_ascii->setChecked(s.value("remove_non_ascii", false).toBool()); + ui_->replace_spaces->setChecked(s.value("replace_spaces", true).toBool()); ui_->overwrite->setChecked(s.value("overwrite", false).toBool()); ui_->mark_as_listened->setChecked(s.value("mark_as_listened", false).toBool()); ui_->eject_after->setChecked(s.value("eject_after", false).toBool()); @@ -367,9 +367,9 @@ void OrganiseDialog::accept() { s.beginGroup(kSettingsGroup); s.setValue("format", ui_->naming->toPlainText()); - s.setValue("replace_ascii", ui_->replace_ascii->isChecked()); + s.setValue("remove_non_fat", ui_->remove_non_fat->isChecked()); + s.setValue("remove_non_ascii", ui_->remove_non_ascii->isChecked()); s.setValue("replace_spaces", ui_->replace_spaces->isChecked()); - s.setValue("replace_the", ui_->replace_the->isChecked()); s.setValue("overwrite", ui_->overwrite->isChecked()); s.setValue("mark_as_listened", ui_->overwrite->isChecked()); s.setValue("destination", ui_->destination->currentText()); diff --git a/src/dialogs/organisedialog.h b/src/organise/organisedialog.h similarity index 97% rename from src/dialogs/organisedialog.h rename to src/organise/organisedialog.h index d012e9cd0..243ff3922 100644 --- a/src/dialogs/organisedialog.h +++ b/src/organise/organisedialog.h @@ -40,8 +40,8 @@ #include #include "core/song.h" -#include "core/organise.h" -#include "core/organiseformat.h" +#include "organise.h" +#include "organiseformat.h" class QResizeEvent; class QShowEvent; diff --git a/src/dialogs/organisedialog.ui b/src/organise/organisedialog.ui similarity index 91% rename from src/dialogs/organisedialog.ui rename to src/organise/organisedialog.ui index d090395ff..dfef70fca 100644 --- a/src/dialogs/organisedialog.ui +++ b/src/organise/organisedialog.ui @@ -19,9 +19,9 @@ - + - + Destination @@ -31,7 +31,7 @@ - + After copying... @@ -57,14 +57,7 @@ - - - Safely remove the device after copying - - - - - + Naming options @@ -99,23 +92,23 @@ - + - Ignore "The" in artist names + Restrict to characters allowed on FAT filesystems + + + + + + + Restrict characters to ASCII - Replaces spaces with underscores - - - - - - - Restrict to ASCII characters + Replace spaces with underscores @@ -137,7 +130,7 @@ - + Preview @@ -145,7 +138,7 @@ - 0 + 1 @@ -187,7 +180,7 @@ 0 - + Qt::Horizontal @@ -207,7 +200,7 @@ - + Qt::Horizontal @@ -226,6 +219,13 @@ + + + + Safely remove the device after copying + + + @@ -260,12 +260,10 @@ destination aftercopying - eject_after naming insert - replace_the + remove_non_fat replace_spaces - replace_ascii overwrite button_box diff --git a/src/dialogs/organiseerrordialog.cpp b/src/organise/organiseerrordialog.cpp similarity index 100% rename from src/dialogs/organiseerrordialog.cpp rename to src/organise/organiseerrordialog.cpp diff --git a/src/dialogs/organiseerrordialog.h b/src/organise/organiseerrordialog.h similarity index 100% rename from src/dialogs/organiseerrordialog.h rename to src/organise/organiseerrordialog.h diff --git a/src/dialogs/organiseerrordialog.ui b/src/organise/organiseerrordialog.ui similarity index 100% rename from src/dialogs/organiseerrordialog.ui rename to src/organise/organiseerrordialog.ui diff --git a/src/core/organiseformat.cpp b/src/organise/organiseformat.cpp similarity index 92% rename from src/core/organiseformat.cpp rename to src/organise/organiseformat.cpp index b807a7ec9..e9e157008 100644 --- a/src/core/organiseformat.cpp +++ b/src/organise/organiseformat.cpp @@ -37,10 +37,10 @@ #include #include "core/arraysize.h" +#include "core/timeconstants.h" +#include "core/utilities.h" +#include "core/song.h" -#include "timeconstants.h" -#include "utilities.h" -#include "song.h" #include "organiseformat.h" class QTextDocument; @@ -56,6 +56,7 @@ const QStringList OrganiseFormat::kKnownTags = QStringList() << "title" << "track" << "disc" << "year" + << "originalyear" << "genre" << "comment" << "length" @@ -65,12 +66,11 @@ const QStringList OrganiseFormat::kKnownTags = QStringList() << "title" << "extension" << "performer" << "grouping" - << "lyrics" - << "originalyear"; + << "lyrics"; // From http://en.wikipedia.org/wiki/8.3_filename#Directory_table -const char OrganiseFormat::kInvalidFatCharacters[] = "\"*/\\:<>?|"; -const int OrganiseFormat::kInvalidFatCharactersCount = arraysize(OrganiseFormat::kInvalidFatCharacters) - 1; +const QRegExp OrganiseFormat::kValidFatCharacters("[^a-zA-Z0-9!#\\$%&'()\\-@\\^_`{}~/. ]"); +const QRegExp OrganiseFormat::kInvalidFatCharacters("[\"*\\:<>?|/]"); const char OrganiseFormat::kInvalidPrefixCharacters[] = "."; const int OrganiseFormat::kInvalidPrefixCharactersCount = arraysize(OrganiseFormat::kInvalidPrefixCharacters) - 1; @@ -85,9 +85,9 @@ const QRgb OrganiseFormat::SyntaxHighlighter::kBlockColorDark = qRgb(64, 64, 64) OrganiseFormat::OrganiseFormat(const QString &format) : format_(format), - replace_non_ascii_(false), - replace_spaces_(false), - replace_the_(false) {} + remove_non_fat_(false), + remove_non_ascii_(false), + replace_spaces_(true) {} void OrganiseFormat::set_format(const QString &v) { format_ = v; @@ -111,13 +111,16 @@ QString OrganiseFormat::GetFilenameForSong(const Song &song) const { if (QFileInfo(filename).completeBaseName().isEmpty()) { // Avoid having empty filenames, or filenames with extension only: in this case, keep the original filename. // We remove the extension from "filename" if it exists, as song.basefilename() also contains the extension. - filename = - Utilities::PathWithoutFilenameExtension(filename) + song.basefilename(); + filename = Utilities::PathWithoutFilenameExtension(filename) + song.basefilename(); + } + + if (remove_non_fat_) { + filename.remove(kValidFatCharacters); } if (replace_spaces_) filename.replace(QRegExp("\\s"), "_"); - if (replace_non_ascii_) { + if (remove_non_ascii_) { QString stripped; for (int i = 0; i < filename.length(); ++i) { const QCharRef c = filename[i]; @@ -225,27 +228,25 @@ QString OrganiseFormat::TagValue(const QString &tag, const Song &song) const { value = QFileInfo(song.url().toLocalFile()).suffix(); else if (tag == "artistinitial") { value = song.effective_albumartist().trimmed(); - if (replace_the_ && !value.isEmpty()) value.replace(QRegExp("^the\\s+", Qt::CaseInsensitive), ""); - if (!value.isEmpty()) value = value[0].toUpper(); + if (!value.isEmpty()) { + value.replace(QRegExp("^the\\s+", Qt::CaseInsensitive), ""); + value = value[0].toUpper(); + } } else if (tag == "albumartist") { value = song.is_compilation() ? "Various Artists" : song.effective_albumartist(); } - if (replace_the_ && (tag == "artist" || tag == "albumartist")) - value.replace(QRegExp("^the\\s+", Qt::CaseInsensitive), ""); - if (value == "0" || value == "-1") value = ""; // Prepend a 0 to single-digit track numbers if (tag == "track" && value.length() == 1) value.prepend('0'); // Replace characters that really shouldn't be in paths - for (int i = 0; i < kInvalidFatCharactersCount; ++i) { - value.replace(kInvalidFatCharacters[i], '_'); - } + value.remove(kInvalidFatCharacters); return value; + } OrganiseFormat::Validator::Validator(QObject *parent) : QValidator(parent) {} diff --git a/src/core/organiseformat.h b/src/organise/organiseformat.h similarity index 87% rename from src/core/organiseformat.h rename to src/organise/organiseformat.h index 07023b70f..c12424893 100644 --- a/src/core/organiseformat.h +++ b/src/organise/organiseformat.h @@ -44,20 +44,21 @@ class OrganiseFormat { static const char *kTagPattern; static const char *kBlockPattern; static const QStringList kKnownTags; - static const char kInvalidFatCharacters[]; - static const int kInvalidFatCharactersCount; + static const QRegExp kValidFatCharacters; + static const QRegExp kInvalidFatCharacters; + static const char kInvalidPrefixCharacters[]; static const int kInvalidPrefixCharactersCount; QString format() const { return format_; } - bool replace_non_ascii() const { return replace_non_ascii_; } + bool remove_non_fat() const { return remove_non_fat_; } + bool remove_non_ascii() const { return remove_non_ascii_; } bool replace_spaces() const { return replace_spaces_; } - bool replace_the() const { return replace_the_; } void set_format(const QString &v); - void set_replace_non_ascii(bool v) { replace_non_ascii_ = v; } + void set_remove_non_fat(bool v) { remove_non_fat_ = v; } + void set_remove_non_ascii(bool v) { remove_non_ascii_ = v; } void set_replace_spaces(bool v) { replace_spaces_ = v; } - void set_replace_the(bool v) { replace_the_ = v; } bool IsValid() const; QString GetFilenameForSong(const Song &song) const; @@ -88,9 +89,9 @@ class OrganiseFormat { QString TagValue(const QString &tag, const Song &song) const; QString format_; - bool replace_non_ascii_; + bool remove_non_fat_; + bool remove_non_ascii_; bool replace_spaces_; - bool replace_the_; }; diff --git a/src/widgets/fileview.cpp b/src/widgets/fileview.cpp index 5913c7617..0135ed5a2 100644 --- a/src/widgets/fileview.cpp +++ b/src/widgets/fileview.cpp @@ -44,7 +44,7 @@ #include "fileviewlist.h" #include "ui_fileview.h" #ifdef HAVE_GSTREAMER -# include "dialogs/organiseerrordialog.h" +# include "organise/organiseerrordialog.h" #endif const char *FileView::kFileFilter =