mirror of
https://github.com/Suwayomi/Suwayomi-Server.git
synced 2026-07-03 10:54:38 -05:00
Update manga info when browsing if not in library (#958)
* Update manga info when browsing if not in library * Cleanup
This commit is contained in:
@@ -19,7 +19,7 @@ import suwayomi.tachidesk.graphql.types.SourceMetaType
|
|||||||
import suwayomi.tachidesk.graphql.types.SourceType
|
import suwayomi.tachidesk.graphql.types.SourceType
|
||||||
import suwayomi.tachidesk.graphql.types.preferenceOf
|
import suwayomi.tachidesk.graphql.types.preferenceOf
|
||||||
import suwayomi.tachidesk.graphql.types.updateFilterList
|
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.Source
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource
|
||||||
import suwayomi.tachidesk.manga.model.table.MangaTable
|
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 =
|
val mangas =
|
||||||
transaction {
|
transaction {
|
||||||
|
|||||||
@@ -8,14 +8,17 @@ package suwayomi.tachidesk.manga.impl
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
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.and
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.sql.batchInsert
|
||||||
import org.jetbrains.exposed.sql.select
|
import org.jetbrains.exposed.sql.select
|
||||||
|
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.sql.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.PagedMangaListDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.PagedMangaListDataClass
|
||||||
import suwayomi.tachidesk.manga.model.table.MangaTable
|
import suwayomi.tachidesk.manga.model.table.MangaTable
|
||||||
import suwayomi.tachidesk.manga.model.table.toDataClass
|
import suwayomi.tachidesk.manga.model.table.toDataClass
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
object MangaList {
|
object MangaList {
|
||||||
fun proxyThumbnailUrl(mangaId: Int): String {
|
fun proxyThumbnailUrl(mangaId: Int): String {
|
||||||
@@ -44,12 +47,12 @@ object MangaList {
|
|||||||
return mangasPage.processEntries(sourceId)
|
return mangasPage.processEntries(sourceId)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun MangasPage.insertOrGet(sourceId: Long): List<Int> {
|
fun MangasPage.insertOrUpdate(sourceId: Long): List<Int> {
|
||||||
return transaction {
|
return transaction {
|
||||||
val existingMangaUrlsToId =
|
val existingMangaUrlsToId =
|
||||||
MangaTable.slice(MangaTable.url, MangaTable.id).select {
|
MangaTable.select {
|
||||||
(MangaTable.sourceReference eq sourceId) and (MangaTable.url inList mangas.map { it.url })
|
(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 existingMangaUrls = existingMangaUrlsToId.map { it.key }
|
||||||
|
|
||||||
val mangasToInsert = mangas.filter { !existingMangaUrls.contains(it.url) }
|
val mangasToInsert = mangas.filter { !existingMangaUrls.contains(it.url) }
|
||||||
@@ -73,7 +76,37 @@ object MangaList {
|
|||||||
// delete thumbnail in case cached data still exists
|
// delete thumbnail in case cached data still exists
|
||||||
insertedMangaUrlsToId.forEach { (_, id) -> Manga.clearThumbnail(id) }
|
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 ->
|
mangas.map { manga ->
|
||||||
mangaUrlsToId[manga.url]
|
mangaUrlsToId[manga.url]
|
||||||
@@ -86,7 +119,7 @@ object MangaList {
|
|||||||
val mangasPage = this
|
val mangasPage = this
|
||||||
val mangaList =
|
val mangaList =
|
||||||
transaction {
|
transaction {
|
||||||
val mangaIds = insertOrGet(sourceId)
|
val mangaIds = insertOrUpdate(sourceId)
|
||||||
return@transaction MangaTable.select { MangaTable.id inList mangaIds }.map { MangaTable.toDataClass(it) }
|
return@transaction MangaTable.select { MangaTable.id inList mangaIds }.map { MangaTable.toDataClass(it) }
|
||||||
}
|
}
|
||||||
return PagedMangaListDataClass(
|
return PagedMangaListDataClass(
|
||||||
|
|||||||
Reference in New Issue
Block a user