mirror of
https://github.com/Suwayomi/Suwayomi-Server.git
synced 2026-07-04 03:14:40 -05:00
handle when title is changing properly
This commit is contained in:
@@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.source
|
|||||||
|
|
||||||
// import com.github.junrar.Archive
|
// import com.github.junrar.Archive
|
||||||
// import java.util.zip.ZipFile
|
// import java.util.zip.ZipFile
|
||||||
import com.google.gson.JsonParser
|
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
import eu.kanade.tachiyomi.source.model.Filter
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||||
@@ -170,7 +169,7 @@ class LocalSource(override val baseUrl: String = "") : HttpSource() {
|
|||||||
url = mangaDir.name
|
url = mangaDir.name
|
||||||
|
|
||||||
// Try to find the cover
|
// Try to find the cover
|
||||||
val cover = File("${applicationDirs.localMangaRoot}/$title/cover.jpg")
|
val cover = File("${applicationDirs.localMangaRoot}/$url/cover.jpg")
|
||||||
if (cover.exists()) {
|
if (cover.exists()) {
|
||||||
thumbnail_url = "http://${cover.absolutePath}"
|
thumbnail_url = "http://${cover.absolutePath}"
|
||||||
}
|
}
|
||||||
@@ -209,7 +208,6 @@ class LocalSource(override val baseUrl: String = "") : HttpSource() {
|
|||||||
?.apply {
|
?.apply {
|
||||||
val obj = json.decodeFromStream<JsonObject>(inputStream())
|
val obj = json.decodeFromStream<JsonObject>(inputStream())
|
||||||
|
|
||||||
|
|
||||||
manga.title = obj["title"]?.jsonPrimitive?.contentOrNull ?: manga.title
|
manga.title = obj["title"]?.jsonPrimitive?.contentOrNull ?: manga.title
|
||||||
manga.author = obj["author"]?.jsonPrimitive?.contentOrNull ?: manga.author
|
manga.author = obj["author"]?.jsonPrimitive?.contentOrNull ?: manga.author
|
||||||
manga.artist = obj["artist"]?.jsonPrimitive?.contentOrNull ?: manga.artist
|
manga.artist = obj["artist"]?.jsonPrimitive?.contentOrNull ?: manga.artist
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ import org.jetbrains.exposed.sql.select
|
|||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.sql.transactions.transaction
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.sql.update
|
||||||
import suwayomi.tachidesk.manga.impl.Manga.getManga
|
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.Page.getPageName
|
||||||
import suwayomi.tachidesk.manga.impl.util.GetHttpSource.getHttpSource
|
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.lang.awaitSingle
|
||||||
import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse
|
import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.ChapterDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.ChapterDataClass
|
||||||
|
|||||||
@@ -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.network.await
|
||||||
import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse.clearCachedImage
|
import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse.clearCachedImage
|
||||||
import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse.getCachedImageResponse
|
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.MangaDataClass
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.toGenreList
|
import suwayomi.tachidesk.manga.model.dataclass.toGenreList
|
||||||
import suwayomi.tachidesk.manga.model.table.MangaMetaTable
|
import suwayomi.tachidesk.manga.model.table.MangaMetaTable
|
||||||
@@ -75,7 +76,13 @@ object Manga {
|
|||||||
|
|
||||||
transaction {
|
transaction {
|
||||||
MangaTable.update({ MangaTable.id eq mangaId }) {
|
MangaTable.update({ MangaTable.id eq mangaId }) {
|
||||||
|
|
||||||
|
if (fetchedManga.title != mangaEntry[MangaTable.title]) {
|
||||||
|
val canUpdateTitle = updateMangaDownloadDir(mangaId, fetchedManga.title)
|
||||||
|
|
||||||
|
if (canUpdateTitle)
|
||||||
it[MangaTable.title] = fetchedManga.title
|
it[MangaTable.title] = fetchedManga.title
|
||||||
|
}
|
||||||
it[MangaTable.initialized] = true
|
it[MangaTable.initialized] = true
|
||||||
|
|
||||||
it[MangaTable.artist] = fetchedManga.artist
|
it[MangaTable.artist] = fetchedManga.artist
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ import org.kodein.di.DI
|
|||||||
import org.kodein.di.conf.global
|
import org.kodein.di.conf.global
|
||||||
import org.kodein.di.instance
|
import org.kodein.di.instance
|
||||||
import suwayomi.tachidesk.manga.impl.util.GetHttpSource.getHttpSource
|
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.lang.awaitSingle
|
||||||
import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse
|
import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse
|
||||||
import suwayomi.tachidesk.manga.impl.util.storage.CachedImageResponse.getCachedImageResponse
|
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.ChapterTable
|
||||||
import suwayomi.tachidesk.manga.model.table.MangaTable
|
import suwayomi.tachidesk.manga.model.table.MangaTable
|
||||||
import suwayomi.tachidesk.manga.model.table.PageTable
|
import suwayomi.tachidesk.manga.model.table.PageTable
|
||||||
@@ -92,21 +92,4 @@ object Page {
|
|||||||
private fun formatPageName(index: Int) = String.format("%03d", index)
|
private fun formatPageName(index: Int) = String.format("%03d", index)
|
||||||
|
|
||||||
private val applicationDirs by DI.global.instance<ApplicationDirs>()
|
private val applicationDirs by DI.global.instance<ApplicationDirs>()
|
||||||
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<ApplicationDirs>()
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user