diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/MangaIndex.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/MangaIndex.kt index 9ace45a82..eb216a140 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/MangaIndex.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/MangaIndex.kt @@ -84,7 +84,7 @@ class MangaIndex(source: String?) { fun getCoverEntry(): String? = json.getStringOrNull("cover_entry") - fun addChapter(chapter: MangaChapter) { + fun addChapter(chapter: MangaChapter, filename: String?) { val chapters = json.getJSONObject("chapters") if (!chapters.has(chapter.id.toString())) { val jo = JSONObject() @@ -95,6 +95,7 @@ class MangaIndex(source: String?) { jo.put("scanlator", chapter.scanlator) jo.put("branch", chapter.branch) jo.put("entries", "%08d_%03d\\d{3}".format(chapter.branch.hashCode(), chapter.number)) + jo.put("file", filename) chapters.put(chapter.id.toString(), jo) } } @@ -103,6 +104,10 @@ class MangaIndex(source: String?) { return json.getJSONObject("chapters").remove(id.toString()) != null } + fun getChapterFileName(chapterId: Long): String? { + return json.optJSONObject("chapters")?.optJSONObject(chapterId.toString())?.getStringOrNull("file") + } + fun setCoverEntry(name: String) { json.put("cover_entry", name) } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaDirOutput.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaDirOutput.kt index 0948d37af..4e97b188e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaDirOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaDirOutput.kt @@ -54,7 +54,7 @@ class LocalMangaDirOutput( runInterruptible(Dispatchers.IO) { output.put(name, file) } - index.addChapter(chapter) + index.addChapter(chapter, chapterFileName(chapter)) } override suspend fun flushChapter(chapter: MangaChapter): Boolean { @@ -105,7 +105,18 @@ class LocalMangaDirOutput( } private fun chapterFileName(chapter: MangaChapter): String { - return "${chapter.number}_${chapter.name.toFileNameSafe()}".take(18) + ".cbz" + index.getChapterFileName(chapter.id)?.let { + return it + } + val baseName = "${chapter.number}_${chapter.name.toFileNameSafe()}".take(18) + var i = 0 + while (true) { + val name = (if (i == 0) baseName else baseName + "_$i") + ".cbz" + if (!File(rootFile, name).exists()) { + return name + } + i++ + } } private suspend fun flushIndex() = runInterruptible(Dispatchers.IO) { diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaZipOutput.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaZipOutput.kt index 412edc40f..6c1fda62e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaZipOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaZipOutput.kt @@ -57,7 +57,7 @@ class LocalMangaZipOutput( runInterruptible(Dispatchers.IO) { output.put(name, file) } - index.addChapter(chapter) + index.addChapter(chapter, null) } override suspend fun flushChapter(chapter: MangaChapter): Boolean = false @@ -98,7 +98,7 @@ class LocalMangaZipOutput( } otherIndex?.getMangaInfo()?.chapters?.let { chapters -> for (chapter in chapters) { - index.addChapter(chapter) + index.addChapter(chapter, null) } } }