Add a web interface to control the tags to be scanned
This commit is contained in:
@@ -42,6 +42,20 @@
|
|||||||
${update-start-time-info}
|
${update-start-time-info}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<legend>${tr:Lms.Admin.Database.scan-options}</legend>
|
||||||
|
<div class="form-horizontal">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-sm-2" for="${id:tags}">
|
||||||
|
${tr:Lms.Admin.Database.tags}
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-5">
|
||||||
|
${tags}
|
||||||
|
</div>
|
||||||
|
<div class="help-block col-sm-5">
|
||||||
|
${tags-info}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-offset-2 col-sm-10">
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
|
|||||||
@@ -26,7 +26,9 @@
|
|||||||
<message id="Lms.Admin.Database.path">Media root directory</message>
|
<message id="Lms.Admin.Database.path">Media root directory</message>
|
||||||
<message id="Lms.Admin.Database.scan-complete">Scan complete: {1} total files, {2} additions, {3} deletions, {4} duplicates, {5} errors</message>
|
<message id="Lms.Admin.Database.scan-complete">Scan complete: {1} total files, {2} additions, {3} deletions, {4} duplicates, {5} errors</message>
|
||||||
<message id="Lms.Admin.Database.scan-launched">Scan launched!</message>
|
<message id="Lms.Admin.Database.scan-launched">Scan launched!</message>
|
||||||
|
<message id="Lms.Admin.Database.scan-options">Scan options</message>
|
||||||
<message id="Lms.Admin.Database.settings-saved">New settings saved!</message>
|
<message id="Lms.Admin.Database.settings-saved">New settings saved!</message>
|
||||||
|
<message id="Lms.Admin.Database.tags">Tags</message>
|
||||||
<message id="Lms.Admin.Database.update-period">Update period</message>
|
<message id="Lms.Admin.Database.update-period">Update period</message>
|
||||||
<message id="Lms.Admin.Database.update-start-time">Update start time</message>
|
<message id="Lms.Admin.Database.update-start-time">Update start time</message>
|
||||||
<message id="Lms.Admin.Database.weekly">Weekly</message>
|
<message id="Lms.Admin.Database.weekly">Weekly</message>
|
||||||
|
|||||||
@@ -130,16 +130,35 @@ setUpdatePeriod(Wt::Dbo::Session& session, UpdatePeriod updatePeriod)
|
|||||||
Setting::setInt(session, updatePeriodSetting, static_cast<int>(updatePeriod));
|
Setting::setInt(session, updatePeriodSetting, static_cast<int>(updatePeriod));
|
||||||
}
|
}
|
||||||
|
|
||||||
Wt::WTime getUpdateStartTime(Wt::Dbo::Session& session)
|
Wt::WTime
|
||||||
|
getUpdateStartTime(Wt::Dbo::Session& session)
|
||||||
{
|
{
|
||||||
return Setting::getTime(session, updateStartTimeSetting);
|
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);
|
Setting::setTime(session, updateStartTimeSetting, startTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::set<std::string>
|
||||||
|
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<std::string> clusterTypes)
|
||||||
|
{
|
||||||
|
std::vector<std::string> vecClusterTypes(clusterTypes.begin(), clusterTypes.end());
|
||||||
|
Setting::setString(session, clusterTypesSetting, joinStrings(vecClusterTypes, " "));
|
||||||
|
}
|
||||||
|
|
||||||
MediaScanner::MediaScanner(Wt::Dbo::SqlConnectionPool& connectionPool)
|
MediaScanner::MediaScanner(Wt::Dbo::SqlConnectionPool& connectionPool)
|
||||||
: _running(false),
|
: _running(false),
|
||||||
_scheduleTimer(_ioService),
|
_scheduleTimer(_ioService),
|
||||||
@@ -153,10 +172,7 @@ _db(connectionPool)
|
|||||||
Setting::setString(_db.getSession(), fileExtensionsSetting, joinStrings(defaultFileExtensions, " "));
|
Setting::setString(_db.getSession(), fileExtensionsSetting, joinStrings(defaultFileExtensions, " "));
|
||||||
|
|
||||||
if (!Setting::exists(_db.getSession(), clusterTypesSetting))
|
if (!Setting::exists(_db.getSession(), clusterTypesSetting))
|
||||||
{
|
setClusterTypes(_db.getSession(), MetaData::Parser::defaultClusterTypes);
|
||||||
std::vector<std::string> defaultClusterTypes(MetaData::Parser::defaultClusterTypes.begin(), MetaData::Parser::defaultClusterTypes.end());
|
|
||||||
Setting::setString(_db.getSession(), clusterTypesSetting, joinStrings(defaultClusterTypes, " "));
|
|
||||||
}
|
|
||||||
|
|
||||||
refreshScanSettings();
|
refreshScanSettings();
|
||||||
}
|
}
|
||||||
@@ -323,11 +339,7 @@ MediaScanner::refreshScanSettings()
|
|||||||
for (auto rootDir : Database::MediaDirectory::getAll(_db.getSession()))
|
for (auto rootDir : Database::MediaDirectory::getAll(_db.getSession()))
|
||||||
_rootDirectories.push_back(rootDir->getPath());
|
_rootDirectories.push_back(rootDir->getPath());
|
||||||
|
|
||||||
MetaData::ClusterTypes clusterTypes;
|
_metadataParser.updateClusterTypes(getClusterTypes(_db.getSession()));
|
||||||
for (auto cluster : splitString(Setting::getString(_db.getSession(), clusterTypesSetting), " "))
|
|
||||||
clusterTypes.insert(cluster);
|
|
||||||
|
|
||||||
_metadataParser.updateClusterTypes(clusterTypes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Artist::pointer
|
Artist::pointer
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ void setUpdatePeriod(Wt::Dbo::Session& session, UpdatePeriod updatePeriod);
|
|||||||
Wt::WTime getUpdateStartTime(Wt::Dbo::Session& session);
|
Wt::WTime getUpdateStartTime(Wt::Dbo::Session& session);
|
||||||
void setUpdateStartTime(Wt::Dbo::Session& session, Wt::WTime time);
|
void setUpdateStartTime(Wt::Dbo::Session& session, Wt::WTime time);
|
||||||
|
|
||||||
|
std::set<std::string> getClusterTypes(Wt::Dbo::Session& session);
|
||||||
|
void setClusterTypes(Wt::Dbo::Session& session, const std::set<std::string> clusterTypes);
|
||||||
|
|
||||||
class MediaScanner
|
class MediaScanner
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include "database/MediaDirectory.hpp"
|
#include "database/MediaDirectory.hpp"
|
||||||
#include "scanner/MediaScanner.hpp"
|
#include "scanner/MediaScanner.hpp"
|
||||||
#include "utils/Logger.hpp"
|
#include "utils/Logger.hpp"
|
||||||
|
#include "utils/Utils.hpp"
|
||||||
|
|
||||||
#include "LmsApplication.hpp"
|
#include "LmsApplication.hpp"
|
||||||
|
|
||||||
@@ -46,6 +47,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
|
|||||||
static const Field MediaDirectoryField;
|
static const Field MediaDirectoryField;
|
||||||
static const Field UpdatePeriodField;
|
static const Field UpdatePeriodField;
|
||||||
static const Field UpdateStartTimeField;
|
static const Field UpdateStartTimeField;
|
||||||
|
static const Field TagsField;
|
||||||
|
|
||||||
DatabaseSettingsModel()
|
DatabaseSettingsModel()
|
||||||
: Wt::WFormModel()
|
: Wt::WFormModel()
|
||||||
@@ -55,6 +57,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
|
|||||||
addField(MediaDirectoryField);
|
addField(MediaDirectoryField);
|
||||||
addField(UpdatePeriodField);
|
addField(UpdatePeriodField);
|
||||||
addField(UpdateStartTimeField);
|
addField(UpdateStartTimeField);
|
||||||
|
addField(TagsField);
|
||||||
|
|
||||||
auto dirValidator = std::make_shared<DirectoryValidator>();
|
auto dirValidator = std::make_shared<DirectoryValidator>();
|
||||||
dirValidator->setMandatory(true);
|
dirValidator->setMandatory(true);
|
||||||
@@ -62,6 +65,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
|
|||||||
|
|
||||||
setValidator(UpdatePeriodField, createMandatoryValidator());
|
setValidator(UpdatePeriodField, createMandatoryValidator());
|
||||||
setValidator(UpdateStartTimeField, createMandatoryValidator());
|
setValidator(UpdateStartTimeField, createMandatoryValidator());
|
||||||
|
setValidator(TagsField, createTagsValidator());
|
||||||
|
|
||||||
// populate the model with initial data
|
// populate the model with initial data
|
||||||
loadData();
|
loadData();
|
||||||
@@ -87,6 +91,10 @@ class DatabaseSettingsModel : public Wt::WFormModel
|
|||||||
auto startTimeRow = getUpdateStartTimeModelRow( Scanner::getUpdateStartTime(LmsApp->getDboSession()) );
|
auto startTimeRow = getUpdateStartTimeModelRow( Scanner::getUpdateStartTime(LmsApp->getDboSession()) );
|
||||||
if (startTimeRow)
|
if (startTimeRow)
|
||||||
setValue(UpdateStartTimeField, updateStartTimeString(*startTimeRow) );
|
setValue(UpdateStartTimeField, updateStartTimeString(*startTimeRow) );
|
||||||
|
|
||||||
|
auto clusterTypes = Scanner::getClusterTypes(LmsApp->getDboSession());
|
||||||
|
if (!clusterTypes.empty())
|
||||||
|
setValue(TagsField, joinStrings(std::vector<std::string>(clusterTypes.begin(), clusterTypes.end()), " "));
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveData()
|
void saveData()
|
||||||
@@ -94,15 +102,18 @@ class DatabaseSettingsModel : public Wt::WFormModel
|
|||||||
Wt::Dbo::Transaction transaction(LmsApp->getDboSession());
|
Wt::Dbo::Transaction transaction(LmsApp->getDboSession());
|
||||||
|
|
||||||
MediaDirectory::eraseAll(LmsApp->getDboSession());
|
MediaDirectory::eraseAll(LmsApp->getDboSession());
|
||||||
MediaDirectory::create(LmsApp->getDboSession(), Wt::cpp17::any_cast<Wt::WString>(value(MediaDirectoryField)).toUTF8());
|
MediaDirectory::create(LmsApp->getDboSession(), valueText(MediaDirectoryField).toUTF8());
|
||||||
|
|
||||||
auto updatePeriodRow = getUpdatePeriodModelRow( Wt::cpp17::any_cast<Wt::WString>(value(UpdatePeriodField)));
|
auto updatePeriodRow = getUpdatePeriodModelRow( valueText(UpdatePeriodField));
|
||||||
assert(updatePeriodRow);
|
assert(updatePeriodRow);
|
||||||
Scanner::setUpdatePeriod(LmsApp->getDboSession(), updatePeriod(*updatePeriodRow));
|
Scanner::setUpdatePeriod(LmsApp->getDboSession(), updatePeriod(*updatePeriodRow));
|
||||||
|
|
||||||
auto startTimeRow = getUpdateStartTimeModelRow( Wt::cpp17::any_cast<Wt::WString>(value(UpdateStartTimeField)));
|
auto startTimeRow = getUpdateStartTimeModelRow( valueText(UpdateStartTimeField));
|
||||||
assert(startTimeRow);
|
assert(startTimeRow);
|
||||||
Scanner::setUpdateStartTime(LmsApp->getDboSession(), updateStartTime(*startTimeRow));
|
Scanner::setUpdateStartTime(LmsApp->getDboSession(), updateStartTime(*startTimeRow));
|
||||||
|
|
||||||
|
auto clusterTypes = splitString(valueText(TagsField).toUTF8(), " ");
|
||||||
|
Scanner::setClusterTypes(LmsApp->getDboSession(), std::set<std::string>(clusterTypes.begin(), clusterTypes.end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::optional<int> getUpdatePeriodModelRow(Wt::WString value)
|
boost::optional<int> getUpdatePeriodModelRow(Wt::WString value)
|
||||||
@@ -177,6 +188,12 @@ class DatabaseSettingsModel : public Wt::WFormModel
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
static std::shared_ptr<Wt::WValidator> createTagsValidator()
|
||||||
|
{
|
||||||
|
auto v = std::make_shared<Wt::WValidator>();
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
void initializeModels()
|
void initializeModels()
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -215,7 +232,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
|
|||||||
const Wt::WFormModel::Field DatabaseSettingsModel::MediaDirectoryField = "media-directory";
|
const Wt::WFormModel::Field DatabaseSettingsModel::MediaDirectoryField = "media-directory";
|
||||||
const Wt::WFormModel::Field DatabaseSettingsModel::UpdatePeriodField = "update-period";
|
const Wt::WFormModel::Field DatabaseSettingsModel::UpdatePeriodField = "update-period";
|
||||||
const Wt::WFormModel::Field DatabaseSettingsModel::UpdateStartTimeField = "update-start-time";
|
const Wt::WFormModel::Field DatabaseSettingsModel::UpdateStartTimeField = "update-start-time";
|
||||||
|
const Wt::WFormModel::Field DatabaseSettingsModel::TagsField = "tags";
|
||||||
|
|
||||||
DatabaseSettingsView::DatabaseSettingsView()
|
DatabaseSettingsView::DatabaseSettingsView()
|
||||||
{
|
{
|
||||||
@@ -251,6 +268,9 @@ DatabaseSettingsView::refreshView()
|
|||||||
updateStartTime->setModel(model->updateStartTimeModel());
|
updateStartTime->setModel(model->updateStartTimeModel());
|
||||||
t->setFormWidget(DatabaseSettingsModel::UpdateStartTimeField, std::move(updateStartTime));
|
t->setFormWidget(DatabaseSettingsModel::UpdateStartTimeField, std::move(updateStartTime));
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
t->setFormWidget(DatabaseSettingsModel::TagsField, std::make_unique<Wt::WLineEdit>());
|
||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
Wt::WPushButton *saveBtn = t->bindWidget("apply-btn", std::make_unique<Wt::WPushButton>(Wt::WString::tr("Lms.apply")));
|
Wt::WPushButton *saveBtn = t->bindWidget("apply-btn", std::make_unique<Wt::WPushButton>(Wt::WString::tr("Lms.apply")));
|
||||||
Wt::WPushButton *discardBtn = t->bindWidget("discard-btn", std::make_unique<Wt::WPushButton>(Wt::WString::tr("Lms.discard")));
|
Wt::WPushButton *discardBtn = t->bindWidget("discard-btn", std::make_unique<Wt::WPushButton>(Wt::WString::tr("Lms.discard")));
|
||||||
|
|||||||
Reference in New Issue
Block a user