From a5d584eeb0fe46d8461a1ac523fa152ae3d285bf Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sun, 4 Oct 2026 17:42:34 +0600 Subject: [PATCH] Sanitize the scanlator in chapter download folder names A "/" in the scanlator nested the chapter in a folder of its own, where the download was never found again. Names built from the unsanitized scanlator are still looked up. --- .../data/download/DownloadProvider.kt | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt index 5e5f5e442..6c8b5d9e0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt @@ -168,10 +168,13 @@ class DownloadProvider( chapterUrl: String, disallowNonAsciiFilenames: Boolean = libraryPreferences.disallowNonAsciiFilenames.get(), enableChapterNameHash: Boolean = libraryPreferences.enableChapterNameHash.get(), + sanitizeScanlator: Boolean = true, ): String { return buildString { if (!chapterScanlator.isNullOrBlank()) { - append(chapterScanlator + "_") + // A "/" in the scanlator would otherwise nest the chapter in a folder of its own + append(if (sanitizeScanlator) DiskUtil.buildValidFilename(chapterScanlator) else chapterScanlator) + append("_") } // Subtract 7 bytes for hash and underscore, 4 bytes for .cbz @@ -226,11 +229,28 @@ class DownloadProvider( ) } + // Scanlators weren't sanitized for a while. One with a "/" nested its folder, so it was never found anyway. + val unsanitizedScanlatorChapterDirNames = if (chapterScanlator != null && '/' !in chapterScanlator) { + booleanPairPermutation.map { (disallowNonAsciiFilenames, enableChapterNameHash) -> + getChapterDirName( + chapterName, + chapterScanlator, + chapterUrl, + disallowNonAsciiFilenames, + enableChapterNameHash, + sanitizeScanlator = false, + ) + } + } else { + emptyList() + } + return buildSet { // Chapter name without hash (unable to handle duplicate // chapter names) add(chapterNameV1) addAll(othersChapterDirNames) + addAll(unsanitizedScanlatorChapterDirNames) } }