Fix merged manga chapterlist not updating, fix merge chapter downloads
This commit is contained in:
parent
88690008f7
commit
86c228243d
@ -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<List<Chapter>> {
|
||||
// TODO more chapter dedupe
|
||||
// TODO more chapter dedupe
|
||||
private fun transformMergedChapters(manga: Manga, chapterList: List<Chapter>, editScanlators: Boolean, dedupe: Boolean): List<Chapter> {
|
||||
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<Chapter> {
|
||||
return transformMergedChapters(manga, db.getChaptersByMergedMangaId(manga.id!!).executeAsBlocking(), editScanlators, dedupe)
|
||||
}
|
||||
|
||||
fun getChaptersObservable(manga: Manga, editScanlators: Boolean = false, dedupe: Boolean = true): Observable<List<Chapter>> {
|
||||
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<Chapter> {
|
||||
return withIOContext {
|
||||
fetchChaptersAndSync(manga, downloadChapters)
|
||||
getChaptersFromDB(manga, editScanlators, dedupe).awaitSingle()
|
||||
getChaptersAsBlocking(manga, editScanlators, dedupe)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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<Manga>, 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
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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")
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user