Fixed scanner status refresh

This commit is contained in:
emeric
2022-05-18 21:37:23 +02:00
parent 6d503a615c
commit f1233ffdb2
3 changed files with 82 additions and 44 deletions
+6 -6
View File
@@ -8,23 +8,23 @@
<form>
<div class="row g-3">
<div class="col-lg-6">
<label class="form-label" for="status">
<label class="form-label" for="${id:status}">
${tr:Lms.Admin.ScannerController.status}
</label>
<input type="text" readonly="readonly" class="form-control" id="status" value="${status}"/>
${status class="form-control"}
</div>
<div class="col-lg-6">
<label class="form-label" for="step-status">
<label class="form-label" for="${id:step-status}">
${tr:Lms.Admin.ScannerController.step-status}
</label>
<input type="text" readonly="readonly" class="form-control" id="step-status" value="${step-status}"/>
${step-status class="form-control"}
</div>
<div class="col-12">
<label class="form-label" for="last-scan">
<label class="form-label" for="{id:last-scan}">
${tr:Lms.Admin.ScannerController.last-scan}
</label>
<div class="input-group">
<input type="text" readonly="readonly" class="form-control" id="last-scan" value="${last-scan}"/>
${last-scan class="form-control"}
${report-btn class="btn btn-outline-info"}
</div>
</div>
+68 -38
View File
@@ -56,8 +56,7 @@ class ReportResource : public Wt::WResource
{
public:
ReportResource(const Scanner::ScanStats& stats)
: _stats {stats}
ReportResource()
{
suggestFileName("report.txt");
}
@@ -67,11 +66,22 @@ class ReportResource : public Wt::WResource
beingDeleted();
}
void setScanStats(const Scanner::ScanStats& stats)
{
if (!_stats)
_stats = std::make_unique<Scanner::ScanStats>();
*_stats = stats;
}
void handleRequest(const Wt::Http::Request&, Wt::Http::Response& response)
{
response.out() << Wt::WString::tr("Lms.Admin.ScannerController.errors-header").arg(_stats.errors.size()).toUTF8() << std::endl;
if (!_stats)
return;
for (const auto& error : _stats.errors)
response.out() << Wt::WString::tr("Lms.Admin.ScannerController.errors-header").arg(_stats->errors.size()).toUTF8() << std::endl;
for (const auto& error : _stats->errors)
{
response.out() << error.file.string() << " - " << errorTypeToWString(error.error).toUTF8();
if (!error.systemError.empty())
@@ -81,12 +91,12 @@ class ReportResource : public Wt::WResource
response.out() << std::endl;
response.out() << Wt::WString::tr("Lms.Admin.ScannerController.duplicates-header").arg(_stats.duplicates.size()).toUTF8() << std::endl;
response.out() << Wt::WString::tr("Lms.Admin.ScannerController.duplicates-header").arg(_stats->duplicates.size()).toUTF8() << std::endl;
{
auto transaction {LmsApp->getDbSession().createSharedTransaction()};
for (const auto& duplicate : _stats.duplicates)
for (const auto& duplicate : _stats->duplicates)
{
const auto& track {Database::Track::find(LmsApp->getDbSession(), duplicate.trackId)};
if (!track)
@@ -125,7 +135,7 @@ class ReportResource : public Wt::WResource
return "?";
}
Scanner::ScanStats _stats;
std::unique_ptr<Scanner::ScanStats> _stats;
};
@@ -133,10 +143,44 @@ ScannerController::ScannerController()
: WTemplate {Wt::WString::tr("Lms.Admin.ScannerController.template")}
{
addFunction("tr", &Wt::WTemplate::Functions::tr);
addFunction("id", &Wt::WTemplate::Functions::id);
using namespace Scanner;
auto onDbEvent = [&]() { refreshContents(); };
{
_reportBtn = bindNew<Wt::WPushButton>("report-btn", Wt::WString::tr("Lms.Admin.ScannerController.get-report"));
auto reportResource {std::make_shared<ReportResource>()};
reportResource->setTakesUpdateLock(true);
_reportResource = reportResource.get();
Wt::WLink link {reportResource};
link.setTarget(Wt::LinkTarget::NewWindow);
_reportBtn->setLink(link);
}
Wt::WPushButton* scanBtn {bindNew<Wt::WPushButton>("scan-btn", Wt::WString::tr("Lms.Admin.ScannerController.scan-now"))};
scanBtn->clicked().connect([]
{
Service<Scanner::IScannerService>::get()->requestImmediateScan(false);
});
Wt::WPushButton* fullScanBtn {bindNew<Wt::WPushButton>("full-scan-btn", Wt::WString::tr("Lms.Admin.ScannerController.force-scan-now"))};
fullScanBtn->clicked().connect([]
{
Service<Scanner::IScannerService>::get()->requestImmediateScan(true);
});
_lastScanStatus = bindNew<Wt::WLineEdit>("last-scan");
_lastScanStatus->setReadOnly(true);
_status = bindNew<Wt::WLineEdit>("status");
_status->setReadOnly(true);
_stepStatus = bindNew<Wt::WLineEdit>("step-status");
_stepStatus->setReadOnly(true);
auto onDbEvent {[&]() { refreshContents(); }};
LmsApp->getScannerEvents().scanStarted.connect(this, []
{
@@ -154,24 +198,10 @@ ScannerController::refreshContents()
{
using namespace Scanner;
Wt::WPushButton* reportBtn {bindNew<Wt::WPushButton>("report-btn", Wt::WString::tr("Lms.Admin.ScannerController.get-report"))};
Wt::WPushButton* scanBtn {bindNew<Wt::WPushButton>("scan-btn", Wt::WString::tr("Lms.Admin.ScannerController.scan-now"))};
scanBtn->clicked().connect([]
{
Service<Scanner::IScannerService>::get()->requestImmediateScan(false);
});
Wt::WPushButton* fullScanBtn {bindNew<Wt::WPushButton>("full-scan-btn", Wt::WString::tr("Lms.Admin.ScannerController.force-scan-now"))};
fullScanBtn->clicked().connect([]
{
Service<Scanner::IScannerService>::get()->requestImmediateScan(true);
});
const IScannerService::Status status {Service<IScannerService>::get()->getStatus()};
if (status.lastCompleteScanStats)
{
bindString("last-scan", Wt::WString::tr("Lms.Admin.ScannerController.last-scan-status")
_lastScanStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.last-scan-status")
.arg(status.lastCompleteScanStats->nbFiles())
.arg(durationToString(status.lastCompleteScanStats->startTime, status.lastCompleteScanStats->stopTime))
.arg(status.lastCompleteScanStats->stopTime.toString())
@@ -179,60 +209,60 @@ ScannerController::refreshContents()
.arg(status.lastCompleteScanStats->duplicates.size())
);
Wt::WLink link {std::make_shared<ReportResource>(*status.lastCompleteScanStats)};
link.setTarget(Wt::LinkTarget::NewWindow);
reportBtn->setLink(link);
_reportResource->setScanStats(*status.lastCompleteScanStats);
_reportBtn->setEnabled(true);
}
else
{
bindString("last-scan", Wt::WString::tr("Lms.Admin.ScannerController.last-scan-not-available"));
reportBtn->setEnabled(false);
_lastScanStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.last-scan-not-available"));
_reportBtn->setEnabled(false);
}
switch (status.currentState)
{
case IScannerService::State::NotScheduled:
bindString("status", Wt::WString::tr("Lms.Admin.ScannerController.status-not-scheduled"));
bindEmpty("step-status");
_status->setText(Wt::WString::tr("Lms.Admin.ScannerController.status-not-scheduled"));
_stepStatus->setText("");
break;
case IScannerService::State::Scheduled:
bindString("status", Wt::WString::tr("Lms.Admin.ScannerController.status-scheduled")
_status->setText(Wt::WString::tr("Lms.Admin.ScannerController.status-scheduled")
.arg(status.nextScheduledScan.toString()));
bindEmpty("step-status");
_stepStatus->setText("");
break;
case IScannerService::State::InProgress:
bindString("status", Wt::WString::tr("Lms.Admin.ScannerController.status-in-progress")
_status->setText(Wt::WString::tr("Lms.Admin.ScannerController.status-in-progress")
.arg(static_cast<int>(status.currentScanStepStats->currentStep) + 1)
.arg(Scanner::ScanProgressStepCount));
switch (status.currentScanStepStats->currentStep)
{
case Scanner::ScanProgressStep::ChekingForMissingFiles:
bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-checking-for-missing-files")
_stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-checking-for-missing-files")
.arg(status.currentScanStepStats->progress()));
break;
case Scanner::ScanProgressStep::DiscoveringFiles:
bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-discovering-files")
_stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-discovering-files")
.arg(status.currentScanStepStats->processedElems));
break;
case Scanner::ScanProgressStep::ScanningFiles:
bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-scanning-files")
_stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-scanning-files")
.arg(status.currentScanStepStats->processedElems)
.arg(status.currentScanStepStats->totalElems)
.arg(status.currentScanStepStats->progress()));
break;
case Scanner::ScanProgressStep::FetchingTrackFeatures:
bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-fetching-track-features")
_stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-fetching-track-features")
.arg(status.currentScanStepStats->processedElems)
.arg(status.currentScanStepStats->totalElems)
.arg(status.currentScanStepStats->progress()));
break;
case Scanner::ScanProgressStep::ReloadingSimilarityEngine:
bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-reloading-similarity-engine")
_stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-reloading-similarity-engine")
.arg(status.currentScanStepStats->progress()));
break;
}
+8
View File
@@ -19,7 +19,9 @@
#pragma once
#include <Wt/WPushButton.h>
#include <Wt/WTemplate.h>
#include <Wt/WLineEdit.h>
namespace UserInterface
{
@@ -31,6 +33,12 @@ namespace UserInterface
private:
void refreshContents();
Wt::WPushButton* _reportBtn;
Wt::WLineEdit* _lastScanStatus;
Wt::WLineEdit* _status;
Wt::WLineEdit* _stepStatus;
class ReportResource* _reportResource;
};
} // namespace DatabaseStatus