From 87f1f1a13de86de1d14f73a642ad7d1a2eab528d Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 24 Sep 2018 12:56:36 +0200 Subject: [PATCH] Removed orphan items after scan, make multi tag values work again --- src/cover/CoverArtGrabber.cpp | 3 ++- src/database/Track.hpp | 2 +- src/metadata/TagLibParser.cpp | 9 +++++++-- src/scanner/MediaScanner.cpp | 15 ++++++++++----- src/scanner/MediaScanner.hpp | 3 ++- src/ui/admin/DatabaseSettingsView.cpp | 12 ++++++------ 6 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/cover/CoverArtGrabber.cpp b/src/cover/CoverArtGrabber.cpp index 96732e46..4936a406 100644 --- a/src/cover/CoverArtGrabber.cpp +++ b/src/cover/CoverArtGrabber.cpp @@ -185,7 +185,8 @@ Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std:: if (hasCover) cover = getFromTrack(trackPath); - else + + if (!cover) cover = getFromDirectory(trackPath.parent_path()); } } diff --git a/src/database/Track.hpp b/src/database/Track.hpp index 33bc30f5..e16b54d3 100644 --- a/src/database/Track.hpp +++ b/src/database/Track.hpp @@ -168,7 +168,7 @@ class Track : public Wt::Dbo::Dbo std::vector _fileChecksum; Wt::WDateTime _fileLastWrite; Wt::WDateTime _fileAdded; - bool _hasCover; + bool _hasCover = false; std::string _MBID; // Musicbrainz Identifier std::string _copyright; std::string _copyrightURL; diff --git a/src/metadata/TagLibParser.cpp b/src/metadata/TagLibParser.cpp index f916c8ab..35ab0406 100644 --- a/src/metadata/TagLibParser.cpp +++ b/src/metadata/TagLibParser.cpp @@ -205,8 +205,13 @@ TagLibParser::parse(const boost::filesystem::path& p, bool debug) else if (_clusterTypeNames.find(tag) != _clusterTypeNames.end()) { std::set clusterNames; - for (const auto& value : values) - clusterNames.insert(value.to8Bit(true)); + for (const auto& valueList : values) + { + auto values = splitString(valueList.to8Bit(), "/,;"); + + for (auto value : values) + clusterNames.insert(value); + } if (!clusterNames.empty()) clusters[tag] = clusterNames; diff --git a/src/scanner/MediaScanner.cpp b/src/scanner/MediaScanner.cpp index fa6bac8f..28d54b7f 100644 --- a/src/scanner/MediaScanner.cpp +++ b/src/scanner/MediaScanner.cpp @@ -290,7 +290,7 @@ void MediaScanner::scheduleScan(std::chrono::seconds duration) { LMS_LOG(DBUPDATER, INFO) << "Scheduling next scan in " << duration.count() << " seconds"; - _scheduleTimer.expires_from_now(std::chrono::seconds(5)); //duration); + _scheduleTimer.expires_from_now(duration); _scheduleTimer.async_wait( std::bind( &MediaScanner::scan, this, std::placeholders::_1) ); } @@ -316,7 +316,7 @@ MediaScanner::scan(boost::system::error_code err) bool forceScan = false; Stats stats; - checkAudioFiles(stats); + removeMissingTracks(stats); LMS_LOG(UI, INFO) << "Checks complete, force scan = " << forceScan; @@ -325,7 +325,10 @@ MediaScanner::scan(boost::system::error_code err) LMS_LOG(DBUPDATER, INFO) << "scaning media directory '" << _mediaDirectory.string() << "' DONE"; if (_running) + { + removeOrphanEntries(); checkDuplicatedAudioFiles(stats); + } 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 << ")"; @@ -655,10 +658,8 @@ checkFile(const boost::filesystem::path& p, boost::filesystem::path mediaDirecto } void -MediaScanner::checkAudioFiles( Stats& stats ) +MediaScanner::removeMissingTracks(Stats& stats) { - LMS_LOG(DBUPDATER, INFO) << "Checking audio files..."; - std::vector trackPaths = Track::getAllPaths(_db.getSession());; LMS_LOG(DBUPDATER, DEBUG) << "Checking tracks..."; @@ -679,7 +680,11 @@ MediaScanner::checkAudioFiles( Stats& stats ) } } } +} +void +MediaScanner::removeOrphanEntries() +{ LMS_LOG(DBUPDATER, DEBUG) << "Checking orphan clusters..."; { Wt::Dbo::Transaction transaction(_db.getSession()); diff --git a/src/scanner/MediaScanner.hpp b/src/scanner/MediaScanner.hpp index 3e9309d8..853236aa 100644 --- a/src/scanner/MediaScanner.hpp +++ b/src/scanner/MediaScanner.hpp @@ -83,7 +83,8 @@ class MediaScanner // Helpers void refreshScanSettings(); - void checkAudioFiles( Stats& stats ); + void removeMissingTracks( Stats& stats ); + void removeOrphanEntries(); void checkDuplicatedAudioFiles( Stats& stats ); void scanAudioFile( const boost::filesystem::path& file, bool forceScan, Stats& stats); diff --git a/src/ui/admin/DatabaseSettingsView.cpp b/src/ui/admin/DatabaseSettingsView.cpp index 561b5973..d23c0cc8 100644 --- a/src/ui/admin/DatabaseSettingsView.cpp +++ b/src/ui/admin/DatabaseSettingsView.cpp @@ -279,7 +279,7 @@ DatabaseSettingsView::refreshView() Wt::WPushButton *discardBtn = t->bindWidget("discard-btn", std::make_unique(Wt::WString::tr("Lms.discard"))); Wt::WPushButton *immScanBtn = t->bindWidget("immediate-scan-btn", std::make_unique(Wt::WString::tr("Lms.Admin.Database.immediate-scan"))); - saveBtn->clicked().connect(std::bind([=] () + saveBtn->clicked().connect([=] () { t->updateModel(model.get()); @@ -293,20 +293,20 @@ DatabaseSettingsView::refreshView() // Udate the view: Delete any validation message in the view, etc. t->updateView(model.get()); - })); + }); - discardBtn->clicked().connect(std::bind([=] () + discardBtn->clicked().connect([=] () { model->loadData(); model->validate(); t->updateView(model.get()); - })); + }); - immScanBtn->clicked().connect(std::bind([=] () + immScanBtn->clicked().connect([=] () { LmsApp->getMediaScanner().scheduleImmediateScan(); LmsApp->notifyMsg(MsgType::Info, Wt::WString::tr("Lms.Admin.Database.scan-launched")); - })); + }); t->updateView(model.get()); }