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")));