From fb8e640d69969f74cd2ff18abf701c6176f95f4b Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sun, 4 Oct 2026 21:54:48 +0600 Subject: [PATCH] Look up queued and downloaded chapters once per chapter list --- .../tachiyomi/data/download/DownloadCache.kt | 21 +++++++++++++++++++ .../data/download/DownloadManager.kt | 17 +++++++++++++++ .../tachiyomi/ui/manga/MangaViewModel.kt | 20 ++++-------------- .../tachiyomi/ui/updates/UpdatesViewModel.kt | 3 ++- 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt index 42bcd986a..c715e0604 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt @@ -124,6 +124,27 @@ class DownloadCache( .launchIn(scope) } + /** + * Returns the ids of the downloaded chapters among the given chapters of one manga. + * + * @param chapters the chapters to query, all of the same manga. + * @param mangaTitle the title of the manga to query. + * @param sourceId the id of the source of the chapters. + */ + fun getDownloadedChapterIds(chapters: List, mangaTitle: String, sourceId: Long): Set { + renewCache() + + val mangaDir = rootDownloadsDir.sourceDirs[sourceId]?.mangaDirs?.get(provider.getMangaDirName(mangaTitle)) + if (mangaDir == null || mangaDir.chapterDirs.isEmpty()) return emptySet() + + return chapters + .filter { chapter -> + provider.getValidChapterDirNames(chapter.name, chapter.scanlator, chapter.url) + .any { it in mangaDir.chapterDirs } + } + .mapTo(HashSet()) { it.id } + } + /** * Returns true if the chapter is downloaded. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt index ba722bcf2..24acb2458 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt @@ -93,6 +93,13 @@ class DownloadManager( return queueState.value.find { it.chapter.id == chapterId } } + /** + * Returns the queued downloads by chapter id, for looking up many chapters at once. + */ + fun getQueuedDownloadsByChapterId(): Map { + return queueState.value.associateBy { it.chapter.id } + } + fun startDownloadNow(chapterId: Long) { val existingDownload = getQueuedDownloadOrNull(chapterId) // If not in queue try to start a new download @@ -172,6 +179,16 @@ class DownloadManager( } } + /** + * Returns the ids of the downloaded chapters among the given chapters of the manga. + * + * @param chapters the chapters to query, all of [manga]. + * @param manga the manga of the chapters. + */ + fun getDownloadedChapterIds(chapters: List, manga: Manga): Set { + return cache.getDownloadedChapterIds(chapters, manga.title, manga.source) + } + /** * Returns true if the chapter is downloaded. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaViewModel.kt index 8262ccbce..b0aab2e04 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaViewModel.kt @@ -543,23 +543,11 @@ class MangaViewModel( private fun List.toChapterListItems(manga: Manga): List { val isLocal = manga.isLocal() + val queuedDownloads = if (isLocal) emptyMap() else downloadManager.getQueuedDownloadsByChapterId() + val downloadedChapterIds = if (isLocal) emptySet() else downloadManager.getDownloadedChapterIds(this, manga) return map { chapter -> - val activeDownload = if (isLocal) { - null - } else { - downloadManager.getQueuedDownloadOrNull(chapter.id) - } - val downloaded = if (isLocal) { - true - } else { - downloadManager.isChapterDownloaded( - chapter.name, - chapter.scanlator, - chapter.url, - manga.title, - manga.source, - ) - } + val activeDownload = queuedDownloads[chapter.id] + val downloaded = isLocal || chapter.id in downloadedChapterIds val downloadState = when { activeDownload != null -> activeDownload.status downloaded -> Download.State.DOWNLOADED diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesViewModel.kt index efc826d70..1d2c95175 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesViewModel.kt @@ -211,9 +211,10 @@ class UpdatesViewModel( } private fun List.toUpdateItems(): List { + val queuedDownloads = downloadManager.getQueuedDownloadsByChapterId() return this .map { update -> - val activeDownload = downloadManager.getQueuedDownloadOrNull(update.chapterId) + val activeDownload = queuedDownloads[update.chapterId] val downloaded = downloadManager.isChapterDownloaded( update.chapterName, update.scanlator,