diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/service/FileSystemScanner.kt b/komga/src/main/kotlin/org/gotson/komga/domain/service/FileSystemScanner.kt index fa0512704..c9dd6a123 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/service/FileSystemScanner.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/service/FileSystemScanner.kt @@ -16,6 +16,7 @@ import java.nio.file.attribute.BasicFileAttributes import java.nio.file.attribute.FileTime import java.time.LocalDateTime import java.time.ZoneId +import kotlin.io.path.isHidden import kotlin.streams.asSequence import kotlin.time.measureTime @@ -72,6 +73,7 @@ class FileSystemScanner( val books = Files.list(dir).use { dirStream -> dirStream.asSequence() .onEach { logger.trace { "GetBooks file: $it" } } + .filterNot { Files.isHidden(it) } .filter { Files.isReadable(it) } .filter { Files.isRegularFile(it) } .filter { supportedExtensions.contains(FilenameUtils.getExtension(it.fileName.toString()).toLowerCase()) } diff --git a/komga/src/test/kotlin/org/gotson/komga/domain/service/FileSystemScannerTest.kt b/komga/src/test/kotlin/org/gotson/komga/domain/service/FileSystemScannerTest.kt index a0a9e54ba..7c2e2a80c 100644 --- a/komga/src/test/kotlin/org/gotson/komga/domain/service/FileSystemScannerTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/domain/service/FileSystemScannerTest.kt @@ -129,6 +129,27 @@ class FileSystemScannerTest { } } + @Test + fun `given directory structure with hidden files when scanning then hidden files are not returned`() { + Jimfs.newFileSystem(Configuration.unix()).use { fs -> + // given + val root = fs.getPath("/root") + Files.createDirectory(root) + + val dir1 = makeSubDir(root, "dir1", listOf("comic.cbz")) + makeSubDir(dir1, "subdir1", listOf("comic2.cbz", ".comic2.cbz")) + + // when + val scan = scanner.scanRootFolder(root) + + // then + assertThat(scan).hasSize(2) + + assertThat(scan.keys.map { it.name }).containsExactlyInAnyOrder("dir1", "subdir1") + assertThat(scan.values.flatMap { list -> list.map { it.name } }).containsExactlyInAnyOrder("comic", "comic2") + } + } + @Test fun `given file with mixed-case extension when scanning then files are returned`() { Jimfs.newFileSystem(Configuration.unix()).use { fs ->