fix(Downloader): Don't queue chapters on GlobalScope (#10217)

This fixes auto-download on library update not working on certain cases.
This commit is contained in:
Ivan Iskandar 2023-12-08 10:17:01 +07:00 committed by Claudemirovsky
parent 7d173062ca
commit d466ba2b1d
No known key found for this signature in database
GPG key ID: 82AE76162407356E
2 changed files with 27 additions and 43 deletions

View file

@ -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)
}

View file

@ -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<Chapter>, autoStart: Boolean) = launchIO {
if (chapters.isEmpty()) {
return@launchIO
}
fun queueChapters(manga: Manga, chapters: List<Chapter>, 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)
}