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 Music collection 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 Collection de musiques 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