From 5fc28ef71174e52b641ddf07d826a43010541da1 Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Sat, 18 Sep 2021 02:10:35 +0430 Subject: [PATCH] handle when title is changing properly --- .../eu/kanade/tachiyomi/source/LocalSource.kt | 4 +- .../suwayomi/tachidesk/manga/impl/Chapter.kt | 2 +- .../suwayomi/tachidesk/manga/impl/Manga.kt | 9 ++- .../suwayomi/tachidesk/manga/impl/Page.kt | 19 +----- .../tachidesk/manga/impl/util/DirName.kt | 66 +++++++++++++++++++ 5 files changed, 77 insertions(+), 23 deletions(-) create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/DirName.kt diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/source/LocalSource.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/source/LocalSource.kt index dbc1fd3d..1fad2a0e 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/source/LocalSource.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/source/LocalSource.kt @@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.source // import com.github.junrar.Archive // import java.util.zip.ZipFile -import com.google.gson.JsonParser import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage @@ -170,7 +169,7 @@ class LocalSource(override val baseUrl: String = "") : HttpSource() { url = mangaDir.name // Try to find the cover - val cover = File("${applicationDirs.localMangaRoot}/$title/cover.jpg") + val cover = File("${applicationDirs.localMangaRoot}/$url/cover.jpg") if (cover.exists()) { thumbnail_url = "http://${cover.absolutePath}" } @@ -209,7 +208,6 @@ class LocalSource(override val baseUrl: String = "") : HttpSource() { ?.apply { val obj = json.decodeFromStream(inputStream()) - manga.title = obj["title"]?.jsonPrimitive?.contentOrNull ?: manga.title manga.author = obj["author"]?.jsonPrimitive?.contentOrNull ?: manga.author manga.artist = obj["artist"]?.jsonPrimitive?.contentOrNull ?: manga.artist diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt index c39bf58e..454d64f5 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt @@ -18,9 +18,9 @@ import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.update import suwayomi.tachidesk.manga.impl.Manga.getManga -import suwayomi.tachidesk.manga.impl.Page.getChapterDir import suwayomi.tachidesk.manga.impl.Page.getPageName import suwayomi.tachidesk.manga.impl.util.GetHttpSource.getHttpSource +import suwayomi.tachidesk.manga.impl.util.getChapterDir import suwayomi.tachidesk.manga.impl.util.lang.awaitSingle import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse import suwayomi.tachidesk.manga.model.dataclass.ChapterDataClass diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Manga.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Manga.kt index 24ea5d1c..b0c44539 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Manga.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Manga.kt @@ -24,6 +24,7 @@ import suwayomi.tachidesk.manga.impl.util.lang.awaitSingle import suwayomi.tachidesk.manga.impl.util.network.await import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse.clearCachedImage import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse.getCachedImageResponse +import suwayomi.tachidesk.manga.impl.util.updateMangaDownloadDir import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass import suwayomi.tachidesk.manga.model.dataclass.toGenreList import suwayomi.tachidesk.manga.model.table.MangaMetaTable @@ -75,7 +76,13 @@ object Manga { transaction { MangaTable.update({ MangaTable.id eq mangaId }) { - it[MangaTable.title] = fetchedManga.title + + if (fetchedManga.title != mangaEntry[MangaTable.title]) { + val canUpdateTitle = updateMangaDownloadDir(mangaId, fetchedManga.title) + + if (canUpdateTitle) + it[MangaTable.title] = fetchedManga.title + } it[MangaTable.initialized] = true it[MangaTable.artist] = fetchedManga.artist diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Page.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Page.kt index aa3d7f80..fe9335d8 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Page.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Page.kt @@ -17,10 +17,10 @@ import org.kodein.di.DI import org.kodein.di.conf.global import org.kodein.di.instance import suwayomi.tachidesk.manga.impl.util.GetHttpSource.getHttpSource +import suwayomi.tachidesk.manga.impl.util.getChapterDir import suwayomi.tachidesk.manga.impl.util.lang.awaitSingle import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse.getCachedImageResponse -import suwayomi.tachidesk.manga.impl.util.storage.SafePath import suwayomi.tachidesk.manga.model.table.ChapterTable import suwayomi.tachidesk.manga.model.table.MangaTable import suwayomi.tachidesk.manga.model.table.PageTable @@ -92,21 +92,4 @@ object Page { private fun formatPageName(index: Int) = String.format("%03d", index) private val applicationDirs by DI.global.instance() - - fun getChapterDir(mangaId: Int, chapterId: Int): String { - val mangaEntry = transaction { MangaTable.select { MangaTable.id eq mangaId }.first() } - val source = getHttpSource(mangaEntry[MangaTable.sourceReference]) - val chapterEntry = transaction { ChapterTable.select { ChapterTable.id eq chapterId }.first() } - - val sourceDir = source.toString() - val mangaDir = SafePath.buildValidFilename(mangaEntry[MangaTable.title]) - val chapterDir = SafePath.buildValidFilename( - when { - chapterEntry[ChapterTable.scanlator] != null -> "${chapterEntry[ChapterTable.scanlator]}_${chapterEntry[ChapterTable.name]}" - else -> chapterEntry[ChapterTable.name] - } - ) - - return "${applicationDirs.mangaRoot}/$sourceDir/$mangaDir/$chapterDir" - } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/DirName.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/DirName.kt new file mode 100644 index 00000000..7ce18377 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/DirName.kt @@ -0,0 +1,66 @@ +package suwayomi.tachidesk.manga.impl.util + +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.transactions.transaction +import org.kodein.di.DI +import org.kodein.di.conf.global +import org.kodein.di.instance +import suwayomi.tachidesk.manga.impl.util.storage.SafePath +import suwayomi.tachidesk.manga.model.table.ChapterTable +import suwayomi.tachidesk.manga.model.table.MangaTable +import suwayomi.tachidesk.server.ApplicationDirs +import java.io.File + + +private val applicationDirs by DI.global.instance() + +fun getMangaDir(mangaId: Int): String { + val mangaEntry = transaction { MangaTable.select { MangaTable.id eq mangaId }.first() } + val source = GetHttpSource.getHttpSource(mangaEntry[MangaTable.sourceReference]) + + val sourceDir = source.toString() + val mangaDir = SafePath.buildValidFilename(mangaEntry[MangaTable.title]) + + return "$applicationDirs.mangaRoot}/$sourceDir/$mangaDir" +} + +fun getChapterDir(mangaId: Int, chapterId: Int): String { + val chapterEntry = transaction { ChapterTable.select { ChapterTable.id eq chapterId }.first() } + + val chapterDir = SafePath.buildValidFilename( + when { + chapterEntry[ChapterTable.scanlator] != null -> "${chapterEntry[ChapterTable.scanlator]}_${chapterEntry[ChapterTable.name]}" + else -> chapterEntry[ChapterTable.name] + } + ) + + return getMangaDir(mangaId) + "/$chapterDir" +} + +/** return value says if rename/move was successful */ +fun updateMangaDownloadDir(mangaId: Int, newTitle: String): Boolean { + val mangaEntry = transaction { MangaTable.select { MangaTable.id eq mangaId }.first() } + val source = GetHttpSource.getHttpSource(mangaEntry[MangaTable.sourceReference]) + + val sourceDir = source.toString() + val mangaDir = SafePath.buildValidFilename(mangaEntry[MangaTable.title]) + + val newMangaDir = SafePath.buildValidFilename(newTitle) + + val oldDir = "${applicationDirs.mangaRoot}/$sourceDir/$mangaDir" + val newDir = "${applicationDirs.mangaRoot}/$sourceDir/$newMangaDir" + + val oldDirFile = File(oldDir) + val newDirFile = File(newDir) + + return if (oldDirFile.exists()) + oldDirFile.renameTo(newDirFile) + else true +}