diff --git a/approot/admin-database.xml b/approot/admin-database.xml
index 8b6a1173..d455b4fc 100644
--- a/approot/admin-database.xml
+++ b/approot/admin-database.xml
@@ -16,6 +16,7 @@
${media-directory}
${media-directory-info class="help-block"}
+ ${tr:Lms.Admin.Database.path-help}
diff --git a/approot/messages.xml b/approot/messages.xml
index ee2a721c..06e52b7d 100644
--- a/approot/messages.xml
+++ b/approot/messages.xml
@@ -42,6 +42,7 @@
Never
Media root directory
+Directories containing a .lmsignore file are skipped
Recommendation engine
Tags based
Audio analysis based
diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml
index 4e4c9af7..c8dbaeb6 100644
--- a/approot/messages_fr.xml
+++ b/approot/messages_fr.xml
@@ -42,6 +42,7 @@
Jamais
Dossier racine des fichiers de musique
+Les dossiers contenant un fichier .lmsignore sont ignorés
Moteur de recommandation
Basé sur les tags
Basé sur l'analyse audio
diff --git a/src/libs/scanner/impl/Scanner.cpp b/src/libs/scanner/impl/Scanner.cpp
index 064b5a4c..3a95b646 100644
--- a/src/libs/scanner/impl/Scanner.cpp
+++ b/src/libs/scanner/impl/Scanner.cpp
@@ -43,6 +43,8 @@ using namespace Database;
namespace {
+const std::filesystem::path excludeDirFileName {".lmsignore"};
+
Wt::WDate
getNextMonday(Wt::WDate current)
{
@@ -74,7 +76,7 @@ isFileSupported(const std::filesystem::path& file, const std::unordered_set cb)
+exploreFilesRecursive(const std::filesystem::path& directory, std::function cb, const std::filesystem::path& excludeDirFileName)
{
std::error_code ec;
std::filesystem::directory_iterator itPath {directory, std::filesystem::directory_options::follow_directory_symlink, ec};
@@ -90,6 +90,17 @@ exploreFilesRecursive(const std::filesystem::path& directory, std::function cb);
+bool exploreFilesRecursive(const std::filesystem::path& directory, std::function cb, const std::filesystem::path& excludeDirFileName = {});
namespace std
{