Simplify fetching manga and chapters

This commit is contained in:
Syer10
2026-06-17 13:24:38 -04:00
parent 3a78453a02
commit 33ec15c136
5 changed files with 45 additions and 23 deletions

View File

@@ -26,6 +26,7 @@ import suwayomi.tachidesk.graphql.types.ChapterType
import suwayomi.tachidesk.graphql.types.MetaInput
import suwayomi.tachidesk.graphql.types.SyncConflictInfoType
import suwayomi.tachidesk.manga.impl.Chapter
import suwayomi.tachidesk.manga.impl.Manga
import suwayomi.tachidesk.manga.impl.chapter.getChapterDownloadReadyById
import suwayomi.tachidesk.manga.impl.sync.KoreaderSyncService
import suwayomi.tachidesk.manga.model.table.ChapterMetaTable
@@ -173,7 +174,7 @@ class ChapterMutation {
val (clientMutationId, mangaId) = input
return future {
Chapter.fetchChapterList(mangaId)
Manga.updateMangaAndChapters(mangaId, updateManga = false)
val chapters =
transaction {

View File

@@ -156,7 +156,7 @@ class MangaMutation {
val (clientMutationId, id) = input
return future {
Manga.fetchManga(id)
Manga.updateMangaAndChapters(id, updateChapters = false)
val manga =
transaction {
@@ -187,20 +187,11 @@ class MangaMutation {
val (clientMutationId, id, fetchManga, fetchChapters) = input
return future {
var mangaEntry =
transaction { MangaTable.selectAll().where { MangaTable.id eq id }.first() }
val source = getCatalogueSourceOrStub(mangaEntry[MangaTable.sourceReference])
val sMangaUpdate =
Manga.fetchMangaAndChapters(
mangaEntry = mangaEntry,
source = source,
fetchDetails = fetchManga,
fetchChapters = fetchChapters,
)
Manga.updateMangaDatabase(mangaEntry, source, sMangaUpdate.manga)
mangaEntry = transaction { MangaTable.selectAll().where { MangaTable.id eq id }.first() }
Chapter.updateChapterListDatabase(mangaEntry, sMangaUpdate.chapters, source)
Manga.updateMangaAndChapters(
mangaId = id,
updateManga = fetchManga,
updateChapters = fetchChapters
)
val (manga, chapters) =
transaction {

View File

@@ -81,7 +81,7 @@ object Manga {
return if (!onlineFetch && mangaEntry[MangaTable.initialized]) {
MangaTable.toDataClass(mangaEntry)
} else { // initialize manga
fetchManga(mangaId) ?: return MangaTable.toDataClass(mangaEntry)
updateMangaAndChapters(mangaId, updateChapters = false)
mangaEntry = transaction { MangaTable.selectAll().where { MangaTable.id eq mangaId }.first() }
@@ -152,6 +152,36 @@ object Manga {
}
}
suspend fun updateMangaAndChapters(
mangaId: Int,
updateManga: Boolean = true,
updateChapters: Boolean = true,
) {
mangaInfoMutex.get(mangaId) { Mutex() }.withLock {
var mangaEntry =
transaction { MangaTable.selectAll().where { MangaTable.id eq mangaId }.first() }
val source = getCatalogueSourceOrNull(mangaEntry[MangaTable.sourceReference])
?: throw NullPointerException("Missing source ${mangaEntry[MangaTable.sourceReference]}")
val mangaUpdate =
fetchMangaAndChapters(
mangaEntry,
source,
fetchDetails = updateManga,
fetchChapters = updateChapters,
)
if (updateManga) {
updateMangaDatabase(mangaEntry, source, mangaUpdate.manga)
mangaEntry = transaction {
MangaTable.selectAll().where { MangaTable.id eq mangaId }.first()
}
}
if (updateChapters) {
Chapter.updateChapterListDatabase(mangaEntry, mangaUpdate.chapters, source)
}
}
}
fun updateMangaDatabase(
mangaEntry: ResultRow,
source: CatalogueSource,

View File

@@ -311,10 +311,10 @@ class Updater : IUpdater {
tracker[job.manga.id] =
try {
logger.info { "Updating ${job.manga}" }
if (serverConfig.updateMangas.value || !job.manga.initialized) {
Manga.getManga(job.manga.id, true)
}
Chapter.getChapterList(job.manga.id, true)
Manga.updateMangaAndChapters(
job.manga.id,
updateManga = serverConfig.updateMangas.value || !job.manga.initialized
)
job.copy(status = JobStatus.COMPLETE)
} catch (e: Exception) {
logger.error(e) { "Error while updating ${job.manga}" }

View File

@@ -3,6 +3,7 @@ package suwayomi.tachidesk.opds.impl
import io.github.oshai.kotlinlogging.KotlinLogging
import org.jetbrains.exposed.v1.core.SortOrder
import suwayomi.tachidesk.i18n.MR
import suwayomi.tachidesk.manga.impl.Manga
import suwayomi.tachidesk.manga.impl.MangaList.proxyThumbnailUrl
import suwayomi.tachidesk.manga.model.table.ChapterTable
import suwayomi.tachidesk.opds.constants.OpdsConstants
@@ -647,8 +648,7 @@ object OpdsFeedBuilder {
// If no chapters are found in the database, attempt to fetch them from the source.
if (chapterEntries.isEmpty() && totalChapters == 0L) {
try {
suwayomi.tachidesk.manga.impl.Chapter
.fetchChapterList(mangaId)
Manga.updateMangaAndChapters(mangaId, updateManga = false)
// Re-query after fetching.
val (refetchedChapters, refetchedTotal) =