From a087f470a7a4c01235399593bfb99821a4ade4a8 Mon Sep 17 00:00:00 2001 From: emeric Date: Thu, 24 May 2018 14:08:13 +0200 Subject: [PATCH] Add a scan version field for each scanned track --- src/database/ScanSettings.cpp | 6 ++++++ src/database/ScanSettings.hpp | 3 +++ src/database/Track.hpp | 38 +++++++++++++++++++---------------- src/scanner/MediaScanner.cpp | 18 ++++++++--------- src/scanner/MediaScanner.hpp | 1 + 5 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/database/ScanSettings.cpp b/src/database/ScanSettings.cpp index 2e05e377..e265c956 100644 --- a/src/database/ScanSettings.cpp +++ b/src/database/ScanSettings.cpp @@ -77,6 +77,7 @@ ScanSettings::setMediaDirectory(boost::filesystem::path p) void ScanSettings::setClusterTypes(const std::set& clusterTypeNames) { + bool needRescan = false; assert(session()); // Backup the old list @@ -91,6 +92,7 @@ ScanSettings::setClusterTypes(const std::set& clusterTypeNames) { LMS_LOG(DB, INFO) << "Creating cluster type " << clusterTypeName; clusterType = ClusterType::create(*session(), clusterTypeName); + needRescan = true; } _clusterTypes.insert(clusterType); } @@ -103,8 +105,12 @@ ScanSettings::setClusterTypes(const std::set& clusterTypeNames) { LMS_LOG(DB, INFO) << "Deleting cluster type " << oldClusterType->getName(); oldClusterType.remove(); + needRescan = true; } } + + if (needRescan) + _scanVersion += 1; } } // namespace Database diff --git a/src/database/ScanSettings.hpp b/src/database/ScanSettings.hpp index cdc1ef0e..a8bc39c2 100644 --- a/src/database/ScanSettings.hpp +++ b/src/database/ScanSettings.hpp @@ -44,6 +44,7 @@ class ScanSettings : public Wt::Dbo::Dbo static pointer get(Wt::Dbo::Session& session); // Getters + std::size_t getScanVersion() const { return _scanVersion; } boost::filesystem::path getMediaDirectory() const { return _mediaDirectory; } Wt::WTime getUpdateStartTime() const { return _startTime; } UpdatePeriod getUpdatePeriod() const { return _updatePeriod; } @@ -60,6 +61,7 @@ class ScanSettings : public Wt::Dbo::Dbo template void persist(Action& a) { + Wt::Dbo::field(a, _scanVersion, "scan_version"); Wt::Dbo::field(a, _mediaDirectory, "media_directory"); Wt::Dbo::field(a, _startTime, "start_time"); Wt::Dbo::field(a, _updatePeriod, "update_period"); @@ -69,6 +71,7 @@ class ScanSettings : public Wt::Dbo::Dbo private: + int _scanVersion = 0; std::string _mediaDirectory = ""; Wt::WTime _startTime = Wt::WTime(0,0,0); UpdatePeriod _updatePeriod = UpdatePeriod::Never; diff --git a/src/database/Track.hpp b/src/database/Track.hpp index cb619296..e1acb8ee 100644 --- a/src/database/Track.hpp +++ b/src/database/Track.hpp @@ -81,6 +81,7 @@ class Track : public Wt::Dbo::Dbo static void removeClusters(std::string type); // Accessors + void setScanVersion(std::size_t version) {_scanVersion = version; } void setTrackNumber(int num) { _trackNumber = num; } void setTotalTrackNumber(int num) { _totalTrackNumber = num; } void setDiscNumber(int num) { _discNumber = num; } @@ -98,29 +99,31 @@ class Track : public Wt::Dbo::Dbo void setArtist(Wt::Dbo::ptr artist) { _artist = artist; } void setRelease(Wt::Dbo::ptr release) { _release = release; } - boost::optional getTrackNumber(void) const; - boost::optional getTotalTrackNumber(void) const; - boost::optional getDiscNumber(void) const; - boost::optional getTotalDiscNumber(void) const; - std::string getName(void) const { return _name; } - boost::filesystem::path getPath(void) const { return _filePath; } - std::chrono::milliseconds getDuration(void) const { return _duration; } - boost::optional getYear(void) const; - boost::optional getOriginalYear(void) const; - Wt::WDateTime getLastWriteTime(void) const { return _fileLastWrite; } - Wt::WDateTime getAddedTime(void) const { return _fileAdded; } - const std::vector& getChecksum(void) const { return _fileChecksum; } - CoverType getCoverType(void) const { return _coverType; } - const std::string& getMBID(void) const { return _MBID; } - Wt::Dbo::ptr getArtist(void) const { return _artist; } - Wt::Dbo::ptr getRelease(void) const { return _release; } - std::vector> getClusters(void) const; + std::size_t getScanVersion() const { return _scanVersion; } + boost::optional getTrackNumber() const; + boost::optional getTotalTrackNumber() const; + boost::optional getDiscNumber() const; + boost::optional getTotalDiscNumber() const; + std::string getName() const { return _name; } + boost::filesystem::path getPath() const { return _filePath; } + std::chrono::milliseconds getDuration() const { return _duration; } + boost::optional getYear() const; + boost::optional getOriginalYear() const; + Wt::WDateTime getLastWriteTime() const { return _fileLastWrite; } + Wt::WDateTime getAddedTime() const { return _fileAdded; } + const std::vector& getChecksum() const { return _fileChecksum; } + CoverType getCoverType() const { return _coverType; } + const std::string& getMBID() const { return _MBID; } + Wt::Dbo::ptr getArtist() const { return _artist; } + Wt::Dbo::ptr getRelease() const { return _release; } + std::vector> getClusters() const; std::vector>> getClusterGroups(std::vector> clusterTypes, std::size_t size) const; template void persist(Action& a) { + Wt::Dbo::field(a, _scanVersion, "scan_version"); Wt::Dbo::field(a, _trackNumber, "track_number"); Wt::Dbo::field(a, _totalTrackNumber, "total_track_number"); Wt::Dbo::field(a, _discNumber, "disc_number"); @@ -146,6 +149,7 @@ class Track : public Wt::Dbo::Dbo static const std::size_t _maxNameLength = 128; + int _scanVersion = 0; int _trackNumber = 0; int _totalTrackNumber = 0; int _discNumber = 0; diff --git a/src/scanner/MediaScanner.cpp b/src/scanner/MediaScanner.cpp index d652f6af..6e5d0f83 100644 --- a/src/scanner/MediaScanner.cpp +++ b/src/scanner/MediaScanner.cpp @@ -345,6 +345,7 @@ MediaScanner::refreshScanSettings() auto scanSettings = ScanSettings::get(_db.getSession()); + _scanVersion = scanSettings->getScanVersion(); _startTime = scanSettings->getUpdateStartTime(); _updatePeriod = scanSettings->getUpdatePeriod(); @@ -369,16 +370,14 @@ MediaScanner::scanAudioFile(const boost::filesystem::path& file, bool forceScan, if (!forceScan) { // Skip file if last write is the same + Wt::Dbo::Transaction transaction(_db.getSession()); + + Wt::Dbo::ptr track = Track::getByPath(_db.getSession(), file); + + if (track && track->getLastWriteTime() == lastWriteTime && track->getScanVersion() == _scanVersion) { - Wt::Dbo::Transaction transaction(_db.getSession()); - - Wt::Dbo::ptr track = Track::getByPath(_db.getSession(), file); - - if (track && track->getLastWriteTime() == lastWriteTime) - { - stats.skips++; - return; - } + stats.skips++; + return; } } @@ -508,6 +507,7 @@ MediaScanner::scanAudioFile(const boost::filesystem::path& file, bool forceScan, assert(track); + track.modify()->setScanVersion(_scanVersion); track.modify()->setChecksum(checksum); track.modify()->setArtist(artist); track.modify()->setRelease(release); diff --git a/src/scanner/MediaScanner.hpp b/src/scanner/MediaScanner.hpp index 9102574b..3e9309d8 100644 --- a/src/scanner/MediaScanner.hpp +++ b/src/scanner/MediaScanner.hpp @@ -97,6 +97,7 @@ class MediaScanner Database::Handler _db; // Current scan settings + std::size_t _scanVersion; Wt::WTime _startTime; Database::ScanSettings::UpdatePeriod _updatePeriod; std::set _fileExtensions;