Fix fetching related mangas from extensions was not concurrently

This commit is contained in:
Cuong M. Tran 2024-05-20 12:38:25 +07:00
parent 914a7d2aa9
commit ac86a9a2d9
No known key found for this signature in database
GPG key ID: 733AA7624B9315C2
2 changed files with 37 additions and 33 deletions

View file

@ -1111,25 +1111,23 @@ class MangaScreenModel(
val state = successState ?: return val state = successState ?: return
val relatedMangasEnabled = Injekt.get<SourcePreferences>().relatedMangas().get() val relatedMangasEnabled = Injekt.get<SourcePreferences>().relatedMangas().get()
try { try {
withIOContext { if (state.source !is StubSource) {
if (state.source !is StubSource) { if (relatedMangasEnabled) {
if (relatedMangasEnabled) { state.source.getRelatedMangaList(state.manga.toSManga()) { pair, _ ->
state.source.getRelatedMangaList(state.manga.toSManga()) { pair, _ -> /* Push found related mangas into collection */
/* Push found related mangas into collection */ val relatedManga = RelatedManga.Success.fromPair(pair) { mangaList ->
val relatedManga = RelatedManga.Success.fromPair(pair) { mangaList -> mangaList.map {
mangaList.map { networkToLocalManga.await(it.toDomainManga(state.source.id))
networkToLocalManga.await(it.toDomainManga(state.source.id))
}
} }
}
updateSuccessState { successState -> updateSuccessState { successState ->
val relatedMangaCollection = val relatedMangaCollection =
successState.relatedMangaCollection successState.relatedMangaCollection
?.toMutableStateList() ?.toMutableStateList()
?.apply { add(relatedManga) } ?.apply { add(relatedManga) }
?: listOf(relatedManga) ?: listOf(relatedManga)
successState.copy(relatedMangaCollection = relatedMangaCollection) successState.copy(relatedMangaCollection = relatedMangaCollection)
}
} }
} }
} }

View file

@ -98,24 +98,30 @@ interface CatalogueSource : Source {
pushResults: suspend (relatedManga: Pair<String, List<SManga>>, completed: Boolean) -> Unit, pushResults: suspend (relatedManga: Pair<String, List<SManga>>, completed: Boolean) -> Unit,
) { ) {
if (!disableRelatedMangas) { if (!disableRelatedMangas) {
if (supportsRelatedMangas) { coroutineScope {
coroutineScope { if (supportsRelatedMangas) launch { getRelatedMangaListByExtension(manga, pushResults) }
launch { if (!disableRelatedMangasBySearch) launch { getRelatedMangaListBySearch(manga, pushResults) }
runCatching { fetchRelatedMangaList(manga) }
.onSuccess { if (it.isNotEmpty()) pushResults(Pair("", it), false) }
.onFailure {
logcat(LogPriority.ERROR, it) { "## fetchRelatedMangaList: $it" }
}
}
}
}
if (!disableRelatedMangasBySearch) {
getRelatedMangaListBySearch(manga, pushResults)
} }
} }
} }
/**
* Get related mangas provided by extension
*
* @return a list of <keyword, related mangas>
* @since komikku/extensions-lib 1.6
*/
suspend fun getRelatedMangaListByExtension(
manga: SManga,
pushResults: suspend (relatedManga: Pair<String, List<SManga>>, 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. * 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 <keyword, related mangas> * @return a list of <keyword, related mangas>
* @since komikku/extensions-lib 1.6 * @since komikku/extensions-lib 1.6
*/ */
private suspend fun getRelatedMangaListBySearch( suspend fun getRelatedMangaListBySearch(
manga: SManga, manga: SManga,
pushResults: suspend (relatedManga: Pair<String, List<SManga>>, completed: Boolean) -> Unit, pushResults: suspend (relatedManga: Pair<String, List<SManga>>, completed: Boolean) -> Unit,
) { ) {