From 7e6bf57e7554215312864801fe7e0ef3b13e8e35 Mon Sep 17 00:00:00 2001 From: emeric Date: Wed, 16 May 2018 12:45:28 +0200 Subject: [PATCH] Add a web interface to control the tags to be scanned --- approot/admin-database.xml | 14 +++++++++++ approot/messages.xml | 2 ++ src/scanner/MediaScanner.cpp | 34 ++++++++++++++++++--------- src/scanner/MediaScanner.hpp | 3 +++ src/ui/admin/DatabaseSettingsView.cpp | 28 ++++++++++++++++++---- 5 files changed, 66 insertions(+), 15 deletions(-) diff --git a/approot/admin-database.xml b/approot/admin-database.xml index 839d7dac..77bf80e6 100644 --- a/approot/admin-database.xml +++ b/approot/admin-database.xml @@ -42,6 +42,20 @@ ${update-start-time-info} + + ${tr:Lms.Admin.Database.scan-options} +
+
+ +
+ ${tags} +
+
+ ${tags-info} +
+
diff --git a/approot/messages.xml b/approot/messages.xml index e0f60060..2b203b94 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -26,7 +26,9 @@ Media root directory Scan complete: {1} total files, {2} additions, {3} deletions, {4} duplicates, {5} errors Scan launched! +Scan options New settings saved! +Tags Update period Update start time Weekly diff --git a/src/scanner/MediaScanner.cpp b/src/scanner/MediaScanner.cpp index 06864e7c..2a66913a 100644 --- a/src/scanner/MediaScanner.cpp +++ b/src/scanner/MediaScanner.cpp @@ -130,16 +130,35 @@ setUpdatePeriod(Wt::Dbo::Session& session, UpdatePeriod updatePeriod) Setting::setInt(session, updatePeriodSetting, static_cast(updatePeriod)); } -Wt::WTime getUpdateStartTime(Wt::Dbo::Session& session) +Wt::WTime +getUpdateStartTime(Wt::Dbo::Session& session) { return Setting::getTime(session, updateStartTimeSetting); } -void setUpdateStartTime(Wt::Dbo::Session& session, Wt::WTime startTime) +void +setUpdateStartTime(Wt::Dbo::Session& session, Wt::WTime startTime) { Setting::setTime(session, updateStartTimeSetting, startTime); } +std::set +getClusterTypes(Wt::Dbo::Session& session) +{ + MetaData::ClusterTypes clusterTypes; + + for (auto cluster : splitString(Setting::getString(session, clusterTypesSetting), " ")) + clusterTypes.insert(cluster); + + return clusterTypes; +} + +void setClusterTypes(Wt::Dbo::Session& session, const std::set clusterTypes) +{ + std::vector vecClusterTypes(clusterTypes.begin(), clusterTypes.end()); + Setting::setString(session, clusterTypesSetting, joinStrings(vecClusterTypes, " ")); +} + MediaScanner::MediaScanner(Wt::Dbo::SqlConnectionPool& connectionPool) : _running(false), _scheduleTimer(_ioService), @@ -153,10 +172,7 @@ _db(connectionPool) Setting::setString(_db.getSession(), fileExtensionsSetting, joinStrings(defaultFileExtensions, " ")); if (!Setting::exists(_db.getSession(), clusterTypesSetting)) - { - std::vector defaultClusterTypes(MetaData::Parser::defaultClusterTypes.begin(), MetaData::Parser::defaultClusterTypes.end()); - Setting::setString(_db.getSession(), clusterTypesSetting, joinStrings(defaultClusterTypes, " ")); - } + setClusterTypes(_db.getSession(), MetaData::Parser::defaultClusterTypes); refreshScanSettings(); } @@ -323,11 +339,7 @@ MediaScanner::refreshScanSettings() for (auto rootDir : Database::MediaDirectory::getAll(_db.getSession())) _rootDirectories.push_back(rootDir->getPath()); - MetaData::ClusterTypes clusterTypes; - for (auto cluster : splitString(Setting::getString(_db.getSession(), clusterTypesSetting), " ")) - clusterTypes.insert(cluster); - - _metadataParser.updateClusterTypes(clusterTypes); + _metadataParser.updateClusterTypes(getClusterTypes(_db.getSession())); } Artist::pointer diff --git a/src/scanner/MediaScanner.hpp b/src/scanner/MediaScanner.hpp index a27b9a13..c3d052e5 100644 --- a/src/scanner/MediaScanner.hpp +++ b/src/scanner/MediaScanner.hpp @@ -45,6 +45,9 @@ void setUpdatePeriod(Wt::Dbo::Session& session, UpdatePeriod updatePeriod); Wt::WTime getUpdateStartTime(Wt::Dbo::Session& session); void setUpdateStartTime(Wt::Dbo::Session& session, Wt::WTime time); +std::set getClusterTypes(Wt::Dbo::Session& session); +void setClusterTypes(Wt::Dbo::Session& session, const std::set clusterTypes); + class MediaScanner { public: diff --git a/src/ui/admin/DatabaseSettingsView.cpp b/src/ui/admin/DatabaseSettingsView.cpp index 6164a7f0..2894050d 100644 --- a/src/ui/admin/DatabaseSettingsView.cpp +++ b/src/ui/admin/DatabaseSettingsView.cpp @@ -30,6 +30,7 @@ #include "database/MediaDirectory.hpp" #include "scanner/MediaScanner.hpp" #include "utils/Logger.hpp" +#include "utils/Utils.hpp" #include "LmsApplication.hpp" @@ -46,6 +47,7 @@ class DatabaseSettingsModel : public Wt::WFormModel static const Field MediaDirectoryField; static const Field UpdatePeriodField; static const Field UpdateStartTimeField; + static const Field TagsField; DatabaseSettingsModel() : Wt::WFormModel() @@ -55,6 +57,7 @@ class DatabaseSettingsModel : public Wt::WFormModel addField(MediaDirectoryField); addField(UpdatePeriodField); addField(UpdateStartTimeField); + addField(TagsField); auto dirValidator = std::make_shared(); dirValidator->setMandatory(true); @@ -62,6 +65,7 @@ class DatabaseSettingsModel : public Wt::WFormModel setValidator(UpdatePeriodField, createMandatoryValidator()); setValidator(UpdateStartTimeField, createMandatoryValidator()); + setValidator(TagsField, createTagsValidator()); // populate the model with initial data loadData(); @@ -87,6 +91,10 @@ class DatabaseSettingsModel : public Wt::WFormModel auto startTimeRow = getUpdateStartTimeModelRow( Scanner::getUpdateStartTime(LmsApp->getDboSession()) ); if (startTimeRow) setValue(UpdateStartTimeField, updateStartTimeString(*startTimeRow) ); + + auto clusterTypes = Scanner::getClusterTypes(LmsApp->getDboSession()); + if (!clusterTypes.empty()) + setValue(TagsField, joinStrings(std::vector(clusterTypes.begin(), clusterTypes.end()), " ")); } void saveData() @@ -94,15 +102,18 @@ class DatabaseSettingsModel : public Wt::WFormModel Wt::Dbo::Transaction transaction(LmsApp->getDboSession()); MediaDirectory::eraseAll(LmsApp->getDboSession()); - MediaDirectory::create(LmsApp->getDboSession(), Wt::cpp17::any_cast(value(MediaDirectoryField)).toUTF8()); + MediaDirectory::create(LmsApp->getDboSession(), valueText(MediaDirectoryField).toUTF8()); - auto updatePeriodRow = getUpdatePeriodModelRow( Wt::cpp17::any_cast(value(UpdatePeriodField))); + auto updatePeriodRow = getUpdatePeriodModelRow( valueText(UpdatePeriodField)); assert(updatePeriodRow); Scanner::setUpdatePeriod(LmsApp->getDboSession(), updatePeriod(*updatePeriodRow)); - auto startTimeRow = getUpdateStartTimeModelRow( Wt::cpp17::any_cast(value(UpdateStartTimeField))); + auto startTimeRow = getUpdateStartTimeModelRow( valueText(UpdateStartTimeField)); assert(startTimeRow); Scanner::setUpdateStartTime(LmsApp->getDboSession(), updateStartTime(*startTimeRow)); + + auto clusterTypes = splitString(valueText(TagsField).toUTF8(), " "); + Scanner::setClusterTypes(LmsApp->getDboSession(), std::set(clusterTypes.begin(), clusterTypes.end())); } boost::optional getUpdatePeriodModelRow(Wt::WString value) @@ -177,6 +188,12 @@ class DatabaseSettingsModel : public Wt::WFormModel private: + static std::shared_ptr createTagsValidator() + { + auto v = std::make_shared(); + return v; + } + void initializeModels() { @@ -215,7 +232,7 @@ class DatabaseSettingsModel : public Wt::WFormModel const Wt::WFormModel::Field DatabaseSettingsModel::MediaDirectoryField = "media-directory"; const Wt::WFormModel::Field DatabaseSettingsModel::UpdatePeriodField = "update-period"; const Wt::WFormModel::Field DatabaseSettingsModel::UpdateStartTimeField = "update-start-time"; - +const Wt::WFormModel::Field DatabaseSettingsModel::TagsField = "tags"; DatabaseSettingsView::DatabaseSettingsView() { @@ -251,6 +268,9 @@ DatabaseSettingsView::refreshView() updateStartTime->setModel(model->updateStartTimeModel()); t->setFormWidget(DatabaseSettingsModel::UpdateStartTimeField, std::move(updateStartTime)); + // Tags + t->setFormWidget(DatabaseSettingsModel::TagsField, std::make_unique()); + // Buttons Wt::WPushButton *saveBtn = t->bindWidget("apply-btn", std::make_unique(Wt::WString::tr("Lms.apply"))); Wt::WPushButton *discardBtn = t->bindWidget("discard-btn", std::make_unique(Wt::WString::tr("Lms.discard")));