From 33ec15c13698fda86443e3f7fb5926f553c73ce6 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Wed, 17 Jun 2026 13:24:38 -0400 Subject: [PATCH] Simplify fetching manga and chapters --- .../graphql/mutations/ChapterMutation.kt | 3 +- .../graphql/mutations/MangaMutation.kt | 21 ++++-------- .../suwayomi/tachidesk/manga/impl/Manga.kt | 32 ++++++++++++++++++- .../tachidesk/manga/impl/update/Updater.kt | 8 ++--- .../tachidesk/opds/impl/OpdsFeedBuilder.kt | 4 +-- 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/ChapterMutation.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/ChapterMutation.kt index 8e3375fd3..78e16f244 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/ChapterMutation.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/ChapterMutation.kt @@ -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 { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/MangaMutation.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/MangaMutation.kt index 39011fdf3..c970495bb 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/MangaMutation.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/MangaMutation.kt @@ -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 { 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 2684c29f7..5d9fcf055 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Manga.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Manga.kt @@ -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, diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt index 1e7b34ca9..c0b98942b 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/Updater.kt @@ -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}" } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/opds/impl/OpdsFeedBuilder.kt b/server/src/main/kotlin/suwayomi/tachidesk/opds/impl/OpdsFeedBuilder.kt index 6451a23cb..e7e8c81c8 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/opds/impl/OpdsFeedBuilder.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/opds/impl/OpdsFeedBuilder.kt @@ -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) =