From d466ba2b1d808c751271548585be9eb515b4fb51 Mon Sep 17 00:00:00 2001 From: Ivan Iskandar <12537387+ivaniskandar@users.noreply.github.com> Date: Fri, 8 Dec 2023 10:17:01 +0700 Subject: [PATCH] fix(Downloader): Don't queue chapters on GlobalScope (#10217) This fixes auto-download on library update not working on certain cases. --- .../data/download/anime/AnimeDownloader.kt | 41 ++++++++----------- .../data/download/manga/MangaDownloader.kt | 29 +++++-------- 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt index 889c56b39..991a9394e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt @@ -296,27 +296,22 @@ class AnimeDownloader( autoStart: Boolean, changeDownloader: Boolean = false, video: Video? = null, - ) = launchIO { - if (episodes.isEmpty()) { - return@launchIO - } + ) { + if (episodes.isEmpty()) return - val source = sourceManager.get(anime.source) as? AnimeHttpSource ?: return@launchIO + val source = sourceManager.get(anime.source) as? AnimeHttpSource ?: return val wasEmpty = queueState.value.isEmpty() - // Called in background thread, the operation can be slow with SAF. - val episodesWithoutDir = - episodes - // Filter out those already downloaded. - .filter { provider.findEpisodeDir(it.name, it.scanlator, anime.title, source) == null } - // Add episodes to queue from the start. - .sortedByDescending { it.sourceOrder } - // Runs in main thread (synchronization needed). - val episodesToQueue = episodesWithoutDir + val episodesToQueue = episodes.asSequence() + // Filter out those already downloaded. + .filter { provider.findEpisodeDir(it.name, it.scanlator, anime.title, source) == null } + // Add episodes to queue from the start. + .sortedByDescending { it.sourceOrder } // Filter out those already enqueued. .filter { episode -> queueState.value.none { it.episode.id == episode.id } } // Create a download for each one. .map { AnimeDownload(source, anime, it, changeDownloader, video) } + .toList() if (episodesToQueue.isNotEmpty()) { addAllToQueue(episodesToQueue) @@ -335,16 +330,14 @@ class AnimeDownloader( queuedDownloads > DOWNLOADS_QUEUED_WARNING_THRESHOLD || maxDownloadsFromSource > EPISODES_PER_SOURCE_QUEUE_WARNING_THRESHOLD ) { - withUIContext { - notifier.onWarning( - context.stringResource(MR.strings.download_queue_size_warning), - WARNING_NOTIF_TIMEOUT_MS, - NotificationHandler.openUrl( - context, - AnimeLibraryUpdateNotifier.HELP_WARNING_URL, - ), - ) - } + notifier.onWarning( + context.stringResource(MR.strings.download_queue_size_warning), + WARNING_NOTIF_TIMEOUT_MS, + NotificationHandler.openUrl( + context, + AnimeLibraryUpdateNotifier.HELP_WARNING_URL, + ), + ) } AnimeDownloadJob.start(context) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt index 383a5cf2e..88c63c073 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt @@ -50,7 +50,6 @@ import tachiyomi.core.storage.extension import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.launchNow import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.system.ImageUtil import tachiyomi.core.util.system.logcat import tachiyomi.domain.category.manga.interactor.GetMangaCategories @@ -277,24 +276,21 @@ class MangaDownloader( * @param chapters the list of chapters to download. * @param autoStart whether to start the downloader after enqueing the chapters. */ - fun queueChapters(manga: Manga, chapters: List, autoStart: Boolean) = launchIO { - if (chapters.isEmpty()) { - return@launchIO - } + fun queueChapters(manga: Manga, chapters: List, autoStart: Boolean) { + if (chapters.isEmpty()) return - val source = sourceManager.get(manga.source) as? HttpSource ?: return@launchIO + val source = sourceManager.get(manga.source) as? HttpSource ?: return val wasEmpty = queueState.value.isEmpty() - val chaptersWithoutDir = chapters + val chaptersToQueue = chapters.asSequence() // Filter out those already downloaded. .filter { provider.findChapterDir(it.name, it.scanlator, manga.title, source) == null } // Add chapters to queue from the start. .sortedByDescending { it.sourceOrder } - - val chaptersToQueue = chaptersWithoutDir // Filter out those already enqueued. .filter { chapter -> queueState.value.none { it.chapter.id == chapter.id } } // Create a download for each one. .map { MangaDownload(source, manga, it) } + .toList() if (chaptersToQueue.isNotEmpty()) { addAllToQueue(chaptersToQueue) @@ -311,16 +307,11 @@ class MangaDownloader( queuedDownloads > DOWNLOADS_QUEUED_WARNING_THRESHOLD || maxDownloadsFromSource > CHAPTERS_PER_SOURCE_QUEUE_WARNING_THRESHOLD ) { - withUIContext { - notifier.onWarning( - context.stringResource(MR.strings.download_queue_size_warning), - WARNING_NOTIF_TIMEOUT_MS, - NotificationHandler.openUrl( - context, - MangaLibraryUpdateNotifier.HELP_WARNING_URL, - ), - ) - } + notifier.onWarning( + context.stringResource(MR.strings.download_queue_size_warning), + WARNING_NOTIF_TIMEOUT_MS, + NotificationHandler.openUrl(context, MangaLibraryUpdateNotifier.HELP_WARNING_URL), + ) } MangaDownloadJob.start(context) }