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) },
)
}
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) {

View file

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

View file

@ -34,7 +34,7 @@ class ChapterLoader(
private val sourceManager: SourceManager,
private val readerPrefs: ReaderPreferences,
private val mergedReferences: List<MergedMangaReference>,
private val mergedManga: Map<Long, Manga>,
private val mergedManga: Map<Long, Manga>?,
// 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,