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 c60ffb123..fd8dbfdff 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 @@ -17,7 +17,6 @@ import eu.kanade.tachiyomi.source.model.toSChapter import eu.kanade.tachiyomi.source.model.toSManga import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource -import eu.kanade.tachiyomi.util.lang.awaitSingle import eu.kanade.tachiyomi.util.lang.withIOContext import eu.kanade.tachiyomi.util.shouldDownloadNewChapters import exh.merged.sql.models.MergedMangaReference @@ -78,22 +77,30 @@ class MergedSource : HttpSource() { } } - fun getChaptersFromDB(manga: Manga, editScanlators: Boolean = false, dedupe: Boolean = true): Observable> { - // TODO more chapter dedupe + // TODO more chapter dedupe + private fun transformMergedChapters(manga: Manga, chapterList: List, editScanlators: Boolean, dedupe: Boolean): List { + val mangaReferences = db.getMergedMangaReferences(manga.id!!).executeAsBlocking() + 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 + if (source != null) { + chapter.scanlator = if (chapter.scanlator.isNullOrBlank()) source.name + else "$source: ${chapter.scanlator}" + } + } + } + return if (dedupe) dedupeChapterList(mangaReferences, chapterList) else chapterList + } + + fun getChaptersAsBlocking(manga: Manga, editScanlators: Boolean = false, dedupe: Boolean = true): List { + return transformMergedChapters(manga, db.getChaptersByMergedMangaId(manga.id!!).executeAsBlocking(), editScanlators, dedupe) + } + + fun getChaptersObservable(manga: Manga, editScanlators: Boolean = false, dedupe: Boolean = true): Observable> { return db.getChaptersByMergedMangaId(manga.id!!).asRxObservable() .map { chapterList -> - val mangaReferences = db.getMergedMangaReferences(manga.id!!).executeAsBlocking() - 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 - if (source != null) { - chapter.scanlator = if (chapter.scanlator.isNullOrBlank()) source.name - else "$source: ${chapter.scanlator}" - } - } - } - if (dedupe) dedupeChapterList(mangaReferences, chapterList) else chapterList + transformMergedChapters(manga, chapterList, editScanlators, dedupe) } } @@ -126,7 +133,7 @@ class MergedSource : HttpSource() { suspend fun fetchChaptersForMergedManga(manga: Manga, downloadChapters: Boolean = true, editScanlators: Boolean = false, dedupe: Boolean = true): List { return withIOContext { fetchChaptersAndSync(manga, downloadChapters) - getChaptersFromDB(manga, editScanlators, dedupe).awaitSingle() + getChaptersAsBlocking(manga, 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 547f93bca..0aa2be442 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 @@ -19,7 +19,6 @@ import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter import eu.kanade.tachiyomi.util.isLocal -import eu.kanade.tachiyomi.util.lang.awaitSingle import eu.kanade.tachiyomi.util.lang.combineLatest import eu.kanade.tachiyomi.util.lang.isNullOrUnsubscribed import eu.kanade.tachiyomi.util.lang.launchIO @@ -33,7 +32,6 @@ import exh.source.isEhBasedManga import exh.util.executeOnIO import exh.util.isLewd import exh.util.nullIfBlank -import kotlinx.coroutines.runBlocking import rx.Observable import rx.Subscription import rx.android.schedulers.AndroidSchedulers @@ -547,7 +545,7 @@ class LibraryPresenter( val chapter = db.getChapters(manga).executeOnIO().minByOrNull { it.source_order } if (chapter != null && !chapter.read) listOf(chapter) else emptyList() } else if (manga.source == MERGED_SOURCE_ID) { - (sourceManager.getOrStub(MERGED_SOURCE_ID) as? MergedSource)?.getChaptersFromDB(manga)?.awaitSingle()?.filter { !it.read }.orEmpty() + (sourceManager.getOrStub(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga).filter { !it.read } } else /* SY <-- */ db.getChapters(manga).executeAsBlocking() .filter { !it.read } @@ -602,7 +600,7 @@ class LibraryPresenter( fun markReadStatus(mangas: List, read: Boolean) { mangas.forEach { manga -> launchIO { - val chapters = if (manga.source == MERGED_SOURCE_ID) (sourceManager.get(MERGED_SOURCE_ID) as? MergedSource)?.getChaptersFromDB(manga)?.awaitSingle().orEmpty() else db.getChapters(manga).executeAsBlocking() + val chapters = if (manga.source == MERGED_SOURCE_ID) (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga) else db.getChapters(manga).executeAsBlocking() chapters.forEach { it.read = read if (!read) { @@ -689,7 +687,9 @@ class LibraryPresenter( // SY --> /** 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).let { runBlocking { it?.getChaptersFromDB(manga)?.awaitSingle().orEmpty() } } else db.getChapters(manga).executeAsBlocking()) + val chapters = if (manga.source == MERGED_SOURCE_ID) { + (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga) + } else db.getChapters(manga).executeAsBlocking() return if (manga.isEhBasedManga()) { val chapter = chapters.sortedBy { it.source_order }.getOrNull(0) if (chapter?.read == false) chapter else null 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 fb3df85d6..eea95cc03 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 @@ -211,7 +211,7 @@ class MangaPresenter( // 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.getChaptersFromDB(manga, true, dedupe) else /* SY <-- */ db.getChapters(manga).asRxObservable()) + (/* SY --> */if (source is MergedSource) source.getChaptersObservable(manga, true, dedupe) else /* SY <-- */ db.getChapters(manga).asRxObservable()) .map { chapters -> // Convert every chapter to a model. chapters.map { it.toModel() } @@ -759,10 +759,17 @@ class MangaPresenter( val isMergedSource = source is MergedSource // SY <-- chapters - .filter { downloadManager.isChapterDownloaded(it, /* SY --> */ if (isMergedSource) mergedManga.firstOrNull { manga -> it.manga_id == manga.id } ?: manga else /* SY <-- */ manga) } + .filter { downloadManager.isChapterDownloaded(/* SY --> */ if (isMergedSource) it.toMergedDownloadChapter() else it, if (isMergedSource) mergedManga.firstOrNull { manga -> it.manga_id == manga.id } ?: manga else /* SY <-- */ manga) } .forEach { it.status = Download.State.DOWNLOADED } } + private fun Chapter.toMergedDownloadChapter() = Chapter.create().apply { + url = this@toMergedDownloadChapter.url + name = this@toMergedDownloadChapter.name + id = this@toMergedDownloadChapter.id + scanlator = this@toMergedDownloadChapter.scanlator?.substringAfter(": ") + } + /** * Requests an updated list of chapters from the source. */ @@ -919,7 +926,7 @@ class MangaPresenter( if (source is MergedSource) { chapters.groupBy { it.manga_id }.forEach { map -> val manga = mergedManga.firstOrNull { it.id == map.key } ?: return@forEach - downloadManager.downloadChapters(manga, map.value.onEach { chapter -> chapter.scanlator?.let { chapter.scanlator = it.substringBefore(":") } }) + downloadManager.downloadChapters(manga, map.value.map { it.toMergedDownloadChapter() }) } } else /* SY <-- */ downloadManager.downloadChapters(manga, chapters) } 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 eb43ccb0c..603d4b3eb 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 @@ -26,7 +26,6 @@ import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter import eu.kanade.tachiyomi.ui.reader.model.ReaderPage import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters import eu.kanade.tachiyomi.util.isLocal -import eu.kanade.tachiyomi.util.lang.awaitSingle import eu.kanade.tachiyomi.util.lang.byteSize import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.takeBytes @@ -47,7 +46,6 @@ import exh.util.mangaType import exh.util.shouldDeleteChapters import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.runBlocking import rx.Observable import rx.Subscription import rx.android.schedulers.AndroidSchedulers @@ -118,7 +116,10 @@ class ReaderPresenter( val meta = meta val filteredScanlators = meta?.filteredScanlators?.let { MdUtil.getScanlators(it) } // SY <-- - val dbChapters = /* SY --> */if (manga.source == MERGED_SOURCE_ID) runBlocking { (sourceManager.get(MERGED_SOURCE_ID) as? MergedSource)?.getChaptersFromDB(manga)?.awaitSingle().orEmpty() } else /* SY <-- */ db.getChapters(manga).executeAsBlocking() + val dbChapters = /* SY --> */ if (manga.source == MERGED_SOURCE_ID) { + (sourceManager.get(MERGED_SOURCE_ID) as MergedSource) + .getChaptersAsBlocking(manga) + } else /* SY <-- */ db.getChapters(manga).executeAsBlocking() val selectedChapter = dbChapters.find { it.id == chapterId } ?: error("Requested chapter of id $chapterId not found in chapter list") diff --git a/app/src/main/java/exh/merged/sql/queries/MergedQueries.kt b/app/src/main/java/exh/merged/sql/queries/MergedQueries.kt index b526d93dd..0f049a411 100644 --- a/app/src/main/java/exh/merged/sql/queries/MergedQueries.kt +++ b/app/src/main/java/exh/merged/sql/queries/MergedQueries.kt @@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.data.database.queries.getAllMergedMangaQuery import eu.kanade.tachiyomi.data.database.queries.getMergedChaptersQuery import eu.kanade.tachiyomi.data.database.queries.getMergedMangaFromUrlQuery import eu.kanade.tachiyomi.data.database.queries.getMergedMangaQuery +import eu.kanade.tachiyomi.data.database.tables.ChapterTable import exh.merged.sql.models.MergedMangaReference import exh.merged.sql.resolvers.MergeMangaSettingsPutResolver import exh.merged.sql.resolvers.MergedMangaIdPutResolver @@ -105,6 +106,7 @@ interface MergedQueries : DbProvider { RawQuery.builder() .query(getMergedChaptersQuery()) .args(mergedMangaId) + .observesTables(ChapterTable.TABLE, MergedTable.TABLE) .build() ) .prepare()