Implement scanlator filter (#8803)

* Implement scanlator filter

* Visual improvement to scanlator filter dialog

* Review changes + Bug fixes

Backup not containing filtered chapters and similar issue fix

* Review Changes + Fix SQL query

* Lint mamma mia

(cherry picked from commit b97aa235480e35b5514b7b1489b9d4413cea66d9)

# Conflicts:
#	app/build.gradle.kts
#	app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt
#	data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt
#	data/src/main/sqldelight/tachiyomi/migrations/23.sqm
#	data/src/main/sqldelight/tachiyomi/migrations/26.sqm
#	domain/src/main/java/tachiyomi/domain/history/interactor/GetNextChapters.kt
This commit is contained in:
AntsyLich
2023-11-05 21:34:35 +06:00
committed by Jobobby04
parent 94fa45597d
commit c8909961c0
48 changed files with 503 additions and 237 deletions
@@ -9,9 +9,9 @@ class GetChaptersByMangaId(
private val chapterRepository: ChapterRepository,
) {
suspend fun await(mangaId: Long): List<Chapter> {
suspend fun await(mangaId: Long, applyScanlatorFilter: Boolean = false): List<Chapter> {
return try {
chapterRepository.getChapterByMangaId(mangaId)
chapterRepository.getChapterByMangaId(mangaId, applyScanlatorFilter)
} catch (e: Exception) {
logcat(LogPriority.ERROR, e)
emptyList()
@@ -16,13 +16,21 @@ class GetMergedChaptersByMangaId(
private val getMergedReferencesById: GetMergedReferencesById,
) {
suspend fun await(mangaId: Long, dedupe: Boolean = true): List<Chapter> {
return transformMergedChapters(getMergedReferencesById.await(mangaId), getFromDatabase(mangaId), dedupe)
suspend fun await(
mangaId: Long,
dedupe: Boolean = true,
applyScanlatorFilter: Boolean = false,
): List<Chapter> {
return transformMergedChapters(getMergedReferencesById.await(mangaId), getFromDatabase(mangaId, applyScanlatorFilter), dedupe)
}
suspend fun subscribe(mangaId: Long, dedupe: Boolean = true): Flow<List<Chapter>> {
suspend fun subscribe(
mangaId: Long,
dedupe: Boolean = true,
applyScanlatorFilter: Boolean = false,
): Flow<List<Chapter>> {
return try {
chapterRepository.getMergedChapterByMangaIdAsFlow(mangaId)
chapterRepository.getMergedChapterByMangaIdAsFlow(mangaId, applyScanlatorFilter)
.combine(getMergedReferencesById.subscribe(mangaId)) { chapters, references ->
transformMergedChapters(references, chapters, dedupe)
}
@@ -32,16 +40,19 @@ class GetMergedChaptersByMangaId(
}
}
private suspend fun getFromDatabase(mangaId: Long): List<Chapter> {
private suspend fun getFromDatabase(
mangaId: Long,
applyScanlatorFilter: Boolean = false,
): List<Chapter> {
return try {
chapterRepository.getMergedChapterByMangaId(mangaId)
chapterRepository.getMergedChapterByMangaId(mangaId, applyScanlatorFilter)
} catch (e: Exception) {
logcat(LogPriority.ERROR, e)
emptyList()
}
}
fun transformMergedChapters(
private fun transformMergedChapters(
mangaReferences: List<MergedMangaReference>,
chapterList: List<Chapter>,
dedupe: Boolean,
@@ -14,21 +14,25 @@ interface ChapterRepository {
suspend fun removeChaptersWithIds(chapterIds: List<Long>)
suspend fun getChapterByMangaId(mangaId: Long): List<Chapter>
suspend fun getChapterByMangaId(mangaId: Long, applyScanlatorFilter: Boolean = false): List<Chapter>
suspend fun getScanlatorsByMangaId(mangaId: Long): List<String>
fun getScanlatorsByMangaIdAsFlow(mangaId: Long): Flow<List<String>>
suspend fun getBookmarkedChaptersByMangaId(mangaId: Long): List<Chapter>
suspend fun getChapterById(id: Long): Chapter?
suspend fun getChapterByMangaIdAsFlow(mangaId: Long): Flow<List<Chapter>>
suspend fun getChapterByMangaIdAsFlow(mangaId: Long, applyScanlatorFilter: Boolean = false): Flow<List<Chapter>>
suspend fun getChapterByUrlAndMangaId(url: String, mangaId: Long): Chapter?
// SY -->
suspend fun getChapterByUrl(url: String): List<Chapter>
suspend fun getMergedChapterByMangaId(mangaId: Long): List<Chapter>
suspend fun getMergedChapterByMangaId(mangaId: Long, applyScanlatorFilter: Boolean = false): List<Chapter>
suspend fun getMergedChapterByMangaIdAsFlow(mangaId: Long): Flow<List<Chapter>>
suspend fun getMergedChapterByMangaIdAsFlow(mangaId: Long, applyScanlatorFilter: Boolean = false): Flow<List<Chapter>>
// SY <--
}
@@ -29,7 +29,7 @@ class GetNextChapters(
// SY -->
if (manga.source == MERGED_SOURCE_ID) {
val chapters = getMergedChaptersByMangaId.await(mangaId)
val chapters = getMergedChaptersByMangaId.await(mangaId, applyScanlatorFilter = true)
.sortedWith(getChapterSort(manga, sortDescending = false))
return if (onlyUnread) {
@@ -39,7 +39,7 @@ class GetNextChapters(
}
}
if (manga.isEhBasedManga()) {
val chapters = getChaptersByMangaId.await(mangaId)
val chapters = getChaptersByMangaId.await(mangaId, applyScanlatorFilter = true)
.sortedWith(getChapterSort(manga, sortDescending = false))
return if (onlyUnread) {
@@ -50,7 +50,7 @@ class GetNextChapters(
}
// SY <--
val chapters = getChaptersByMangaId.await(mangaId)
val chapters = getChaptersByMangaId.await(mangaId, applyScanlatorFilter = true)
.sortedWith(getChapterSort(manga, sortDescending = false))
return if (onlyUnread) {
@@ -24,7 +24,7 @@ class FetchInterval(
} else {
window
}
val chapters = getChaptersByMangaId.await(manga.id)
val chapters = getChaptersByMangaId.await(manga.id, applyScanlatorFilter = true)
val interval = manga.fetchInterval.takeIf { it < 0 } ?: calculateInterval(
chapters,
dateTime.zone,
@@ -12,10 +12,10 @@ class GetMangaWithChapters(
private val chapterRepository: ChapterRepository,
) {
suspend fun subscribe(id: Long): Flow<Pair<Manga, List<Chapter>>> {
suspend fun subscribe(id: Long, applyScanlatorFilter: Boolean = false): Flow<Pair<Manga, List<Chapter>>> {
return combine(
mangaRepository.getMangaByIdAsFlow(id),
chapterRepository.getChapterByMangaIdAsFlow(id),
chapterRepository.getChapterByMangaIdAsFlow(id, applyScanlatorFilter),
) { manga, chapters ->
Pair(manga, chapters)
}
@@ -25,7 +25,7 @@ class GetMangaWithChapters(
return mangaRepository.getMangaById(id)
}
suspend fun awaitChapters(id: Long): List<Chapter> {
return chapterRepository.getChapterByMangaId(id)
suspend fun awaitChapters(id: Long, applyScanlatorFilter: Boolean = false): List<Chapter> {
return chapterRepository.getChapterByMangaId(id, applyScanlatorFilter)
}
}
@@ -1,17 +0,0 @@
package tachiyomi.domain.manga.interactor
import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.manga.model.MangaUpdate
import tachiyomi.domain.manga.repository.MangaRepository
class SetMangaFilteredScanlators(private val mangaRepository: MangaRepository) {
suspend fun awaitSetFilteredScanlators(manga: Manga, filteredScanlators: List<String>): Boolean {
return mangaRepository.update(
MangaUpdate(
id = manga.id,
filteredScanlators = filteredScanlators,
),
)
}
}
@@ -31,9 +31,6 @@ data class Manga(
val initialized: Boolean,
val lastModifiedAt: Long,
val favoriteModifiedAt: Long?,
// SY -->
val filteredScanlators: List<String>?,
// SY <--
) : Serializable {
// SY -->
@@ -152,9 +149,6 @@ data class Manga(
initialized = false,
lastModifiedAt = 0L,
favoriteModifiedAt = null,
// SY -->
filteredScanlators = null,
// SY <--
)
// SY -->
@@ -52,8 +52,5 @@ fun Manga.toMangaUpdate(): MangaUpdate {
thumbnailUrl = thumbnailUrl,
updateStrategy = updateStrategy,
initialized = initialized,
// SY -->
filteredScanlators = filteredScanlators,
// SY <--
)
}