From dcde4947e83f4850a037184aff9c158233d23a5c Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 25 Mar 2023 19:38:42 +0100 Subject: [PATCH] Emit update to clients after adding all mangas to the queue (#521) Emitting updates before all the mangas were added to the queue could lead to e.g. wrong progress calculation. --- .../manga/controller/UpdateController.kt | 15 +++++++-------- .../tachidesk/manga/impl/update/IUpdater.kt | 2 +- .../tachidesk/manga/impl/update/Updater.kt | 10 +++++++--- .../tachidesk/manga/impl/update/TestUpdater.kt | 4 ++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt index a86da540..85b78a8a 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/UpdateController.kt @@ -93,14 +93,13 @@ object UpdateController { if (clear) { updater.reset() } - categories - .flatMap { CategoryManga.getCategoryMangaList(it.id) } - .distinctBy { it.id } - .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title)) - .filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE } - .forEach { manga -> - updater.addMangaToQueue(manga) - } + updater.addMangasToQueue( + categories + .flatMap { CategoryManga.getCategoryMangaList(it.id) } + .distinctBy { it.id } + .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title)) + .filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE } + ) } fun categoryUpdateWS(ws: WsConfig) { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/IUpdater.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/IUpdater.kt index 33c20bf8..a6922572 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/IUpdater.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/update/IUpdater.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.flow.StateFlow import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass interface IUpdater { - fun addMangaToQueue(manga: MangaDataClass) + fun addMangasToQueue(mangas: List) val status: StateFlow fun reset() } 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 7316038a..5cef31ab 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 @@ -74,13 +74,17 @@ class Updater : IUpdater { return tracker.values.toList() } - override fun addMangaToQueue(manga: MangaDataClass) { + override fun addMangasToQueue(mangas: List) { + mangas.forEach { tracker[it.id] = UpdateJob(it) } + _status.update { UpdateStatus(tracker.values.toList(), true) } + mangas.forEach { addMangaToQueue(it) } + } + + private fun addMangaToQueue(manga: MangaDataClass) { val updateChannel = getOrCreateUpdateChannelFor(manga.sourceId) scope.launch { updateChannel.send(UpdateJob(manga)) } - tracker[manga.id] = UpdateJob(manga) - _status.update { UpdateStatus(tracker.values.toList(), true) } } override fun reset() { diff --git a/server/src/test/kotlin/suwayomi/tachidesk/manga/impl/update/TestUpdater.kt b/server/src/test/kotlin/suwayomi/tachidesk/manga/impl/update/TestUpdater.kt index b4c7f8a1..cd1a66db 100644 --- a/server/src/test/kotlin/suwayomi/tachidesk/manga/impl/update/TestUpdater.kt +++ b/server/src/test/kotlin/suwayomi/tachidesk/manga/impl/update/TestUpdater.kt @@ -13,8 +13,8 @@ class TestUpdater : IUpdater { private val _status = MutableStateFlow(UpdateStatus()) override val status: StateFlow = _status.asStateFlow() - override fun addMangaToQueue(manga: MangaDataClass) { - updateQueue.add(UpdateJob(manga)) + override fun addMangasToQueue(mangas: List) { + mangas.forEach { updateQueue.add(UpdateJob(it)) } isRunning = true updateStatus() }