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 abcac17fe..9ace45a82 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 @@ -132,6 +132,20 @@ class MangaIndex(source: String?) { json.put("chapters", newJo) } + fun clear() { + val keys = json.keys() + while (keys.hasNext()) { + json.remove(keys.next()) + } + } + + fun setFrom(other: MangaIndex) { + clear() + other.json.keys().forEach { key -> + json.putOpt(key, other.json.opt(key)) + } + } + private fun getChapters(json: JSONObject, source: MangaSource): List { val chapters = ArrayList(json.length()) for (k in json.keys()) { diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaInput.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaInput.kt index 7fc903a13..64f076741 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaInput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/input/LocalMangaInput.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaSource import java.io.File -abstract class LocalMangaInput( +sealed class LocalMangaInput( protected val root: File, ) { 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 29343fe3b..a96b9979f 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 @@ -92,6 +92,10 @@ class LocalMangaDirOutput( index.removeChapter(chapterId) } + fun setIndex(newIndex: MangaIndex) { + index.setFrom(newIndex) + } + private suspend fun ZipOutput.flushAndFinish() = runInterruptible(Dispatchers.IO) { finish() close() diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaOutput.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaOutput.kt index 55ceb940a..a486c46f0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaOutput.kt @@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.util.toFileNameSafe import java.io.File -abstract class LocalMangaOutput( +sealed class LocalMangaOutput( val rootFile: File, ) : Closeable { diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaUtil.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaUtil.kt new file mode 100644 index 000000000..ae6f8a834 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/output/LocalMangaUtil.kt @@ -0,0 +1,58 @@ +package org.koitharu.kotatsu.local.data.output + +import androidx.core.net.toFile +import androidx.core.net.toUri +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runInterruptible +import org.koitharu.kotatsu.local.data.MangaIndex +import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaSource + +class LocalMangaUtil( + private val manga: Manga, +) { + + init { + require(manga.source == MangaSource.LOCAL) { + "Expected LOCAL source but ${manga.source} found" + } + } + + suspend fun deleteChapters(ids: Set) { + newOutput().use { output -> + when (output) { + is LocalMangaZipOutput -> runInterruptible(Dispatchers.IO) { + LocalMangaZipOutput.filterChapters(output, ids) + } + + is LocalMangaDirOutput -> { + for (id in ids) { + output.deleteChapter(id) + } + output.finish() + } + } + } + } + + suspend fun writeIndex(index: MangaIndex) { + newOutput().use { output -> + when (output) { + is LocalMangaDirOutput -> { + TODO() + } + + is LocalMangaZipOutput -> TODO() + } + } + } + + private suspend fun newOutput(): LocalMangaOutput = runInterruptible(Dispatchers.IO) { + val file = manga.url.toUri().toFile() + if (file.isDirectory) { + LocalMangaDirOutput(file, manga) + } else { + LocalMangaZipOutput(file, manga) + } + } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt index 3c19e9d86..c2383b572 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt @@ -14,8 +14,7 @@ import org.koitharu.kotatsu.local.data.LocalManga import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.local.data.TempFileFilter import org.koitharu.kotatsu.local.data.input.LocalMangaInput -import org.koitharu.kotatsu.local.data.output.LocalMangaDirOutput -import org.koitharu.kotatsu.local.data.output.LocalMangaZipOutput +import org.koitharu.kotatsu.local.data.output.LocalMangaUtil import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaPage @@ -90,21 +89,7 @@ class LocalMangaRepository @Inject constructor(private val storageManager: Local suspend fun deleteChapters(manga: Manga, ids: Set) { lockManga(manga.id) try { - val uri = Uri.parse(manga.url) - val file = uri.toFile() - if (file.isDirectory) { - LocalMangaDirOutput(file, manga).use { output -> - for (id in ids) { - output.deleteChapter(id) - } - output.finish() - } - } else { - runInterruptible(Dispatchers.IO) { - val cbz = LocalMangaZipOutput(file, manga) - LocalMangaZipOutput.filterChapters(cbz, ids) - } - } + LocalMangaUtil(manga).deleteChapters(ids) } finally { unlockManga(manga.id) }