From ac86a9a2d952d489ce89ef0a34551e8f3c5e60e6 Mon Sep 17 00:00:00 2001 From: "Cuong M. Tran" Date: Mon, 20 May 2024 12:38:25 +0700 Subject: [PATCH] Fix fetching related mangas from extensions was not concurrently --- .../tachiyomi/ui/manga/MangaScreenModel.kt | 32 ++++++++-------- .../tachiyomi/source/CatalogueSource.kt | 38 +++++++++++-------- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt index b7f2efe4c..5cf589c9a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt @@ -1111,25 +1111,23 @@ class MangaScreenModel( val state = successState ?: return val relatedMangasEnabled = Injekt.get().relatedMangas().get() try { - withIOContext { - if (state.source !is StubSource) { - if (relatedMangasEnabled) { - state.source.getRelatedMangaList(state.manga.toSManga()) { pair, _ -> - /* Push found related mangas into collection */ - val relatedManga = RelatedManga.Success.fromPair(pair) { mangaList -> - mangaList.map { - networkToLocalManga.await(it.toDomainManga(state.source.id)) - } + if (state.source !is StubSource) { + if (relatedMangasEnabled) { + state.source.getRelatedMangaList(state.manga.toSManga()) { pair, _ -> + /* Push found related mangas into collection */ + val relatedManga = RelatedManga.Success.fromPair(pair) { mangaList -> + mangaList.map { + networkToLocalManga.await(it.toDomainManga(state.source.id)) } + } - updateSuccessState { successState -> - val relatedMangaCollection = - successState.relatedMangaCollection - ?.toMutableStateList() - ?.apply { add(relatedManga) } - ?: listOf(relatedManga) - successState.copy(relatedMangaCollection = relatedMangaCollection) - } + updateSuccessState { successState -> + val relatedMangaCollection = + successState.relatedMangaCollection + ?.toMutableStateList() + ?.apply { add(relatedManga) } + ?: listOf(relatedManga) + successState.copy(relatedMangaCollection = relatedMangaCollection) } } } diff --git a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/CatalogueSource.kt b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/CatalogueSource.kt index bc6f0ed68..6f0f4a396 100644 --- a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/CatalogueSource.kt +++ b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/CatalogueSource.kt @@ -98,24 +98,30 @@ interface CatalogueSource : Source { pushResults: suspend (relatedManga: Pair>, completed: Boolean) -> Unit, ) { if (!disableRelatedMangas) { - if (supportsRelatedMangas) { - coroutineScope { - launch { - runCatching { fetchRelatedMangaList(manga) } - .onSuccess { if (it.isNotEmpty()) pushResults(Pair("", it), false) } - .onFailure { - logcat(LogPriority.ERROR, it) { "## fetchRelatedMangaList: $it" } - } - } - } - } - - if (!disableRelatedMangasBySearch) { - getRelatedMangaListBySearch(manga, pushResults) + coroutineScope { + if (supportsRelatedMangas) launch { getRelatedMangaListByExtension(manga, pushResults) } + if (!disableRelatedMangasBySearch) launch { getRelatedMangaListBySearch(manga, pushResults) } } } } + /** + * Get related mangas provided by extension + * + * @return a list of + * @since komikku/extensions-lib 1.6 + */ + suspend fun getRelatedMangaListByExtension( + manga: SManga, + pushResults: suspend (relatedManga: Pair>, completed: Boolean) -> Unit, + ) { + runCatching { fetchRelatedMangaList(manga) } + .onSuccess { if (it.isNotEmpty()) pushResults(Pair("", it), false) } + .onFailure { e -> + logcat(LogPriority.ERROR, e) { "## getRelatedMangaListByExtension: $e" } + } + } + /** * Fetch related mangas for a manga from source/site. * @@ -152,12 +158,12 @@ interface CatalogueSource : Source { } /** - * Fetch related mangas by searching for each keywords from manga's title. + * Get related mangas by searching for each keywords from manga's title. * * @return a list of * @since komikku/extensions-lib 1.6 */ - private suspend fun getRelatedMangaListBySearch( + suspend fun getRelatedMangaListBySearch( manga: SManga, pushResults: suspend (relatedManga: Pair>, completed: Boolean) -> Unit, ) {