diff --git a/app/src/main/java/eu/kanade/data/chapter/ChapterRepositoryImpl.kt b/app/src/main/java/eu/kanade/data/chapter/ChapterRepositoryImpl.kt index 58fb236cc..c1d452d95 100644 --- a/app/src/main/java/eu/kanade/data/chapter/ChapterRepositoryImpl.kt +++ b/app/src/main/java/eu/kanade/data/chapter/ChapterRepositoryImpl.kt @@ -6,6 +6,7 @@ import eu.kanade.domain.chapter.model.Chapter import eu.kanade.domain.chapter.model.ChapterUpdate import eu.kanade.domain.chapter.repository.ChapterRepository import eu.kanade.tachiyomi.util.system.logcat +import kotlinx.coroutines.flow.Flow import logcat.LogPriority class ChapterRepositoryImpl( @@ -96,11 +97,20 @@ class ChapterRepositoryImpl( } override suspend fun getChapterByMangaId(mangaId: Long): List { - return try { - handler.awaitList { chaptersQueries.getChapterByMangaId(mangaId, chapterMapper) } - } catch (e: Exception) { - logcat(LogPriority.ERROR, e) - emptyList() - } + return handler.awaitList { chaptersQueries.getChaptersByMangaId(mangaId, chapterMapper) } } + + override suspend fun getChapterByMangaIdFlow(mangaId: Long): Flow> { + return handler.subscribeToList { chaptersQueries.getChaptersByMangaId(mangaId, chapterMapper) } + } + + // SY --> + override suspend fun getMergedChapterByMangaId(mangaId: Long): List { + return handler.awaitList { chaptersQueries.getMergedChaptersByMangaId(mangaId, chapterMapper) } + } + + override suspend fun getMergedChapterByMangaIdAsFlow(mangaId: Long): Flow> { + return handler.subscribeToList { chaptersQueries.getMergedChaptersByMangaId(mangaId, chapterMapper) } + } + // SY <-- } diff --git a/app/src/main/java/eu/kanade/data/history/HistoryRepositoryImpl.kt b/app/src/main/java/eu/kanade/data/history/HistoryRepositoryImpl.kt index adf023120..4fa59901f 100644 --- a/app/src/main/java/eu/kanade/data/history/HistoryRepositoryImpl.kt +++ b/app/src/main/java/eu/kanade/data/history/HistoryRepositoryImpl.kt @@ -47,7 +47,7 @@ class HistoryRepositoryImpl( else -> throw NotImplementedError("Unknown sorting method") } - val chapters = handler.awaitList { chaptersQueries.getChapterByMangaId(mangaId, chapterMapper) } + val chapters = handler.awaitList { chaptersQueries.getChaptersByMangaId(mangaId, chapterMapper) } .sortedWith(sortFunction) val currChapterIndex = chapters.indexOfFirst { chapter.id == it.id } diff --git a/app/src/main/java/eu/kanade/domain/DomainModule.kt b/app/src/main/java/eu/kanade/domain/DomainModule.kt index 2d7187a73..de95abedb 100644 --- a/app/src/main/java/eu/kanade/domain/DomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/DomainModule.kt @@ -4,6 +4,8 @@ import eu.kanade.data.chapter.ChapterRepositoryImpl import eu.kanade.data.history.HistoryRepositoryImpl import eu.kanade.data.manga.MangaRepositoryImpl import eu.kanade.data.source.SourceRepositoryImpl +import eu.kanade.domain.chapter.interactor.GetChapterByMangaId +import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId import eu.kanade.domain.chapter.interactor.ShouldUpdateDbChapter import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.chapter.interactor.UpdateChapter @@ -55,6 +57,7 @@ class DomainModule : InjektModule { addFactory { UpdateManga(get()) } addSingletonFactory { ChapterRepositoryImpl(get()) } + addFactory { GetChapterByMangaId(get()) } addFactory { UpdateChapter(get()) } addFactory { ShouldUpdateDbChapter() } addFactory { SyncChaptersWithSource(get(), get(), get(), get()) } @@ -87,6 +90,7 @@ class DomainModule : InjektModule { addFactory { ToggleExcludeFromDataSaver(get()) } addFactory { SetSourceCategories(get()) } addFactory { ToggleSources(get()) } + addFactory { GetMergedChapterByMangaId(get()) } // SY <-- } } diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/GetChapterByMangaId.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetChapterByMangaId.kt new file mode 100644 index 000000000..6e8db7510 --- /dev/null +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetChapterByMangaId.kt @@ -0,0 +1,31 @@ +package eu.kanade.domain.chapter.interactor + +import eu.kanade.domain.chapter.model.Chapter +import eu.kanade.domain.chapter.repository.ChapterRepository +import eu.kanade.tachiyomi.util.system.logcat +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import logcat.LogPriority + +class GetChapterByMangaId( + private val chapterRepository: ChapterRepository, +) { + + suspend fun await(mangaId: Long): List { + return try { + chapterRepository.getChapterByMangaId(mangaId) + } catch (e: Exception) { + logcat(LogPriority.ERROR, e) + emptyList() + } + } + + suspend fun subscribe(mangaId: Long): Flow> { + return try { + chapterRepository.getChapterByMangaIdFlow(mangaId) + } catch (e: Exception) { + logcat(LogPriority.ERROR, e) + flowOf(emptyList()) + } + } +} diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/GetMergedChapterByMangaId.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetMergedChapterByMangaId.kt new file mode 100644 index 000000000..a915b1d9a --- /dev/null +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetMergedChapterByMangaId.kt @@ -0,0 +1,31 @@ +package eu.kanade.domain.chapter.interactor + +import eu.kanade.domain.chapter.model.Chapter +import eu.kanade.domain.chapter.repository.ChapterRepository +import eu.kanade.tachiyomi.util.system.logcat +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import logcat.LogPriority + +class GetMergedChapterByMangaId( + private val chapterRepository: ChapterRepository, +) { + + suspend fun await(mangaId: Long): List { + return try { + chapterRepository.getMergedChapterByMangaId(mangaId) + } catch (e: Exception) { + logcat(LogPriority.ERROR, e) + emptyList() + } + } + + suspend fun subscribe(mangaId: Long): Flow> { + return try { + chapterRepository.getMergedChapterByMangaIdAsFlow(mangaId) + } catch (e: Exception) { + logcat(LogPriority.ERROR, e) + flowOf(emptyList()) + } + } +} diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt index 38aa4b434..6f1804a87 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt @@ -26,6 +26,7 @@ class SyncChaptersWithSource( private val chapterRepository: ChapterRepository = Injekt.get(), private val shouldUpdateDbChapter: ShouldUpdateDbChapter = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), + private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), ) { suspend fun await( @@ -46,7 +47,7 @@ class SyncChaptersWithSource( } // Chapters from db. - val dbChapters = chapterRepository.getChapterByMangaId(manga.id) + val dbChapters = getChapterByMangaId.await(manga.id) // Chapters from the source not in db. val toAdd = mutableListOf() diff --git a/app/src/main/java/eu/kanade/domain/chapter/repository/ChapterRepository.kt b/app/src/main/java/eu/kanade/domain/chapter/repository/ChapterRepository.kt index 9ffa37260..3a8a8c834 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/repository/ChapterRepository.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/repository/ChapterRepository.kt @@ -2,6 +2,7 @@ package eu.kanade.domain.chapter.repository import eu.kanade.domain.chapter.model.Chapter import eu.kanade.domain.chapter.model.ChapterUpdate +import kotlinx.coroutines.flow.Flow interface ChapterRepository { @@ -14,4 +15,12 @@ interface ChapterRepository { suspend fun removeChaptersWithIds(chapterIds: List) suspend fun getChapterByMangaId(mangaId: Long): List + + suspend fun getChapterByMangaIdFlow(mangaId: Long): Flow> + + // SY --> + suspend fun getMergedChapterByMangaId(mangaId: Long): List + + suspend fun getMergedChapterByMangaIdAsFlow(mangaId: Long): Flow> + // SY <-- } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt index bd692d5b5..6d52bb439 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.source.online.all +import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.domain.manga.model.toDbManga @@ -27,11 +28,11 @@ import exh.source.MERGED_SOURCE_ID import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.supervisorScope import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import okhttp3.Response -import rx.Observable import tachiyomi.source.model.ChapterInfo import tachiyomi.source.model.MangaInfo import uy.kohesive.injekt.Injekt @@ -42,6 +43,7 @@ import eu.kanade.domain.manga.model.Manga as DomainManga class MergedSource : HttpSource() { private val db: DatabaseHelper by injectLazy() + private val getMergedChaptersByMangaId: GetMergedChapterByMangaId by injectLazy() private val sourceManager: SourceManager by injectLazy() private val downloadManager: DownloadManager by injectLazy() private val preferences: PreferencesHelper by injectLazy() @@ -99,62 +101,61 @@ class MergedSource : HttpSource() { } // TODO more chapter dedupe - private fun transformMergedChapters(manga: DomainManga, chapterList: List, editScanlators: Boolean, dedupe: Boolean): List { - val mangaReferences = db.getMergedMangaReferences(manga.id).executeAsBlocking() - if (editScanlators) { + fun transformMergedChapters(mangaId: Long, chapterList: List, editScanlators: Boolean, dedupe: Boolean): List { + val mangaReferences = db.getMergedMangaReferences(mangaId).executeAsBlocking() + val chapters = if (editScanlators) { val sources = mangaReferences.map { sourceManager.getOrStub(it.mangaSourceId) to it.mangaId } - chapterList.onEach { chapter -> - val source = sources.firstOrNull { chapter.manga_id == it.second }?.first + chapterList.map { chapter -> + val source = sources.firstOrNull { chapter.mangaId == it.second }?.first if (source != null) { - chapter.scanlator = if (chapter.scanlator.isNullOrBlank()) source.name - else "$source: ${chapter.scanlator}" - } + chapter.copy( + scanlator = if (chapter.scanlator.isNullOrBlank()) { + source.name + } else { + "$source: ${chapter.scanlator}" + }, + ) + } else chapter } - } - return if (dedupe) dedupeChapterList(mangaReferences, chapterList) else chapterList + } else chapterList + return if (dedupe) dedupeChapterList(mangaReferences, chapters) else chapters } - fun getChaptersAsBlocking(manga: DomainManga, editScanlators: Boolean = false, dedupe: Boolean = true): List { - return transformMergedChapters(manga, db.getChaptersByMergedMangaId(manga.id).executeAsBlocking(), editScanlators, dedupe) + fun getChaptersAsBlocking(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List { + return transformMergedChapters(mangaId, runBlocking { getMergedChaptersByMangaId.await(mangaId) }, editScanlators, dedupe) + .map(DomainChapter::toDbChapter) } - fun getChaptersObservable(manga: DomainManga, editScanlators: Boolean = false, dedupe: Boolean = true): Observable> { - return db.getChaptersByMergedMangaId(manga.id).asRxObservable() - .map { chapterList -> - transformMergedChapters(manga, chapterList, editScanlators, dedupe) - } - } - - private fun dedupeChapterList(mangaReferences: List, chapterList: List): List { + private fun dedupeChapterList(mangaReferences: List, chapterList: List): List { return when (mangaReferences.firstOrNull { it.mangaSourceId == MERGED_SOURCE_ID }?.chapterSortMode) { MergedMangaReference.CHAPTER_SORT_NO_DEDUPE, MergedMangaReference.CHAPTER_SORT_NONE -> chapterList MergedMangaReference.CHAPTER_SORT_PRIORITY -> chapterList MergedMangaReference.CHAPTER_SORT_MOST_CHAPTERS -> { findSourceWithMostChapters(chapterList)?.let { mangaId -> - chapterList.filter { it.manga_id == mangaId } + chapterList.filter { it.mangaId == mangaId } } ?: chapterList } MergedMangaReference.CHAPTER_SORT_HIGHEST_CHAPTER_NUMBER -> { findSourceWithHighestChapterNumber(chapterList)?.let { mangaId -> - chapterList.filter { it.manga_id == mangaId } + chapterList.filter { it.mangaId == mangaId } } ?: chapterList } else -> chapterList } } - private fun findSourceWithMostChapters(chapterList: List): Long? { - return chapterList.groupBy { it.manga_id }.maxByOrNull { it.value.size }?.key + private fun findSourceWithMostChapters(chapterList: List): Long? { + return chapterList.groupBy { it.mangaId }.maxByOrNull { it.value.size }?.key } - private fun findSourceWithHighestChapterNumber(chapterList: List): Long? { - return chapterList.maxByOrNull { it.chapter_number }?.manga_id + private fun findSourceWithHighestChapterNumber(chapterList: List): Long? { + return chapterList.maxByOrNull { it.chapterNumber }?.mangaId } suspend fun fetchChaptersForMergedManga(manga: DomainManga, downloadChapters: Boolean = true, editScanlators: Boolean = false, dedupe: Boolean = true): List { return withIOContext { fetchChaptersAndSync(manga, downloadChapters) - getChaptersAsBlocking(manga, editScanlators, dedupe) + getChaptersAsBlocking(manga.id, editScanlators, dedupe) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index 7823e7f05..42306d554 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -9,7 +9,6 @@ import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaCategory -import eu.kanade.tachiyomi.data.database.models.toDomainManga import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.data.preference.PreferencesHelper @@ -642,7 +641,7 @@ class LibraryPresenter( val mergedSource = sourceManager.get(MERGED_SOURCE_ID) as MergedSource val mergedMangas = db.getMergedMangas(manga.id!!).executeAsBlocking() mergedSource - .getChaptersAsBlocking(manga.toDomainManga()!!) + .getChaptersAsBlocking(manga.id!!) .filter { !it.read } .groupBy { it.manga_id!! } .forEach ab@{ (mangaId, chapters) -> @@ -712,7 +711,7 @@ class LibraryPresenter( mangas.forEach { manga -> launchIO { val chapters = if (manga.source == MERGED_SOURCE_ID) { - (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga.toDomainManga()!!) + (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga.id!!) } else { db.getChapters(manga).executeAsBlocking() } @@ -820,7 +819,7 @@ class LibraryPresenter( /** Returns first unread chapter of a manga */ fun getFirstUnread(manga: Manga): Chapter? { val chapters = if (manga.source == MERGED_SOURCE_ID) { - (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga.toDomainManga()!!) + (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga.id!!) } else db.getChapters(manga).executeAsBlocking() return if (manga.isEhBasedManga()) { val chapter = chapters.sortedBy { it.source_order }.getOrNull(0) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt index 6fc9e78db..593f4ea06 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt @@ -4,6 +4,9 @@ import android.content.Context import android.net.Uri import android.os.Bundle import com.jakewharton.rxrelay.PublishRelay +import eu.kanade.domain.chapter.interactor.GetChapterByMangaId +import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId +import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.database.DatabaseHelper @@ -69,7 +72,9 @@ import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.supervisorScope import kotlinx.coroutines.withContext @@ -93,6 +98,8 @@ class MangaPresenter( private val downloadManager: DownloadManager = Injekt.get(), private val coverCache: CoverCache = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(), + private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), + private val getMergedChapterByMangaId: GetMergedChapterByMangaId = Injekt.get(), ) : BasePresenter() { /** @@ -108,9 +115,7 @@ class MangaPresenter( /** * Subject of list of chapters to allow updating the view without going to DB. */ - private val chaptersRelay: PublishRelay> by lazy { - PublishRelay.create>() - } + private val chaptersRelay by lazy { PublishRelay.create>() } /** * Whether the chapter list has been requested to the source. @@ -220,52 +225,48 @@ class MangaPresenter( // Chapters list - start - // Add the subscription that retrieves the chapters from the database, keeps subscribed to - // changes, and sends the list of chapters to the relay. - add( - (/* SY --> */if (source is MergedSource) source.getChaptersObservable(manga.toDomainManga()!!, true, dedupe) else /* SY <-- */ db.getChapters(manga).asRxObservable()) - .map { chapters -> - // Convert every chapter to a model. - chapters.map { it.toModel() } + // Keeps subscribed to changes and sends the list of chapters to the relay. + presenterScope.launchIO { + manga.id?.let { mangaId -> + if (source is MergedSource) { + getMergedChapterByMangaId.subscribe(mangaId) + .map { source.transformMergedChapters(mangaId, it, true, dedupe) } + } else { + getChapterByMangaId.subscribe(mangaId) } - .doOnNext { chapters -> - // Find downloaded chapters - setDownloadedChapters(chapters) + .collectLatest { domainChapters -> + val chapterItems = domainChapters.map { it.toDbChapter().toModel() } + setDownloadedChapters(chapterItems) + this@MangaPresenter.allChapters = chapterItems + observeDownloads() - allChapterScanlators = chapters.flatMap { MdUtil.getScanlators(it.chapter.scanlator) }.toSet() - - // Store the last emission - this.allChapters = chapters - - // Listen for download status changes - observeDownloads() - - // SY --> - if (chapters.isNotEmpty() && (source.isEhBasedSource()) && DebugToggles.ENABLE_EXH_ROOT_REDIRECT.enabled) { - // Check for gallery in library and accept manga with lowest id - // Find chapters sharing same root - updateHelper.findAcceptedRootAndDiscardOthers(manga.source, chapters) - .onEach { (acceptedChain, _) -> - // Redirect if we are not the accepted root - if (manga.id != acceptedChain.manga.id && acceptedChain.manga.favorite) { - // Update if any of our chapters are not in accepted manga's chapters - xLogD("Found accepted manga %s", manga.url) - val ourChapterUrls = chapters.map { it.url }.toSet() - val acceptedChapterUrls = acceptedChain.chapters.map { it.url }.toSet() - val update = (ourChapterUrls - acceptedChapterUrls).isNotEmpty() - redirectFlow.emit( - EXHRedirect( - acceptedChain.manga, - update, - ), - ) - } - }.launchIn(presenterScope) + // SY --> + if (domainChapters.isNotEmpty() && (source.isEhBasedSource()) && DebugToggles.ENABLE_EXH_ROOT_REDIRECT.enabled) { + // Check for gallery in library and accept manga with lowest id + // Find chapters sharing same root + updateHelper.findAcceptedRootAndDiscardOthers(manga.source, domainChapters.map { it.toDbChapter() }) + .onEach { (acceptedChain, _) -> + // Redirect if we are not the accepted root + if (manga.id != acceptedChain.manga.id && acceptedChain.manga.favorite) { + // Update if any of our chapters are not in accepted manga's chapters + xLogD("Found accepted manga %s", manga.url) + val ourChapterUrls = domainChapters.map { it.url }.toSet() + val acceptedChapterUrls = acceptedChain.chapters.map { it.url }.toSet() + val update = (ourChapterUrls - acceptedChapterUrls).isNotEmpty() + redirectFlow.emit( + EXHRedirect( + acceptedChain.manga, + update, + ), + ) + } + }.launchIn(presenterScope) + } + // SY <-- + chaptersRelay.call(chapterItems) } - // SY <-- - } - .subscribe { chaptersRelay.call(it) }, - ) + } + } // Chapters list - end diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index 3bcca1e54..4393a79b1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -15,7 +15,6 @@ import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga -import eu.kanade.tachiyomi.data.database.models.toDomainManga import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.saver.Image @@ -146,7 +145,7 @@ class ReaderPresenter( // SY <-- val dbChapters = /* SY --> */ if (manga.source == MERGED_SOURCE_ID) { (sourceManager.get(MERGED_SOURCE_ID) as MergedSource) - .getChaptersAsBlocking(manga.toDomainManga()!!) + .getChaptersAsBlocking(manga.id!!) } else /* SY <-- */ db.getChapters(manga).executeAsBlocking() val selectedChapter = dbChapters.find { it.id == chapterId } diff --git a/app/src/main/sqldelight/data/chapters.sq b/app/src/main/sqldelight/data/chapters.sq index c7d8634a5..7b89f6c3f 100644 --- a/app/src/main/sqldelight/data/chapters.sq +++ b/app/src/main/sqldelight/data/chapters.sq @@ -23,11 +23,19 @@ SELECT * FROM chapters WHERE _id = :id; -getChapterByMangaId: +getChaptersByMangaId: SELECT * FROM chapters WHERE manga_id = :mangaId; +getMergedChaptersByMangaId: +SELECT chapters.* +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;