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
This commit is contained in:
Cuong-Tran 2025-08-29 17:00:57 +07:00 committed by GitHub
parent 0c4fd329e0
commit b067690678
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 66 additions and 34 deletions

View file

@ -443,15 +443,11 @@ class MangaScreenModel(
.map { sourceManager.getOrStub(it) }, .map { sourceManager.getOrStub(it) },
) )
} }
val chapters = ( val chapters = if (manga.source == MERGED_SOURCE_ID) {
if (manga.source == getMergedChaptersByMangaId.await(mangaId, applyFilter = true)
MERGED_SOURCE_ID } else {
) { getMangaAndChapters.awaitChapters(mangaId, applyFilter = true)
getMergedChaptersByMangaId.await(mangaId, applyFilter = true) }
} else {
getMangaAndChapters.awaitChapters(mangaId, applyFilter = true)
}
)
.toChapterListItems(manga, mergedData) .toChapterListItems(manga, mergedData)
val meta = getFlatMetadata.await(mangaId) val meta = getFlatMetadata.await(mangaId)
// SY <-- // SY <--
@ -1518,20 +1514,39 @@ class MangaScreenModel(
screenModelScope.launchNonCancellable { screenModelScope.launchNonCancellable {
try { try {
successState?.let { state -> successState?.let { state ->
downloadManager.deleteChapters( // KMK --?
chapters, if (state.source.id == MERGED_SOURCE_ID) {
state.manga, chapters.groupBy { it.mangaId }.forEach { map ->
state.source, val manga = state.mergedData?.manga?.get(map.key) ?: return@forEach
// KMK --> val source = state.mergedData.sources.find { manga.source == it.id } ?: return@forEach
ignoreCategoryExclusion = true, 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 <--
)
// KMK -->
if (source?.isLocal() == true) {
// Refresh chapters state for Local source
fetchChaptersFromSource()
} }
// KMK <--
} }
} catch (e: Throwable) { } catch (e: Throwable) {
logcat(LogPriority.ERROR, e) logcat(LogPriority.ERROR, e)
@ -1556,14 +1571,32 @@ class MangaScreenModel(
screenModelScope.launchNonCancellable { screenModelScope.launchNonCancellable {
try { try {
successState?.let { state -> successState?.let { state ->
downloadManager.deleteManga( if (state.source.id == MERGED_SOURCE_ID) {
manga = state.manga, state.mergedData?.manga
source = state.source, ?.filterNot { it.key == MERGED_SOURCE_ID }
removeQueued = true, ?.forEach { (_, manga) ->
) val source = state.mergedData.sources.find { manga.source == it.id } ?: return@forEach
if (source?.isLocal() == true) {
// Refresh chapters state for Local source downloadManager.deleteManga(
fetchChaptersFromSource() 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) { } catch (e: Throwable) {

View file

@ -196,8 +196,7 @@ class ReaderViewModel @JvmOverloads constructor(
val (chapters, mangaMap) = runBlocking { val (chapters, mangaMap) = runBlocking {
if (manga.source == MERGED_SOURCE_ID) { if (manga.source == MERGED_SOURCE_ID) {
getMergedChaptersByMangaId.await(manga.id, applyFilter = true) to getMergedChaptersByMangaId.await(manga.id, applyFilter = true) to
getMergedMangaById.await(manga.id) state.value.mergedManga
.associateBy { it.id }
} else { } else {
getChaptersByMangaId.await(manga.id, applyFilter = true) to null getChaptersByMangaId.await(manga.id, applyFilter = true) to null
} }
@ -367,7 +366,7 @@ class ReaderViewModel @JvmOverloads constructor(
getMergedMangaById.await(manga.id) getMergedMangaById.await(manga.id)
}.associateBy { it.id } }.associateBy { it.id }
} else { } else {
emptyMap() null
} }
val relativeTime = uiPreferences.relativeTime().get() val relativeTime = uiPreferences.relativeTime().get()
val autoScrollFreq = readerPreferences.autoscrollInterval().get() val autoScrollFreq = readerPreferences.autoscrollInterval().get()

View file

@ -34,7 +34,7 @@ class ChapterLoader(
private val sourceManager: SourceManager, private val sourceManager: SourceManager,
private val readerPrefs: ReaderPreferences, private val readerPrefs: ReaderPreferences,
private val mergedReferences: List<MergedMangaReference>, private val mergedReferences: List<MergedMangaReference>,
private val mergedManga: Map<Long, Manga>, private val mergedManga: Map<Long, Manga>?,
// SY <-- // SY <--
) { ) {
@ -109,7 +109,7 @@ class ChapterLoader(
} ?: error("Merge reference null") } ?: error("Merge reference null")
val source = sourceManager.get(mangaReference.mangaSourceId) val source = sourceManager.get(mangaReference.mangaSourceId)
?: error("Source ${mangaReference.mangaSourceId} was null") ?: 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( val isMergedMangaDownloaded = downloadManager.isChapterDownloaded(
chapterName = chapter.chapter.name, chapterName = chapter.chapter.name,
chapterScanlator = chapter.chapter.scanlator, chapterScanlator = chapter.chapter.scanlator,