From f30ad78a4c79ec264d920dfdac1c70d781f0b42d 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 (cherry picked from commit f853158e6b1a5105c3201e806f772f8220d1bff5) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt --- .../data/library/LibraryUpdateService.kt | 111 ++++++++++-------- 1 file changed, 64 insertions(+), 47 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 924c2c3af..2d1415364 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -309,41 +309,51 @@ 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 -> - if (manga.source in LIBRARY_UPDATE_EXCLUDED_SOURCES) { - // Ignore EXH manga, updating chapters for every manga will get you banned - Observable.empty() - } else { - 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 -> + if (manga.source in LIBRARY_UPDATE_EXCLUDED_SOURCES) { + // Ignore EXH manga, updating chapters for every manga will get you banned + Observable.empty() + } else { + 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 @@ -403,21 +413,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() }