diff --git a/src/metadata/MetaData.hpp b/src/metadata/MetaData.hpp index dd721ad3..b720c23c 100644 --- a/src/metadata/MetaData.hpp +++ b/src/metadata/MetaData.hpp @@ -24,6 +24,7 @@ #include #include #include +#include namespace MetaData { diff --git a/src/scanner/MediaScanner.cpp b/src/scanner/MediaScanner.cpp index 85c79652..309ed8f0 100644 --- a/src/scanner/MediaScanner.cpp +++ b/src/scanner/MediaScanner.cpp @@ -29,6 +29,7 @@ #include "database/Release.hpp" #include "database/ScanSettings.hpp" #include "database/Track.hpp" +#include "utils/Exception.hpp" #include "utils/Logger.hpp" #include "utils/Path.hpp" #include "utils/Utils.hpp" @@ -505,7 +506,17 @@ MediaScanner::scanAudioFile(const std::filesystem::path& file, bool forceScan, S { notifyInProgressIfNeeded(stats); - const Wt::WDateTime lastWriteTime {std::filesystem::last_write_time(file)}; + time_t lastWriteTime {}; + try + { + lastWriteTime = getLastWriteTime(file); + } + catch (LmsException& e) + { + LMS_LOG(DBUPDATER, ERROR) << e.what(); + stats.skips++; + return; + } if (!forceScan) { @@ -514,7 +525,7 @@ MediaScanner::scanAudioFile(const std::filesystem::path& file, bool forceScan, S const Track::pointer track {Track::getByPath(*_dbSession, file)}; - if (track && track->getLastWriteTime().toTime_t() == lastWriteTime.toTime_t() + if (track && track->getLastWriteTime().toTime_t() == lastWriteTime && track->getScanVersion() == _scanVersion) { stats.skips++; @@ -626,7 +637,7 @@ MediaScanner::scanAudioFile(const std::filesystem::path& file, bool forceScan, S track.modify()->setScanVersion(_scanVersion); track.modify()->setRelease(release); track.modify()->setClusters(clusters); - track.modify()->setLastWriteTime(lastWriteTime); + track.modify()->setLastWriteTime(Wt::WDateTime {std::chrono::system_clock::from_time_t(lastWriteTime)}); track.modify()->setName(title); track.modify()->setDuration(trackInfo->duration); track.modify()->setAddedTime(Wt::WLocalDateTime::currentServerDateTime().toUTC()); diff --git a/src/utils/Path.cpp b/src/utils/Path.cpp index f256fd6b..35d4aa30 100644 --- a/src/utils/Path.cpp +++ b/src/utils/Path.cpp @@ -19,6 +19,10 @@ #include "Path.hpp" +#include +#include +#include + #include #include @@ -28,7 +32,8 @@ #include "utils/Exception.hpp" #include "utils/Logger.hpp" -void computeCrc(const std::filesystem::path& p, std::vector& crc) +void +computeCrc(const std::filesystem::path& p, std::vector& crc) { using crc_type = boost::crc_32_type; crc_type result; @@ -62,7 +67,8 @@ void computeCrc(const std::filesystem::path& p, std::vector& crc) } } -bool ensureDirectory(const std::filesystem::path& dir) +bool +ensureDirectory(const std::filesystem::path& dir) { if (std::filesystem::exists(dir)) return std::filesystem::is_directory(dir); @@ -70,3 +76,14 @@ bool ensureDirectory(const std::filesystem::path& dir) return std::filesystem::create_directory(dir); } +std::time_t +getLastWriteTime(const std::filesystem::path& file) +{ + struct stat sb {}; + + if (stat(file.string().c_str(), &sb) == -1) + throw LmsException("Failed to get stats on file '" + file.string() + "'" ); + + return sb.st_mtime; +} + diff --git a/src/utils/Path.hpp b/src/utils/Path.hpp index 56e40587..a0fb5865 100644 --- a/src/utils/Path.hpp +++ b/src/utils/Path.hpp @@ -29,3 +29,6 @@ void computeCrc(const std::filesystem::path& p, std::vector& chec // Create it if needed bool ensureDirectory(const std::filesystem::path& dir); +// Get the last write time since Epoch +std::time_t getLastWriteTime(const std::filesystem::path& dir); +