From b06769067831317e6466f87cd9583b28b802594f Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 29 Aug 2025 17:00:57 +0700 Subject: [PATCH] fix(merged-entries): Fix deletion of chapters and data folders in merged entries (#1114) * fix(merged-entries): Fix delete chapters or data folders * spotless * comment * safely using state.source --- .../tachiyomi/ui/manga/MangaScreenModel.kt | 91 +++++++++++++------ .../tachiyomi/ui/reader/ReaderViewModel.kt | 5 +- .../ui/reader/loader/ChapterLoader.kt | 4 +- 3 files changed, 66 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt index 18d4e26af..9ad21ac4d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt @@ -443,15 +443,11 @@ class MangaScreenModel( .map { sourceManager.getOrStub(it) }, ) } - val chapters = ( - if (manga.source == - MERGED_SOURCE_ID - ) { - getMergedChaptersByMangaId.await(mangaId, applyFilter = true) - } else { - getMangaAndChapters.awaitChapters(mangaId, applyFilter = true) - } - ) + val chapters = if (manga.source == MERGED_SOURCE_ID) { + getMergedChaptersByMangaId.await(mangaId, applyFilter = true) + } else { + getMangaAndChapters.awaitChapters(mangaId, applyFilter = true) + } .toChapterListItems(manga, mergedData) val meta = getFlatMetadata.await(mangaId) // SY <-- @@ -1518,20 +1514,39 @@ class MangaScreenModel( screenModelScope.launchNonCancellable { try { successState?.let { state -> - downloadManager.deleteChapters( - chapters, - state.manga, - state.source, - // KMK --> - ignoreCategoryExclusion = true, + // KMK --? + if (state.source.id == MERGED_SOURCE_ID) { + chapters.groupBy { it.mangaId }.forEach { map -> + val manga = state.mergedData?.manga?.get(map.key) ?: return@forEach + val source = state.mergedData.sources.find { manga.source == it.id } ?: return@forEach + downloadManager.deleteChapters( + map.value, + manga, + source, + ignoreCategoryExclusion = true, + ) + if (source.isLocal()) { + // Refresh chapters state for Local source + fetchChaptersFromSource() + } + } + } else { + // KMK <-- + downloadManager.deleteChapters( + chapters, + state.manga, + state.source, + // KMK --> + ignoreCategoryExclusion = true, + // KMK <-- + ) + // KMK --> + if (state.source.isLocal()) { + // Refresh chapters state for Local source + fetchChaptersFromSource() + } // KMK <-- - ) - // KMK --> - if (source?.isLocal() == true) { - // Refresh chapters state for Local source - fetchChaptersFromSource() } - // KMK <-- } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) @@ -1556,14 +1571,32 @@ class MangaScreenModel( screenModelScope.launchNonCancellable { try { successState?.let { state -> - downloadManager.deleteManga( - manga = state.manga, - source = state.source, - removeQueued = true, - ) - if (source?.isLocal() == true) { - // Refresh chapters state for Local source - fetchChaptersFromSource() + if (state.source.id == MERGED_SOURCE_ID) { + state.mergedData?.manga + ?.filterNot { it.key == MERGED_SOURCE_ID } + ?.forEach { (_, manga) -> + val source = state.mergedData.sources.find { manga.source == it.id } ?: return@forEach + + downloadManager.deleteManga( + manga = manga, + source = source, + removeQueued = true, + ) + if (source.isLocal()) { + // Refresh chapters state for Local source + fetchChaptersFromSource() + } + } + } else { + downloadManager.deleteManga( + manga = state.manga, + source = state.source, + removeQueued = true, + ) + if (state.source.isLocal()) { + // Refresh chapters state for Local source + fetchChaptersFromSource() + } } } } catch (e: Throwable) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index 5016f85f9..7c0de2124 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -196,8 +196,7 @@ class ReaderViewModel @JvmOverloads constructor( val (chapters, mangaMap) = runBlocking { if (manga.source == MERGED_SOURCE_ID) { getMergedChaptersByMangaId.await(manga.id, applyFilter = true) to - getMergedMangaById.await(manga.id) - .associateBy { it.id } + state.value.mergedManga } else { getChaptersByMangaId.await(manga.id, applyFilter = true) to null } @@ -367,7 +366,7 @@ class ReaderViewModel @JvmOverloads constructor( getMergedMangaById.await(manga.id) }.associateBy { it.id } } else { - emptyMap() + null } val relativeTime = uiPreferences.relativeTime().get() val autoScrollFreq = readerPreferences.autoscrollInterval().get() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt index fbfdf9c48..f66e92a1d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt @@ -34,7 +34,7 @@ class ChapterLoader( private val sourceManager: SourceManager, private val readerPrefs: ReaderPreferences, private val mergedReferences: List, - private val mergedManga: Map, + private val mergedManga: Map?, // SY <-- ) { @@ -109,7 +109,7 @@ class ChapterLoader( } ?: error("Merge reference null") val source = sourceManager.get(mangaReference.mangaSourceId) ?: error("Source ${mangaReference.mangaSourceId} was null") - val manga = mergedManga[chapter.chapter.manga_id] ?: error("Manga for merged chapter was null") + val manga = mergedManga?.get(chapter.chapter.manga_id) ?: error("Manga for merged chapter was null") val isMergedMangaDownloaded = downloadManager.isChapterDownloaded( chapterName = chapter.chapter.name, chapterScanlator = chapter.chapter.scanlator,