From 8a69d3e309bbdaa93940ad9839f05cf5357a5755 Mon Sep 17 00:00:00 2001 From: emeric Date: Wed, 22 Feb 2023 13:58:18 +0100 Subject: [PATCH] Fixed a case where moving a file may be broken (when skipping duplicate MBID is active) + only check for duplicate track MBID (instead of recording MBID) as we have have several different releases sharing the same recording MBID) --- conf/lms.conf | 2 +- src/libs/services/database/impl/Track.cpp | 12 ++++++++++++ .../database/include/services/database/Track.hpp | 1 + .../services/scanner/impl/ScanStepScanFiles.cpp | 16 +++++++++++----- .../services/scanner/impl/ScannerService.cpp | 4 ++-- .../services/scanner/impl/ScannerSettings.hpp | 4 ++-- 6 files changed, 29 insertions(+), 10 deletions(-) diff --git a/conf/lms.conf b/conf/lms.conf index 5729eaa9..3e4c3f07 100644 --- a/conf/lms.conf +++ b/conf/lms.conf @@ -79,7 +79,7 @@ cover-jpeg-quality = 75; cover-preferred-file-names = ("cover", "front" ); # Set to true if you want to hide duplicate tracks -scanner-skip-duplicate-recording-mbid = false; +scanner-skip-duplicate-mbid = false; # Scanner read style for metadata, maybe be 'fast', 'average' or 'accurate' scanner-parser-read-style = "accurate"; diff --git a/src/libs/services/database/impl/Track.cpp b/src/libs/services/database/impl/Track.cpp index 6977edef..89af7b53 100644 --- a/src/libs/services/database/impl/Track.cpp +++ b/src/libs/services/database/impl/Track.cpp @@ -209,6 +209,18 @@ Track::exists(Session& session, TrackId id) return session.getDboSession().query("SELECT 1 from track").where("id = ?").bind(id).resultValue() == 1; } +std::vector +Track::findByMBID(Session& session, const UUID& mbid) +{ + session.checkSharedLocked(); + + auto res {session.getDboSession().find() + .where("mbid = ?").bind(std::string {mbid.getAsString()}) + .resultList()}; + + return std::vector(res.begin(), res.end()); +} + std::vector Track::findByRecordingMBID(Session& session, const UUID& mbid) { diff --git a/src/libs/services/database/include/services/database/Track.hpp b/src/libs/services/database/include/services/database/Track.hpp index d97bfc5e..1bf894ab 100644 --- a/src/libs/services/database/include/services/database/Track.hpp +++ b/src/libs/services/database/include/services/database/Track.hpp @@ -110,6 +110,7 @@ class Track : public Object static pointer find(Session& session, TrackId id); static bool exists(Session& session, TrackId id); static std::vector findByRecordingMBID(Session& session, const UUID& MBID); + static std::vector findByMBID(Session& session, const UUID& MBID); static RangeResults findSimilarTracks(Session& session, const std::vector& trackIds, Range range); static RangeResults find(Session& session, const FindParameters& parameters); diff --git a/src/libs/services/scanner/impl/ScanStepScanFiles.cpp b/src/libs/services/scanner/impl/ScanStepScanFiles.cpp index 82cca76e..1bcb5756 100644 --- a/src/libs/services/scanner/impl/ScanStepScanFiles.cpp +++ b/src/libs/services/scanner/impl/ScanStepScanFiles.cpp @@ -283,16 +283,22 @@ namespace Scanner Track::pointer track {Track::findByPath(dbSession, file) }; - // Skip duplicate recording MBID - if (trackInfo->recordingMBID && _settings.skipDuplicateRecordingMBID) + // Skip duplicate track MBID + if (trackInfo->trackMBID && _settings.skipDuplicateMBID) { - for (Track::pointer otherTrack : Track::findByRecordingMBID(dbSession, *trackInfo->recordingMBID)) + for (Track::pointer otherTrack : Track::findByMBID(dbSession, *trackInfo->trackMBID)) { + // Skip ourselves if (track && track->getId() == otherTrack->getId()) continue; - LMS_LOG(DBUPDATER, DEBUG) << "Skipped '" << file.string() << "' (similar recording MBID in '" << otherTrack->getPath().string() << "')"; - // This recording MBID already exists, just remove what we just scanned + // Skip if the other track found does not exists, as it may have been moved to the current scanned file + std::error_code ec; + if (!std::filesystem::exists(otherTrack->getPath(), ec)) + continue; + + LMS_LOG(DBUPDATER, DEBUG) << "Skipped '" << file.string() << "' (similar MBID in '" << otherTrack->getPath().string() << "')"; + // As this MBID already exists, just remove what we just scanned if (track) { track.remove(); diff --git a/src/libs/services/scanner/impl/ScannerService.cpp b/src/libs/services/scanner/impl/ScannerService.cpp index 9c16a426..e9b4cffb 100644 --- a/src/libs/services/scanner/impl/ScannerService.cpp +++ b/src/libs/services/scanner/impl/ScannerService.cpp @@ -336,7 +336,7 @@ ScannerService::refreshScanSettings() return; LMS_LOG(DBUPDATER, DEBUG) << "Scanner settings updated"; - LMS_LOG(DBUPDATER, DEBUG) << "skipDuplicateRecordingMBID = " << newSettings.skipDuplicateRecordingMBID; + LMS_LOG(DBUPDATER, DEBUG) << "skipDuplicateMBID = " << newSettings.skipDuplicateMBID; LMS_LOG(DBUPDATER, DEBUG) << "Using scan settings version " << newSettings.scanVersion; _settings = std::move(newSettings); @@ -366,7 +366,7 @@ ScannerService::readSettings() { ScannerSettings newSettings; - newSettings.skipDuplicateRecordingMBID = Service::get()->getBool("scanner-skip-duplicate-recording-mbid", false); + newSettings.skipDuplicateMBID = Service::get()->getBool("scanner-skip-duplicate-mbid", false); { auto transaction {_dbSession.createSharedTransaction()}; diff --git a/src/libs/services/scanner/impl/ScannerSettings.hpp b/src/libs/services/scanner/impl/ScannerSettings.hpp index 36b6d7d7..6f7af993 100644 --- a/src/libs/services/scanner/impl/ScannerSettings.hpp +++ b/src/libs/services/scanner/impl/ScannerSettings.hpp @@ -36,7 +36,7 @@ namespace Scanner std::vector supportedExtensions; Database::ScanSettings::RecommendationEngineType recommendationServiceType; std::filesystem::path mediaDirectory; - bool skipDuplicateRecordingMBID {}; + bool skipDuplicateMBID {}; std::set clusterTypeNames; bool operator==(const ScannerSettings& rhs) const @@ -47,7 +47,7 @@ namespace Scanner && supportedExtensions == rhs.supportedExtensions && recommendationServiceType == rhs.recommendationServiceType && mediaDirectory == rhs.mediaDirectory - && skipDuplicateRecordingMBID == rhs.skipDuplicateRecordingMBID + && skipDuplicateMBID == rhs.skipDuplicateMBID && clusterTypeNames == rhs.clusterTypeNames; } };