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.model.toSManga
|
||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
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.lang.withIOContext
|
||||||
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
|
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
|
||||||
import exh.merged.sql.models.MergedMangaReference
|
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()
|
return db.getChaptersByMergedMangaId(manga.id!!).asRxObservable()
|
||||||
.map { chapterList ->
|
.map { chapterList ->
|
||||||
val mangaReferences = db.getMergedMangaReferences(manga.id!!).executeAsBlocking()
|
transformMergedChapters(manga, chapterList, editScanlators, dedupe)
|
||||||
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,7 +133,7 @@ class MergedSource : HttpSource() {
|
|||||||
suspend fun fetchChaptersForMergedManga(manga: Manga, downloadChapters: Boolean = true, editScanlators: Boolean = false, dedupe: Boolean = true): List<Chapter> {
|
suspend fun fetchChaptersForMergedManga(manga: Manga, downloadChapters: Boolean = true, editScanlators: Boolean = false, dedupe: Boolean = true): List<Chapter> {
|
||||||
return withIOContext {
|
return withIOContext {
|
||||||
fetchChaptersAndSync(manga, downloadChapters)
|
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.source.online.all.MergedSource
|
||||||
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
|
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
|
||||||
import eu.kanade.tachiyomi.util.isLocal
|
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.combineLatest
|
||||||
import eu.kanade.tachiyomi.util.lang.isNullOrUnsubscribed
|
import eu.kanade.tachiyomi.util.lang.isNullOrUnsubscribed
|
||||||
import eu.kanade.tachiyomi.util.lang.launchIO
|
import eu.kanade.tachiyomi.util.lang.launchIO
|
||||||
@ -33,7 +32,6 @@ import exh.source.isEhBasedManga
|
|||||||
import exh.util.executeOnIO
|
import exh.util.executeOnIO
|
||||||
import exh.util.isLewd
|
import exh.util.isLewd
|
||||||
import exh.util.nullIfBlank
|
import exh.util.nullIfBlank
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import rx.Subscription
|
import rx.Subscription
|
||||||
import rx.android.schedulers.AndroidSchedulers
|
import rx.android.schedulers.AndroidSchedulers
|
||||||
@ -547,7 +545,7 @@ class LibraryPresenter(
|
|||||||
val chapter = db.getChapters(manga).executeOnIO().minByOrNull { it.source_order }
|
val chapter = db.getChapters(manga).executeOnIO().minByOrNull { it.source_order }
|
||||||
if (chapter != null && !chapter.read) listOf(chapter) else emptyList()
|
if (chapter != null && !chapter.read) listOf(chapter) else emptyList()
|
||||||
} else if (manga.source == MERGED_SOURCE_ID) {
|
} 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()
|
} else /* SY <-- */ db.getChapters(manga).executeAsBlocking()
|
||||||
.filter { !it.read }
|
.filter { !it.read }
|
||||||
|
|
||||||
@ -602,7 +600,7 @@ class LibraryPresenter(
|
|||||||
fun markReadStatus(mangas: List<Manga>, read: Boolean) {
|
fun markReadStatus(mangas: List<Manga>, read: Boolean) {
|
||||||
mangas.forEach { manga ->
|
mangas.forEach { manga ->
|
||||||
launchIO {
|
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 {
|
chapters.forEach {
|
||||||
it.read = read
|
it.read = read
|
||||||
if (!read) {
|
if (!read) {
|
||||||
@ -689,7 +687,9 @@ class LibraryPresenter(
|
|||||||
// SY -->
|
// SY -->
|
||||||
/** Returns first unread chapter of a manga */
|
/** Returns first unread chapter of a manga */
|
||||||
fun getFirstUnread(manga: Manga): Chapter? {
|
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()) {
|
return if (manga.isEhBasedManga()) {
|
||||||
val chapter = chapters.sortedBy { it.source_order }.getOrNull(0)
|
val chapter = chapters.sortedBy { it.source_order }.getOrNull(0)
|
||||||
if (chapter?.read == false) chapter else null
|
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
|
// Add the subscription that retrieves the chapters from the database, keeps subscribed to
|
||||||
// changes, and sends the list of chapters to the relay.
|
// changes, and sends the list of chapters to the relay.
|
||||||
add(
|
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 ->
|
.map { chapters ->
|
||||||
// Convert every chapter to a model.
|
// Convert every chapter to a model.
|
||||||
chapters.map { it.toModel() }
|
chapters.map { it.toModel() }
|
||||||
@ -759,10 +759,17 @@ class MangaPresenter(
|
|||||||
val isMergedSource = source is MergedSource
|
val isMergedSource = source is MergedSource
|
||||||
// SY <--
|
// SY <--
|
||||||
chapters
|
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 }
|
.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.
|
* Requests an updated list of chapters from the source.
|
||||||
*/
|
*/
|
||||||
@ -919,7 +926,7 @@ class MangaPresenter(
|
|||||||
if (source is MergedSource) {
|
if (source is MergedSource) {
|
||||||
chapters.groupBy { it.manga_id }.forEach { map ->
|
chapters.groupBy { it.manga_id }.forEach { map ->
|
||||||
val manga = mergedManga.firstOrNull { it.id == map.key } ?: return@forEach
|
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)
|
} 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.ReaderPage
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
|
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
|
||||||
import eu.kanade.tachiyomi.util.isLocal
|
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.byteSize
|
||||||
import eu.kanade.tachiyomi.util.lang.launchIO
|
import eu.kanade.tachiyomi.util.lang.launchIO
|
||||||
import eu.kanade.tachiyomi.util.lang.takeBytes
|
import eu.kanade.tachiyomi.util.lang.takeBytes
|
||||||
@ -47,7 +46,6 @@ import exh.util.mangaType
|
|||||||
import exh.util.shouldDeleteChapters
|
import exh.util.shouldDeleteChapters
|
||||||
import kotlinx.coroutines.async
|
import kotlinx.coroutines.async
|
||||||
import kotlinx.coroutines.awaitAll
|
import kotlinx.coroutines.awaitAll
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import rx.Subscription
|
import rx.Subscription
|
||||||
import rx.android.schedulers.AndroidSchedulers
|
import rx.android.schedulers.AndroidSchedulers
|
||||||
@ -118,7 +116,10 @@ class ReaderPresenter(
|
|||||||
val meta = meta
|
val meta = meta
|
||||||
val filteredScanlators = meta?.filteredScanlators?.let { MdUtil.getScanlators(it) }
|
val filteredScanlators = meta?.filteredScanlators?.let { MdUtil.getScanlators(it) }
|
||||||
// SY <--
|
// 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 }
|
val selectedChapter = dbChapters.find { it.id == chapterId }
|
||||||
?: error("Requested chapter of id $chapterId not found in chapter list")
|
?: 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.getMergedChaptersQuery
|
||||||
import eu.kanade.tachiyomi.data.database.queries.getMergedMangaFromUrlQuery
|
import eu.kanade.tachiyomi.data.database.queries.getMergedMangaFromUrlQuery
|
||||||
import eu.kanade.tachiyomi.data.database.queries.getMergedMangaQuery
|
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.models.MergedMangaReference
|
||||||
import exh.merged.sql.resolvers.MergeMangaSettingsPutResolver
|
import exh.merged.sql.resolvers.MergeMangaSettingsPutResolver
|
||||||
import exh.merged.sql.resolvers.MergedMangaIdPutResolver
|
import exh.merged.sql.resolvers.MergedMangaIdPutResolver
|
||||||
@ -105,6 +106,7 @@ interface MergedQueries : DbProvider {
|
|||||||
RawQuery.builder()
|
RawQuery.builder()
|
||||||
.query(getMergedChaptersQuery())
|
.query(getMergedChaptersQuery())
|
||||||
.args(mergedMangaId)
|
.args(mergedMangaId)
|
||||||
|
.observesTables(ChapterTable.TABLE, MergedTable.TABLE)
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
.prepare()
|
.prepare()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user