From 5e5bb41585696cfe1031fd38e8fe53103a07277d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= <127139797+balazs-szucs@users.noreply.github.com> Date: Sun, 7 Dec 2025 23:16:53 +0100 Subject: [PATCH] fix(bookdrop): improve file filtering to ignore .caltrash (calibre generated trash file) (#1785) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Balázs Szücs --- .../service/bookdrop/BookdropMonitoringService.java | 7 ++++--- .../booklore/service/library/LibraryFileHelper.java | 2 +- .../com/adityachandel/booklore/util/FileUtils.java | 12 ++++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/service/bookdrop/BookdropMonitoringService.java b/booklore-api/src/main/java/com/adityachandel/booklore/service/bookdrop/BookdropMonitoringService.java index f7e8e13d5..02e3a1120 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/service/bookdrop/BookdropMonitoringService.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/service/bookdrop/BookdropMonitoringService.java @@ -3,6 +3,7 @@ package com.adityachandel.booklore.service.bookdrop; import com.adityachandel.booklore.config.AppProperties; import com.adityachandel.booklore.model.enums.BookFileExtension; import com.adityachandel.booklore.util.FileService; +import com.adityachandel.booklore.util.FileUtils; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import lombok.extern.slf4j.Slf4j; @@ -147,14 +148,14 @@ public class BookdropMonitoringService { try (Stream pathStream = Files.walk(fullPath)) { pathStream .filter(Files::isRegularFile) - .filter(path -> !path.getFileName().toString().startsWith(".")) + .filter(path -> !FileUtils.shouldIgnore(path)) .filter(path -> BookFileExtension.fromFileName(path.getFileName().toString()).isPresent()) .forEach(path -> eventHandler.enqueueFile(path, StandardWatchEventKinds.ENTRY_CREATE)); } catch (IOException e) { log.error("Failed to scan new directory: {}", fullPath, e); } } else { - if (!(!fullPath.getFileName().toString().isEmpty() && fullPath.getFileName().toString().charAt(0) == '.')) { + if (!FileUtils.shouldIgnore(fullPath)) { if (BookFileExtension.fromFileName(fullPath.getFileName().toString()).isPresent()) { eventHandler.enqueueFile(fullPath, kind); } else { @@ -188,7 +189,7 @@ public class BookdropMonitoringService { private void scanExistingBookdropFiles() { try (Stream files = Files.walk(bookdrop)) { files.filter(Files::isRegularFile) - .filter(path -> !(!path.getFileName().toString().isEmpty() && path.getFileName().toString().charAt(0) == '.')) + .filter(path -> !FileUtils.shouldIgnore(path)) .filter(path -> BookFileExtension.fromFileName(path.getFileName().toString()).isPresent()) .forEach(file -> { log.info("Found existing supported file on startup: {}", file); diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/service/library/LibraryFileHelper.java b/booklore-api/src/main/java/com/adityachandel/booklore/service/library/LibraryFileHelper.java index c5b41bc3a..15468bf0d 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/service/library/LibraryFileHelper.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/service/library/LibraryFileHelper.java @@ -34,6 +34,7 @@ public class LibraryFileHelper { try (Stream stream = Files.walk(libraryPath, FileVisitOption.FOLLOW_LINKS)) { return stream.filter(Files::isRegularFile) + .filter(path -> !FileUtils.shouldIgnore(path)) .map(fullPath -> { String fileName = fullPath.getFileName().toString(); Optional bookExtension = BookFileExtension.fromFileName(fileName); @@ -51,7 +52,6 @@ public class LibraryFileHelper { .build(); }) .filter(Objects::nonNull) - .filter(file -> !file.getFileName().startsWith(".")) .toList(); } } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/util/FileUtils.java b/booklore-api/src/main/java/com/adityachandel/booklore/util/FileUtils.java index fb299056f..1c035c04f 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/util/FileUtils.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/util/FileUtils.java @@ -59,4 +59,16 @@ public class FileUtils { .forEach(File::delete); } } + + public boolean shouldIgnore(Path path) { + if (!path.getFileName().toString().isEmpty() && path.getFileName().toString().charAt(0) == '.') { + return true; + } + for (Path part : path) { + if (".caltrash".equals(part.toString())) { + return true; + } + } + return false; + } } \ No newline at end of file