Parallelize global search properly

Fixes #8906
This commit is contained in:
arkon 2023-01-13 17:58:00 -05:00
parent a2ee4e63ae
commit 91004ad514

View file

@ -19,6 +19,8 @@ import eu.kanade.tachiyomi.util.lang.withIOContext
import eu.kanade.tachiyomi.util.lang.withNonCancellableContext import eu.kanade.tachiyomi.util.lang.withNonCancellableContext
import eu.kanade.tachiyomi.util.system.logcat import eu.kanade.tachiyomi.util.system.logcat
import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -133,32 +135,36 @@ abstract class SearchScreenModel<T>(
updateItems(initialItems) updateItems(initialItems)
coroutineScope.launch { coroutineScope.launch {
sources.forEach { source -> sources
val page = try { .map { source ->
withContext(coroutineDispatcher) { async {
source.fetchSearchManga(1, query, source.getFilterList()).awaitSingle() try {
} val page = withContext(coroutineDispatcher) {
} catch (e: Exception) { logcat { "Searching ${source.name}" }
getAndUpdateItems { items -> source.fetchSearchManga(1, query, source.getFilterList()).awaitSingle()
val mutableMap = items.toMutableMap() }
mutableMap[source] = SearchItemResult.Error(throwable = e)
mutableMap.toSortedMap(sortComparator(mutableMap))
}
return@forEach
}
val titles = page.mangas.map { val titles = withIOContext {
withIOContext { page.mangas.map {
networkToLocalManga.await(it.toDomainManga(source.id)) networkToLocalManga.await(it.toDomainManga(source.id))
}
}
getAndUpdateItems { items ->
val mutableMap = items.toMutableMap()
mutableMap[source] = SearchItemResult.Success(titles)
mutableMap.toSortedMap(sortComparator(mutableMap))
}
} catch (e: Exception) {
getAndUpdateItems { items ->
val mutableMap = items.toMutableMap()
mutableMap[source] = SearchItemResult.Error(throwable = e)
mutableMap.toSortedMap(sortComparator(mutableMap))
}
}
} }
} }
.awaitAll()
getAndUpdateItems { items ->
val mutableMap = items.toMutableMap()
mutableMap[source] = SearchItemResult.Success(titles)
mutableMap.toSortedMap(sortComparator(mutableMap))
}
}
} }
} }
} }