From 306eb0e3c774b5a8d0d2d4ade2d7091904fe6e58 Mon Sep 17 00:00:00 2001 From: Mitchell Syer Date: Thu, 6 Jun 2024 21:17:17 -0400 Subject: [PATCH] Update manga info when browsing if not in library (#958) * Update manga info when browsing if not in library * Cleanup --- .../graphql/mutations/SourceMutation.kt | 4 +- .../tachidesk/manga/impl/MangaList.kt | 43 ++++++++++++++++--- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/SourceMutation.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/SourceMutation.kt index a0359997..e7c679c5 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/SourceMutation.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/SourceMutation.kt @@ -19,7 +19,7 @@ import suwayomi.tachidesk.graphql.types.SourceMetaType import suwayomi.tachidesk.graphql.types.SourceType import suwayomi.tachidesk.graphql.types.preferenceOf import suwayomi.tachidesk.graphql.types.updateFilterList -import suwayomi.tachidesk.manga.impl.MangaList.insertOrGet +import suwayomi.tachidesk.manga.impl.MangaList.insertOrUpdate import suwayomi.tachidesk.manga.impl.Source import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource import suwayomi.tachidesk.manga.model.table.MangaTable @@ -135,7 +135,7 @@ class SourceMutation { } } - val mangaIds = mangasPage.insertOrGet(sourceId) + val mangaIds = mangasPage.insertOrUpdate(sourceId) val mangas = transaction { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/MangaList.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/MangaList.kt index 129dc52d..82bbe9b9 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/MangaList.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/MangaList.kt @@ -8,14 +8,17 @@ package suwayomi.tachidesk.manga.impl * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import eu.kanade.tachiyomi.source.model.MangasPage +import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.batchInsert import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.statements.BatchUpdateStatement import org.jetbrains.exposed.sql.transactions.transaction import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub import suwayomi.tachidesk.manga.model.dataclass.PagedMangaListDataClass import suwayomi.tachidesk.manga.model.table.MangaTable import suwayomi.tachidesk.manga.model.table.toDataClass +import java.time.Instant object MangaList { fun proxyThumbnailUrl(mangaId: Int): String { @@ -44,12 +47,12 @@ object MangaList { return mangasPage.processEntries(sourceId) } - fun MangasPage.insertOrGet(sourceId: Long): List { + fun MangasPage.insertOrUpdate(sourceId: Long): List { return transaction { val existingMangaUrlsToId = - MangaTable.slice(MangaTable.url, MangaTable.id).select { + MangaTable.select { (MangaTable.sourceReference eq sourceId) and (MangaTable.url inList mangas.map { it.url }) - }.associate { Pair(it[MangaTable.url], it[MangaTable.id].value) } + }.associateBy { it[MangaTable.url] } val existingMangaUrls = existingMangaUrlsToId.map { it.key } val mangasToInsert = mangas.filter { !existingMangaUrls.contains(it.url) } @@ -73,7 +76,37 @@ object MangaList { // delete thumbnail in case cached data still exists insertedMangaUrlsToId.forEach { (_, id) -> Manga.clearThumbnail(id) } - val mangaUrlsToId = existingMangaUrlsToId + insertedMangaUrlsToId + val mangaToUpdate = + mangas.mapNotNull { sManga -> + existingMangaUrlsToId[sManga.url]?.let { sManga to it } + }.filterNot { (_, resultRow) -> + resultRow[MangaTable.inLibrary] + } + + BatchUpdateStatement(MangaTable).apply { + mangaToUpdate.forEach { (sManga, manga) -> + addBatch(EntityID(manga[MangaTable.id].value, MangaTable)) + this[MangaTable.title] = sManga.title + this[MangaTable.artist] = sManga.artist + this[MangaTable.author] = sManga.author + this[MangaTable.description] = sManga.description + this[MangaTable.genre] = sManga.genre + this[MangaTable.status] = sManga.status + this[MangaTable.thumbnail_url] = sManga.thumbnail_url + this[MangaTable.updateStrategy] = sManga.update_strategy.name + if (!sManga.thumbnail_url.isNullOrEmpty() && manga[MangaTable.thumbnail_url] != sManga.thumbnail_url) { + this[MangaTable.thumbnailUrlLastFetched] = Instant.now().epochSecond + Manga.clearThumbnail(manga[MangaTable.id].value) + } else { + this[MangaTable.thumbnailUrlLastFetched] = manga[MangaTable.thumbnailUrlLastFetched] + } + } + execute(this@transaction) + } + + val mangaUrlsToId = + existingMangaUrlsToId + .mapValues { it.value[MangaTable.id].value } + insertedMangaUrlsToId mangas.map { manga -> mangaUrlsToId[manga.url] @@ -86,7 +119,7 @@ object MangaList { val mangasPage = this val mangaList = transaction { - val mangaIds = insertOrGet(sourceId) + val mangaIds = insertOrUpdate(sourceId) return@transaction MangaTable.select { MangaTable.id inList mangaIds }.map { MangaTable.toDataClass(it) } } return PagedMangaListDataClass(