diff --git a/approot/messages.xml b/approot/messages.xml
index 82885ada..43389b1e 100644
--- a/approot/messages.xml
+++ b/approot/messages.xml
@@ -37,6 +37,7 @@
Daily
Music collection
+Hourly
Scan now!
Monthly
diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml
index 8634953f..d4d1d5fe 100644
--- a/approot/messages_fr.xml
+++ b/approot/messages_fr.xml
@@ -37,6 +37,7 @@
Tous les jours
Collection de musiques
+Toutes les heures
Scanner maintenant !
Tous les mois
diff --git a/src/libs/database/include/database/ScanSettings.hpp b/src/libs/database/include/database/ScanSettings.hpp
index c1d32718..3451137a 100644
--- a/src/libs/database/include/database/ScanSettings.hpp
+++ b/src/libs/database/include/database/ScanSettings.hpp
@@ -41,7 +41,8 @@ class ScanSettings : public Wt::Dbo::Dbo
Never = 0,
Daily,
Weekly,
- Monthly
+ Monthly,
+ Hourly,
};
// Do not modify values (just add)
diff --git a/src/libs/scanner/impl/Scanner.cpp b/src/libs/scanner/impl/Scanner.cpp
index 5c1b61b5..11175d61 100644
--- a/src/libs/scanner/impl/Scanner.cpp
+++ b/src/libs/scanner/impl/Scanner.cpp
@@ -368,28 +368,32 @@ Scanner::scheduleNextScan()
const Wt::WDateTime now {Wt::WLocalDateTime::currentServerDateTime().toUTC()};
- Wt::WDate nextScanDate;
+ Wt::WDateTime nextScanDateTime;
switch (_updatePeriod)
{
case ScanSettings::UpdatePeriod::Daily:
if (now.time() < _startTime)
- nextScanDate = now.date();
+ nextScanDateTime = {now.date(), _startTime};
else
- nextScanDate = now.date().addDays(1);
+ nextScanDateTime = {now.date().addDays(1), _startTime};
break;
case ScanSettings::UpdatePeriod::Weekly:
if (now.time() < _startTime && now.date().dayOfWeek() == 1)
- nextScanDate = now.date();
+ nextScanDateTime = {now.date(), _startTime};
else
- nextScanDate = getNextMonday(now.date());
+ nextScanDateTime = {getNextMonday(now.date()), _startTime};
break;
case ScanSettings::UpdatePeriod::Monthly:
if (now.time() < _startTime && now.date().day() == 1)
- nextScanDate = now.date();
+ nextScanDateTime = {now.date(), _startTime};
else
- nextScanDate = getNextFirstOfMonth(now.date());
+ nextScanDateTime = {getNextFirstOfMonth(now.date()), _startTime};
+ break;
+
+ case ScanSettings::UpdatePeriod::Hourly:
+ nextScanDateTime = {now.date(), now.time().addSecs(3600)};
break;
case ScanSettings::UpdatePeriod::Never:
@@ -397,13 +401,8 @@ Scanner::scheduleNextScan()
break;
}
- Wt::WDateTime nextScanDateTime;
-
- if (nextScanDate.isValid())
- {
- nextScanDateTime = Wt::WDateTime {nextScanDate, _startTime};
+ if (nextScanDateTime.isValid())
scheduleScan(false, nextScanDateTime);
- }
{
std::unique_lock lock {_statusMutex};
diff --git a/src/lms/ui/admin/DatabaseSettingsView.cpp b/src/lms/ui/admin/DatabaseSettingsView.cpp
index aa35e0ae..6c37dca7 100644
--- a/src/lms/ui/admin/DatabaseSettingsView.cpp
+++ b/src/lms/ui/admin/DatabaseSettingsView.cpp
@@ -48,11 +48,13 @@ class DatabaseSettingsModel : public Wt::WFormModel
{
public:
// Associate each field with a unique string literal.
- static inline const Field MediaDirectoryField {"media-directory"};
- static inline const Field UpdatePeriodField {"update-period"};
- static inline const Field UpdateStartTimeField {"update-start-time"};
- static inline const Field RecommendationEngineTypeField {"recommendation-engine-type"};
- static inline const Field TagsField {"tags"};
+ static inline constexpr Field MediaDirectoryField {"media-directory"};
+ static inline constexpr Field UpdatePeriodField {"update-period"};
+ static inline constexpr Field UpdateStartTimeField {"update-start-time"};
+ static inline constexpr Field RecommendationEngineTypeField {"recommendation-engine-type"};
+ static inline constexpr Field TagsField {"tags"};
+
+ using UpdatePeriodModel = ValueStringModel;
DatabaseSettingsModel()
{
@@ -77,7 +79,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
loadData();
}
- std::shared_ptr updatePeriodModel() { return _updatePeriodModel; }
+ std::shared_ptr updatePeriodModel() { return _updatePeriodModel; }
std::shared_ptr updateStartTimeModel() { return _updateStartTimeModel; }
std::shared_ptr recommendationEngineTypeModel() { return _recommendationEngineTypeModel; }
@@ -97,6 +99,12 @@ class DatabaseSettingsModel : public Wt::WFormModel
if (startTimeRow)
setValue(UpdateStartTimeField, _updateStartTimeModel->getString(*startTimeRow));
+ if (scanSettings->getUpdatePeriod() == ScanSettings::UpdatePeriod::Hourly
+ || scanSettings->getUpdatePeriod() == ScanSettings::UpdatePeriod::Never)
+ {
+ setReadOnly(DatabaseSettingsModel::UpdateStartTimeField, true);
+ }
+
auto recommendationEngineTypeRow {_recommendationEngineTypeModel->getRowFromValue(scanSettings->getRecommendationEngineType())};
if (recommendationEngineTypeRow)
setValue(RecommendationEngineTypeField, _recommendationEngineTypeModel->getString(*recommendationEngineTypeRow));
@@ -145,6 +153,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
{
_updatePeriodModel = std::make_shared>();
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.never"), ScanSettings::UpdatePeriod::Never);
+ _updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.hourly"), ScanSettings::UpdatePeriod::Hourly);
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.daily"), ScanSettings::UpdatePeriod::Daily);
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.weekly"), ScanSettings::UpdatePeriod::Weekly);
_updatePeriodModel->add(Wt::WString::tr("Lms.Admin.Database.monthly"), ScanSettings::UpdatePeriod::Monthly);
@@ -161,7 +170,7 @@ class DatabaseSettingsModel : public Wt::WFormModel
_recommendationEngineTypeModel->add(Wt::WString::tr("Lms.Admin.Database.recommendation-engine-type.features"), ScanSettings::RecommendationEngineType::Features);
}
- std::shared_ptr> _updatePeriodModel;
+ std::shared_ptr _updatePeriodModel;
std::shared_ptr> _updateStartTimeModel;
std::shared_ptr> _recommendationEngineTypeModel;
};
@@ -193,6 +202,13 @@ DatabaseSettingsView::refreshView()
// Update Period
auto updatePeriod {std::make_unique()};
updatePeriod->setModel(model->updatePeriodModel());
+ updatePeriod->activated().connect([=](int row)
+ {
+ const ScanSettings::UpdatePeriod period {model->updatePeriodModel()->getValue(row)};
+ model->setReadOnly(DatabaseSettingsModel::UpdateStartTimeField, period == ScanSettings::UpdatePeriod::Hourly || period == ScanSettings::UpdatePeriod::Never);
+ t->updateModel(model.get());
+ t->updateView(model.get());
+ });
t->setFormWidget(DatabaseSettingsModel::UpdatePeriodField, std::move(updatePeriod));
// Update Start Time