diff --git a/approot/messages.xml b/approot/messages.xml index 925ac67c..20677bc8 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -61,8 +61,6 @@ Not available Scanned {1} files in {2} on {3} ({4} errors, {5} duplicates) No audio track -Not a regular file -File type not supported Duplicated file hash Duplicated MBID Status diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index 5f5951b2..934cd400 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -61,8 +61,6 @@ Non disponible {1} fichiers scannés en {2} le {3} ({4} erreurs, {5} duplicatas) Pas de piste audio -Fichier non régulier -Type de fichier non supporté Hash dupliqué MBID dupliqué Statut diff --git a/src/libs/scanner/impl/MediaScanner.cpp b/src/libs/scanner/impl/MediaScanner.cpp index b213f9f8..a6d27213 100644 --- a/src/libs/scanner/impl/MediaScanner.cpp +++ b/src/libs/scanner/impl/MediaScanner.cpp @@ -350,33 +350,21 @@ MediaScanner::scheduleNextScan() void MediaScanner::countAllFiles(ScanStats& stats) { - std::error_code ec; - stats.filesToScan = 0; - std::filesystem::recursive_directory_iterator itPath {_mediaDirectory, std::filesystem::directory_options::follow_directory_symlink, ec}; - if (ec) + exploreFilesRecursive(_mediaDirectory, [&](std::error_code ec, const std::filesystem::path& path) { - LMS_LOG(DBUPDATER, ERROR) << "Cannot iterate over '" << _mediaDirectory.string() << "': " << ec.message(); - return; - } + if (ec) + return; - std::filesystem::recursive_directory_iterator itEnd; - while (_running && itPath != itEnd) - { - const std::filesystem::path& path {*itPath}; - - if (!ec) + if (isFileSupported(path, _fileExtensions)) { - if (std::filesystem::is_regular_file(path) && isFileSupported(path, _fileExtensions)) - stats.filesToScan ++; + stats.filesToScan++; if (stats.filesToScan % 250 == 0) notifyInProgressIfNeeded(stats); } - - itPath.increment(ec); - } + }); } void @@ -592,8 +580,6 @@ MediaScanner::notifyInProgressIfNeeded(const ScanStats& stats) void MediaScanner::scanAudioFile(const std::filesystem::path& file, bool forceScan, ScanStats& stats) { - notifyInProgressIfNeeded(stats); - Wt::WDateTime lastWriteTime; try { @@ -748,50 +734,23 @@ MediaScanner::scanAudioFile(const std::filesystem::path& file, bool forceScan, S void MediaScanner::scanMediaDirectory(const std::filesystem::path& mediaDirectory, bool forceScan, ScanStats& stats) { - std::error_code ec; - - std::filesystem::recursive_directory_iterator itPath {_mediaDirectory, std::filesystem::directory_options::follow_directory_symlink, ec}; - if (ec) + exploreFilesRecursive(mediaDirectory, [&](std::error_code ec, const std::filesystem::path& path) { - LMS_LOG(DBUPDATER, ERROR) << "Cannot iterate over '" << mediaDirectory.string() << "': " << ec.message(); - stats.errors.emplace_back(ScanError {mediaDirectory, ScanErrorType::CannotReadFile, ec.message()}); - return; - } - - std::filesystem::recursive_directory_iterator itEnd; - while (_running && itPath != itEnd) - { - const std::filesystem::path& path {*itPath}; - if (ec) { LMS_LOG(DBUPDATER, ERROR) << "Cannot process entry '" << path.string() << "': " << ec.message(); stats.errors.emplace_back(ScanError {path, ScanErrorType::CannotReadFile, ec.message()}); - } - else if (std::filesystem::is_directory(path)) - { - ; - } - else if (std::filesystem::is_regular_file(path)) - { - if (isFileSupported(path, _fileExtensions)) - { - scanAudioFile(path, forceScan, stats ); - } - else - { - LMS_LOG(DBUPDATER, ERROR) << "Skipped '" << path.string() << "': file not supported"; - stats.errors.emplace_back(ScanError {path, ScanErrorType::NotSupported}); - } - } - else - { - LMS_LOG(DBUPDATER, ERROR) << "Skipped '" << path.string() << "': not a regular file"; - stats.errors.emplace_back(ScanError {path, ScanErrorType::NotRegular}); + + return; } - itPath.increment(ec); - } + if (isFileSupported(path, _fileExtensions)) + { + scanAudioFile(path, forceScan, stats ); + + notifyInProgressIfNeeded(stats); + } + }); notifyInProgress(stats); } diff --git a/src/libs/scanner/include/scanner/MediaScannerStats.hpp b/src/libs/scanner/include/scanner/MediaScannerStats.hpp index 7356306e..99c898b6 100644 --- a/src/libs/scanner/include/scanner/MediaScannerStats.hpp +++ b/src/libs/scanner/include/scanner/MediaScannerStats.hpp @@ -32,8 +32,6 @@ namespace Scanner { CannotParseFile, // cannot parse file NoAudioTrack, // no audio track found BadDuration, // bad duration - NotSupported, // not supported - NotRegular, }; enum class DuplicateReason diff --git a/src/libs/utils/impl/Path.cpp b/src/libs/utils/impl/Path.cpp index a5c0d882..246215f1 100644 --- a/src/libs/utils/impl/Path.cpp +++ b/src/libs/utils/impl/Path.cpp @@ -87,3 +87,39 @@ getLastWriteTime(const std::filesystem::path& file) return Wt::WDateTime::fromTime_t(sb.st_mtime); } +void +exploreFilesRecursive(const std::filesystem::path& directory, std::function cb) +{ + std::error_code ec; + std::filesystem::directory_iterator itPath {directory, std::filesystem::directory_options::follow_directory_symlink, ec}; + + if (ec) + { + cb(ec, directory); + return; + } + + std::filesystem::directory_iterator itEnd; + while (itPath != itEnd) + { + if (ec) + { + cb(ec, *itPath); + } + else + { + if (std::filesystem::is_regular_file(*itPath, ec)) + cb(ec, *itPath); + else if (std::filesystem::is_directory(*itPath, ec)) + { + if (!ec) + exploreFilesRecursive(*itPath, cb); + else + cb(ec, *itPath); + } + } + + itPath.increment(ec); + } +} + diff --git a/src/libs/utils/include/utils/Path.hpp b/src/libs/utils/include/utils/Path.hpp index caf3a148..6367ce03 100644 --- a/src/libs/utils/include/utils/Path.hpp +++ b/src/libs/utils/include/utils/Path.hpp @@ -20,6 +20,7 @@ #pragma once #include +#include #include #include @@ -34,10 +35,13 @@ bool ensureDirectory(const std::filesystem::path& dir); // Get the last write time since Epoch Wt::WDateTime getLastWriteTime(const std::filesystem::path& dir); -namespace std { +void exploreFilesRecursive(const std::filesystem::path& directory, std::function cb); + +namespace std +{ template <> - struct hash { + struct hash + { inline std::size_t operator()(const std::filesystem::path &path) const { return hash_value(path); } }; } - diff --git a/src/lms/ui/admin/DatabaseStatus.cpp b/src/lms/ui/admin/DatabaseStatus.cpp index 017ef1a8..34133e01 100644 --- a/src/lms/ui/admin/DatabaseStatus.cpp +++ b/src/lms/ui/admin/DatabaseStatus.cpp @@ -94,8 +94,6 @@ class ReportResource : public Wt::WResource case Scanner::ScanErrorType::CannotParseFile: return Wt::WString::tr("Lms.Admin.Database.Status.cannot-parse-file"); case Scanner::ScanErrorType::NoAudioTrack: return Wt::WString::tr("Lms.Admin.Database.Status.no-audio-track"); case Scanner::ScanErrorType::BadDuration: return Wt::WString::tr("Lms.Admin.Database.Status.bad-duration"); - case Scanner::ScanErrorType::NotSupported: return Wt::WString::tr("Lms.Admin.Database.Status.not-supported"); - case Scanner::ScanErrorType::NotRegular: return Wt::WString::tr("Lms.Admin.Database.Status.not-regular"); } return "?"; }