diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/GetAvailableScanlators.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetAvailableScanlators.kt index 13bd35e1f..d4b74f8a6 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/GetAvailableScanlators.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetAvailableScanlators.kt @@ -21,4 +21,16 @@ class GetAvailableScanlators( return repository.getScanlatorsByMangaIdAsFlow(mangaId) .map { it.cleanupAvailableScanlators() } } + + // SY --> + suspend fun awaitMerge(mangaId: Long): Set { + return repository.getScanlatorsByMergeId(mangaId) + .cleanupAvailableScanlators() + } + + fun subscribeMerge(mangaId: Long): Flow> { + return repository.getScanlatorsByMergeIdAsFlow(mangaId) + .map { it.cleanupAvailableScanlators() } + } + // SY <-- } 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 eb6b837fa..819e9fd98 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 @@ -71,7 +71,10 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.flatMapConcat +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update @@ -341,6 +344,20 @@ class MangaScreenModel( screenModelScope.launchIO { getAvailableScanlators.subscribe(mangaId) .distinctUntilChanged() + // SY --> + .combine( + state.map { (it as? State.Success)?.manga } + .distinctUntilChangedBy { it?.source } + .flatMapConcat { + if (it?.source == MERGED_SOURCE_ID) { + getAvailableScanlators.subscribeMerge(mangaId) + } else { + flowOf(emptySet()) + } + } + ) { mangaScanlators, mergeScanlators -> + mangaScanlators + mergeScanlators + } // SY <-- .collectLatest { availableScanlators -> updateSuccessState { it.copy(availableScanlators = availableScanlators.toImmutableSet()) @@ -381,7 +398,13 @@ class MangaScreenModel( source = source, isFromSource = isFromSource, chapters = chapters, - availableScanlators = getAvailableScanlators.await(mangaId).toImmutableSet(), + // SY --> + availableScanlators = if (manga.source == MERGED_SOURCE_ID) { + getAvailableScanlators.awaitMerge(mangaId) + } else { + getAvailableScanlators.await(mangaId) + }.toImmutableSet(), + // SY <-- excludedScanlators = getExcludedScanlators.await(mangaId).toImmutableSet(), isRefreshingData = needRefreshInfo || needRefreshChapter, dialog = null, diff --git a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt index 315b68c41..4c923c860 100644 --- a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt @@ -151,5 +151,17 @@ class ChapterRepositoryImpl( ) } } + + override suspend fun getScanlatorsByMergeId(mangaId: Long): List { + return handler.awaitList { + chaptersQueries.getScanlatorsByMergeId(mangaId) { it.orEmpty() } + } + } + + override fun getScanlatorsByMergeIdAsFlow(mangaId: Long): Flow> { + return handler.subscribeToList { + chaptersQueries.getScanlatorsByMergeId(mangaId) { it.orEmpty() } + } + } // SY <-- } diff --git a/data/src/main/sqldelight/tachiyomi/data/chapters.sq b/data/src/main/sqldelight/tachiyomi/data/chapters.sq index cdc43c93d..06307a9bb 100644 --- a/data/src/main/sqldelight/tachiyomi/data/chapters.sq +++ b/data/src/main/sqldelight/tachiyomi/data/chapters.sq @@ -71,20 +71,28 @@ AND manga_id = :mangaId; getMergedChaptersByMangaId: SELECT C.* -FROM chapters C -JOIN ( - SELECT manga_id FROM merged WHERE merge_id = :mangaId +FROM ( + SELECT manga_id,merge_id FROM merged WHERE merge_id = :mangaId ) AS M +JOIN chapters C ON C.manga_id = M.manga_id LEFT JOIN excluded_scanlators ES -ON C.manga_id = ES.manga_id +ON M.merge_id = ES.manga_id AND C.scanlator = ES.scanlator -WHERE C.manga_id = :mangaId +WHERE M.merge_id = :mangaId AND ( :applyScanlatorFilter = 0 OR ES.scanlator IS NULL ); +getScanlatorsByMergeId: +SELECT scanlator +FROM ( + SELECT manga_id FROM merged WHERE merge_id = ? +) AS M +JOIN chapters +ON chapters.manga_id = M.manga_id; + removeChaptersWithIds: DELETE FROM chapters WHERE _id IN :chapterIds; diff --git a/domain/src/main/java/tachiyomi/domain/chapter/repository/ChapterRepository.kt b/domain/src/main/java/tachiyomi/domain/chapter/repository/ChapterRepository.kt index a221ebe06..ef5061496 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/repository/ChapterRepository.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/repository/ChapterRepository.kt @@ -37,5 +37,9 @@ interface ChapterRepository { mangaId: Long, applyScanlatorFilter: Boolean = false, ): Flow> + + suspend fun getScanlatorsByMergeId(mangaId: Long): List + + fun getScanlatorsByMergeIdAsFlow(mangaId: Long): Flow> // SY <-- }