From f853158e6b1a5105c3201e806f772f8220d1bff5 Mon Sep 17 00:00:00 2001 From: arkon Date: Fri, 8 May 2020 18:58:49 -0400 Subject: [PATCH] Do library checks from up to 5 sources concurrently --- .../data/library/LibraryUpdateService.kt | 103 ++++++++++-------- 1 file changed, 60 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index 39f36b4045..f436fe0ef9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -308,36 +308,46 @@ class LibraryUpdateService( // Emit each manga and update it sequentially. return Observable.from(mangaToUpdate) - // Notify manga that will update. - .doOnNext { showProgressNotification(it, count.andIncrement, mangaToUpdate.size) } - // Update the chapters of the manga. - .concatMap { manga -> - updateManga(manga) - // If there's any error, return empty update and continue. - .onErrorReturn { - failedUpdates.add(manga) - Pair(emptyList(), emptyList()) - } - // Filter out mangas without new chapters (or failed). - .filter { pair -> pair.first.isNotEmpty() } - .doOnNext { - if (downloadNew && ( - categoriesToDownload.isEmpty() || - manga.category in categoriesToDownload - ) - ) { - downloadChapters(manga, it.first) - hasDownloads = true + // Update the chapters of the manga concurrently from 5 different sources + .groupBy { it.source } + .flatMap( + { bySource -> + bySource + // Notify manga that will update. + .doOnNext { showProgressNotification(it, count.andIncrement, mangaToUpdate.size) } + .concatMap { manga -> + updateManga(manga) + // If there's any error, return empty update and continue. + .onErrorReturn { + failedUpdates.add(manga) + Pair(emptyList(), emptyList()) + } + // Filter out mangas without new chapters (or failed). + .filter { pair -> pair.first.isNotEmpty() } + .doOnNext { + if (downloadNew && ( + categoriesToDownload.isEmpty() || + manga.category in categoriesToDownload + ) + ) { + downloadChapters(manga, it.first) + hasDownloads = true + } + } + // Convert to the manga that contains new chapters. + .map { + Pair( + manga, + ( + it.first.sortedByDescending { ch -> ch.source_order } + .toTypedArray() + ) + ) + } } - } - // Convert to the manga that contains new chapters. - .map { - Pair( - manga, - (it.first.sortedByDescending { ch -> ch.source_order }.toTypedArray()) - ) - } - } + }, + 5 + ) // Add manga with new chapters to the list. .doOnNext { manga -> // Add to the list @@ -397,21 +407,28 @@ class LibraryUpdateService( // Emit each manga and update it sequentially. return Observable.from(mangaToUpdate) - // Notify manga that will update. - .doOnNext { showProgressNotification(it, count.andIncrement, mangaToUpdate.size) } - // Update the details of the manga. - .concatMap { manga -> - val source = sourceManager.get(manga.source) as? HttpSource - ?: return@concatMap Observable.empty() + // Update the details of the manga concurrently from 5 different sources + .groupBy { it.source } + .flatMap( + { bySource -> + bySource + // Notify manga that will update. + .doOnNext { showProgressNotification(it, count.andIncrement, mangaToUpdate.size) } + .concatMap { manga -> + val source = sourceManager.get(manga.source) as? HttpSource + ?: return@concatMap Observable.empty() - source.fetchMangaDetails(manga) - .map { networkManga -> - manga.copyFrom(networkManga) - db.insertManga(manga).executeAsBlocking() - manga - } - .onErrorReturn { manga } - } + source.fetchMangaDetails(manga) + .map { networkManga -> + manga.copyFrom(networkManga) + db.insertManga(manga).executeAsBlocking() + manga + } + .onErrorReturn { manga } + } + }, + 5 + ) .doOnCompleted { cancelProgressNotification() }