From db0fe53aa38f20332937176dfce7778ac913c314 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 5 Mar 2018 23:13:44 +0100 Subject: [PATCH] Better scan stats --- approot/messages.xml | 2 +- src/scanner/MediaScanner.cpp | 24 +++++++++++++----------- src/scanner/MediaScanner.hpp | 22 ++++++++++++++-------- src/ui/LmsApplication.cpp | 7 ++++++- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/approot/messages.xml b/approot/messages.xml index a0c99722..03322b49 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -37,6 +37,6 @@ Scan now! Scan launched! New settings saved! -Scan finished, {1} imported file(s), {2} removed file(s)! +Scan complete: {1} total files, {2} additions, {3} deletions, {4} duplicates, {5} errors diff --git a/src/scanner/MediaScanner.cpp b/src/scanner/MediaScanner.cpp index 5c1b6e2e..492ad6f4 100644 --- a/src/scanner/MediaScanner.cpp +++ b/src/scanner/MediaScanner.cpp @@ -271,7 +271,7 @@ MediaScanner::scan(boost::system::error_code err) if (_running) 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 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) { - stats.nbNoChange++; + stats.skips++; return; } } @@ -426,11 +426,11 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats) boost::optional items = _metadataParser.parse(file); if (!items) { - stats.nbScanErrors++; + stats.scanErrors++; return; } - stats.nbScanned++; + stats.scans++; std::vector checksum ; computeCrc(file, checksum); @@ -451,9 +451,9 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats) if (track) { track.remove(); - stats.nbRemoved++; + stats.deletions++; } - stats.nbNotImported++; + stats.incompleteScans++; return; } if ((*items).find(MetaData::Type::Duration) == (*items).end() @@ -465,9 +465,9 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats) if (track) { track.remove(); - stats.nbRemoved++; + stats.deletions++; } - stats.nbNotImported++; + stats.incompleteScans++; return; } @@ -536,7 +536,7 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats) // Create a new song track = Track::create(_db.getSession(), file); LMS_LOG(DBUPDATER, INFO) << "Adding '" << file << "'"; - stats.nbAdded++; + stats.additions++; } else { @@ -546,7 +546,7 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats) for (auto cluster : track->getClusters()) cluster.remove(); - stats.nbUpdated++; + stats.updates++; } assert(track); @@ -713,7 +713,7 @@ MediaScanner::checkAudioFiles( Stats& stats ) if (track) { track.remove(); - stats.nbRemoved++; + stats.deletions++; } } } @@ -781,12 +781,14 @@ MediaScanner::checkDuplicatedAudioFiles(Stats& stats) for (Track::pointer track : tracks) { 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()); for (Track::pointer track : tracks) { LMS_LOG(DBUPDATER, INFO) << "Found duplicated checksum [" << bufferToString(track->getChecksum()) << "], file: " << track->getPath() << " - " << track->getArtist()->getName() << " - " << track->getName(); + stats.duplicateHashes++; } diff --git a/src/scanner/MediaScanner.hpp b/src/scanner/MediaScanner.hpp index 902dc29b..cb011c1b 100644 --- a/src/scanner/MediaScanner.hpp +++ b/src/scanner/MediaScanner.hpp @@ -58,15 +58,21 @@ class MediaScanner struct Stats { - std::size_t nbNoChange = 0; // no change since last scan - std::size_t nbScanned = 0; // total scanned filed - std::size_t nbScanErrors = 0; // cannot scan file - std::size_t nbNotImported = 0; // Scanned, but not imported (criteria not filled) - std::size_t nbAdded = 0; // Added in DB - std::size_t nbRemoved = 0; // removed from DB - std::size_t nbUpdated = 0; // updated file in DB + std::size_t skips = 0; // no change since last scan + std::size_t scans = 0; // actually scanned filed + std::size_t scanErrors = 0; // cannot scan file + std::size_t incompleteScans = 0; // Scanned, but not imported (criteria not filled) + std::size_t additions = 0; // Added in DB + std::size_t deletions = 0; // removed from 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; } }; diff --git a/src/ui/LmsApplication.cpp b/src/ui/LmsApplication.cpp index 496df353..ab5a6ad7 100644 --- a/src/ui/LmsApplication.cpp +++ b/src/ui/LmsApplication.cpp @@ -326,7 +326,12 @@ LmsApplication::handleAuthEvent(void) { 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(); }); // notify("TEST");