Better scan stats
This commit is contained in:
@@ -37,6 +37,6 @@
|
|||||||
<message id="msg-btn-immediate-scan">Scan now!</message>
|
<message id="msg-btn-immediate-scan">Scan now!</message>
|
||||||
<message id="msg-notify-scan-launched">Scan launched!</message>
|
<message id="msg-notify-scan-launched">Scan launched!</message>
|
||||||
<message id="msg-notify-settings-saved">New settings saved!</message>
|
<message id="msg-notify-settings-saved">New settings saved!</message>
|
||||||
<message id="msg-notify-scan-complete">Scan finished, {1} imported file(s), {2} removed file(s)!</message>
|
<message id="msg-notify-scan-complete">Scan complete: {1} total files, {2} additions, {3} deletions, {4} duplicates, {5} errors</message>
|
||||||
|
|
||||||
</messages>
|
</messages>
|
||||||
|
|||||||
@@ -271,7 +271,7 @@ MediaScanner::scan(boost::system::error_code err)
|
|||||||
if (_running)
|
if (_running)
|
||||||
checkDuplicatedAudioFiles(stats);
|
checkDuplicatedAudioFiles(stats);
|
||||||
|
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Scan " << (_running ? "complete" : "aborted") << ". Changes = " << stats.nbChanges() << " (added = " << stats.nbAdded << ", removed = " << stats.nbRemoved << ", updated = " << stats.nbUpdated << "), Not changed = " << stats.nbNoChange << ", Scanned = " << stats.nbScanned << " (errors = " << stats.nbScanErrors << ", not imported = " << stats.nbNotImported << ")";
|
LMS_LOG(DBUPDATER, INFO) << "Scan " << (_running ? "complete" : "aborted") << ". Changes = " << stats.nbChanges() << " (added = " << stats.additions << ", removed = " << stats.deletions << ", updated = " << stats.updates << "), Not changed = " << stats.skips << ", Scanned = " << stats.scans << " (errors = " << stats.scanErrors << ", not imported = " << stats.incompleteScans << "), duplicates = " << stats.nbDuplicates() << " (hash = " << stats.duplicateHashes << ", mbid = " << stats.duplicateMBID << ")";
|
||||||
|
|
||||||
// Update database stats
|
// Update database stats
|
||||||
boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
|
boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
|
||||||
@@ -418,7 +418,7 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats)
|
|||||||
|
|
||||||
if (track && track->getLastWriteTime() == lastWriteTime)
|
if (track && track->getLastWriteTime() == lastWriteTime)
|
||||||
{
|
{
|
||||||
stats.nbNoChange++;
|
stats.skips++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -426,11 +426,11 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats)
|
|||||||
boost::optional<MetaData::Items> items = _metadataParser.parse(file);
|
boost::optional<MetaData::Items> items = _metadataParser.parse(file);
|
||||||
if (!items)
|
if (!items)
|
||||||
{
|
{
|
||||||
stats.nbScanErrors++;
|
stats.scanErrors++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
stats.nbScanned++;
|
stats.scans++;
|
||||||
|
|
||||||
std::vector<unsigned char> checksum ;
|
std::vector<unsigned char> checksum ;
|
||||||
computeCrc(file, checksum);
|
computeCrc(file, checksum);
|
||||||
@@ -451,9 +451,9 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats)
|
|||||||
if (track)
|
if (track)
|
||||||
{
|
{
|
||||||
track.remove();
|
track.remove();
|
||||||
stats.nbRemoved++;
|
stats.deletions++;
|
||||||
}
|
}
|
||||||
stats.nbNotImported++;
|
stats.incompleteScans++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ((*items).find(MetaData::Type::Duration) == (*items).end()
|
if ((*items).find(MetaData::Type::Duration) == (*items).end()
|
||||||
@@ -465,9 +465,9 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats)
|
|||||||
if (track)
|
if (track)
|
||||||
{
|
{
|
||||||
track.remove();
|
track.remove();
|
||||||
stats.nbRemoved++;
|
stats.deletions++;
|
||||||
}
|
}
|
||||||
stats.nbNotImported++;
|
stats.incompleteScans++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,7 +536,7 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats)
|
|||||||
// Create a new song
|
// Create a new song
|
||||||
track = Track::create(_db.getSession(), file);
|
track = Track::create(_db.getSession(), file);
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Adding '" << file << "'";
|
LMS_LOG(DBUPDATER, INFO) << "Adding '" << file << "'";
|
||||||
stats.nbAdded++;
|
stats.additions++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -546,7 +546,7 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats)
|
|||||||
for (auto cluster : track->getClusters())
|
for (auto cluster : track->getClusters())
|
||||||
cluster.remove();
|
cluster.remove();
|
||||||
|
|
||||||
stats.nbUpdated++;
|
stats.updates++;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(track);
|
assert(track);
|
||||||
@@ -713,7 +713,7 @@ MediaScanner::checkAudioFiles( Stats& stats )
|
|||||||
if (track)
|
if (track)
|
||||||
{
|
{
|
||||||
track.remove();
|
track.remove();
|
||||||
stats.nbRemoved++;
|
stats.deletions++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -781,12 +781,14 @@ MediaScanner::checkDuplicatedAudioFiles(Stats& stats)
|
|||||||
for (Track::pointer track : tracks)
|
for (Track::pointer track : tracks)
|
||||||
{
|
{
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Found duplicated MBID [" << track->getMBID() << "], file: " << track->getPath() << " - " << track->getArtist()->getName() << " - " << track->getName();
|
LMS_LOG(DBUPDATER, INFO) << "Found duplicated MBID [" << track->getMBID() << "], file: " << track->getPath() << " - " << track->getArtist()->getName() << " - " << track->getName();
|
||||||
|
stats.duplicateMBID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
tracks = Database::Track::getChecksumDuplicates(_db.getSession());
|
tracks = Database::Track::getChecksumDuplicates(_db.getSession());
|
||||||
for (Track::pointer track : tracks)
|
for (Track::pointer track : tracks)
|
||||||
{
|
{
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Found duplicated checksum [" << bufferToString(track->getChecksum()) << "], file: " << track->getPath() << " - " << track->getArtist()->getName() << " - " << track->getName();
|
LMS_LOG(DBUPDATER, INFO) << "Found duplicated checksum [" << bufferToString(track->getChecksum()) << "], file: " << track->getPath() << " - " << track->getArtist()->getName() << " - " << track->getName();
|
||||||
|
stats.duplicateHashes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -58,15 +58,21 @@ class MediaScanner
|
|||||||
|
|
||||||
struct Stats
|
struct Stats
|
||||||
{
|
{
|
||||||
std::size_t nbNoChange = 0; // no change since last scan
|
std::size_t skips = 0; // no change since last scan
|
||||||
std::size_t nbScanned = 0; // total scanned filed
|
std::size_t scans = 0; // actually scanned filed
|
||||||
std::size_t nbScanErrors = 0; // cannot scan file
|
std::size_t scanErrors = 0; // cannot scan file
|
||||||
std::size_t nbNotImported = 0; // Scanned, but not imported (criteria not filled)
|
std::size_t incompleteScans = 0; // Scanned, but not imported (criteria not filled)
|
||||||
std::size_t nbAdded = 0; // Added in DB
|
std::size_t additions = 0; // Added in DB
|
||||||
std::size_t nbRemoved = 0; // removed from DB
|
std::size_t deletions = 0; // removed from DB
|
||||||
std::size_t nbUpdated = 0; // updated file in DB
|
std::size_t updates = 0; // updated file in DB
|
||||||
|
|
||||||
std::size_t nbChanges() const { return nbAdded + nbRemoved + nbUpdated;}
|
std::size_t duplicateHashes = 0; // Same file hashes
|
||||||
|
std::size_t duplicateMBID = 0; // Same MBID
|
||||||
|
|
||||||
|
std::size_t nbFiles() const { return skips + additions + updates; }
|
||||||
|
std::size_t nbChanges() const { return additions + deletions + updates; }
|
||||||
|
std::size_t nbErrors() const { return scanErrors + incompleteScans; }
|
||||||
|
std::size_t nbDuplicates() const { return duplicateHashes + duplicateMBID; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -326,7 +326,12 @@ LmsApplication::handleAuthEvent(void)
|
|||||||
{
|
{
|
||||||
Wt::WServer::instance()->post(sessionId, [=]
|
Wt::WServer::instance()->post(sessionId, [=]
|
||||||
{
|
{
|
||||||
notify(Wt::WString::tr("msg-notify-scan-complete").arg(stats.nbAdded).arg(stats.nbRemoved));
|
notify(Wt::WString::tr("msg-notify-scan-complete")
|
||||||
|
.arg(stats.nbFiles())
|
||||||
|
.arg(stats.additions)
|
||||||
|
.arg(stats.deletions)
|
||||||
|
.arg(stats.nbDuplicates())
|
||||||
|
.arg(stats.nbErrors()));
|
||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
});
|
});
|
||||||
// notify("TEST");
|
// notify("TEST");
|
||||||
|
|||||||
Reference in New Issue
Block a user