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.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 {
|
||||
|
||||
@@ -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<Int> {
|
||||
fun MangasPage.insertOrUpdate(sourceId: Long): List<Int> {
|
||||
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(
|
||||
|
||||
Reference in New Issue
Block a user