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.
This commit is contained in:
schroda
2023-03-25 19:38:42 +01:00
committed by GitHub
parent 5b61bdc3a8
commit dcde4947e8
4 changed files with 17 additions and 14 deletions

View File

@@ -93,14 +93,13 @@ object UpdateController {
if (clear) { if (clear) {
updater.reset() updater.reset()
} }
categories updater.addMangasToQueue(
.flatMap { CategoryManga.getCategoryMangaList(it.id) } categories
.distinctBy { it.id } .flatMap { CategoryManga.getCategoryMangaList(it.id) }
.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title)) .distinctBy { it.id }
.filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE } .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, MangaDataClass::title))
.forEach { manga -> .filter { it.updateStrategy == UpdateStrategy.ALWAYS_UPDATE }
updater.addMangaToQueue(manga) )
}
} }
fun categoryUpdateWS(ws: WsConfig) { fun categoryUpdateWS(ws: WsConfig) {

View File

@@ -4,7 +4,7 @@ import kotlinx.coroutines.flow.StateFlow
import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass
interface IUpdater { interface IUpdater {
fun addMangaToQueue(manga: MangaDataClass) fun addMangasToQueue(mangas: List<MangaDataClass>)
val status: StateFlow<UpdateStatus> val status: StateFlow<UpdateStatus>
fun reset() fun reset()
} }

View File

@@ -74,13 +74,17 @@ class Updater : IUpdater {
return tracker.values.toList() return tracker.values.toList()
} }
override fun addMangaToQueue(manga: MangaDataClass) { override fun addMangasToQueue(mangas: List<MangaDataClass>) {
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) val updateChannel = getOrCreateUpdateChannelFor(manga.sourceId)
scope.launch { scope.launch {
updateChannel.send(UpdateJob(manga)) updateChannel.send(UpdateJob(manga))
} }
tracker[manga.id] = UpdateJob(manga)
_status.update { UpdateStatus(tracker.values.toList(), true) }
} }
override fun reset() { override fun reset() {

View File

@@ -13,8 +13,8 @@ class TestUpdater : IUpdater {
private val _status = MutableStateFlow(UpdateStatus()) private val _status = MutableStateFlow(UpdateStatus())
override val status: StateFlow<UpdateStatus> = _status.asStateFlow() override val status: StateFlow<UpdateStatus> = _status.asStateFlow()
override fun addMangaToQueue(manga: MangaDataClass) { override fun addMangasToQueue(mangas: List<MangaDataClass>) {
updateQueue.add(UpdateJob(manga)) mangas.forEach { updateQueue.add(UpdateJob(it)) }
isRunning = true isRunning = true
updateStatus() updateStatus()
} }