Fix gallery adder
This commit is contained in:
parent
6954c299b5
commit
9a10f1300a
@ -3,15 +3,14 @@ package eu.kanade.tachiyomi.source.online.all
|
|||||||
import eu.kanade.domain.category.interactor.GetCategories
|
import eu.kanade.domain.category.interactor.GetCategories
|
||||||
import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId
|
import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId
|
||||||
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
|
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
|
||||||
|
import eu.kanade.domain.chapter.model.Chapter
|
||||||
import eu.kanade.domain.chapter.model.toDbChapter
|
import eu.kanade.domain.chapter.model.toDbChapter
|
||||||
import eu.kanade.domain.manga.interactor.GetManga
|
import eu.kanade.domain.manga.interactor.GetManga
|
||||||
import eu.kanade.domain.manga.interactor.GetMergedReferencesById
|
import eu.kanade.domain.manga.interactor.GetMergedReferencesById
|
||||||
import eu.kanade.domain.manga.interactor.InsertManga
|
import eu.kanade.domain.manga.interactor.InsertManga
|
||||||
|
import eu.kanade.domain.manga.interactor.UpdateManga
|
||||||
|
import eu.kanade.domain.manga.model.Manga
|
||||||
import eu.kanade.domain.manga.model.toMangaInfo
|
import eu.kanade.domain.manga.model.toMangaInfo
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter
|
|
||||||
import eu.kanade.tachiyomi.data.database.models.MangaImpl
|
|
||||||
import eu.kanade.tachiyomi.data.database.models.toDomainManga
|
|
||||||
import eu.kanade.tachiyomi.data.database.models.toMangaInfo
|
|
||||||
import eu.kanade.tachiyomi.data.download.DownloadManager
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
@ -21,7 +20,6 @@ import eu.kanade.tachiyomi.source.model.Page
|
|||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.model.toSChapter
|
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.source.online.HttpSource
|
||||||
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
|
||||||
@ -40,14 +38,14 @@ import tachiyomi.source.model.MangaInfo
|
|||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
import eu.kanade.domain.chapter.model.Chapter as DomainChapter
|
import eu.kanade.tachiyomi.data.database.models.Chapter as DbChapter
|
||||||
import eu.kanade.domain.manga.model.Manga as DomainManga
|
|
||||||
|
|
||||||
class MergedSource : HttpSource() {
|
class MergedSource : HttpSource() {
|
||||||
private val getManga: GetManga by injectLazy()
|
private val getManga: GetManga by injectLazy()
|
||||||
private val getMergedReferencesById: GetMergedReferencesById by injectLazy()
|
private val getMergedReferencesById: GetMergedReferencesById by injectLazy()
|
||||||
private val getMergedChaptersByMangaId: GetMergedChapterByMangaId by injectLazy()
|
private val getMergedChaptersByMangaId: GetMergedChapterByMangaId by injectLazy()
|
||||||
private val insertManga: InsertManga by injectLazy()
|
private val insertManga: InsertManga by injectLazy()
|
||||||
|
private val updateManga: UpdateManga by injectLazy()
|
||||||
private val getCategories: GetCategories by injectLazy()
|
private val getCategories: GetCategories by injectLazy()
|
||||||
private val sourceManager: SourceManager by injectLazy()
|
private val sourceManager: SourceManager by injectLazy()
|
||||||
private val downloadManager: DownloadManager by injectLazy()
|
private val downloadManager: DownloadManager by injectLazy()
|
||||||
@ -105,7 +103,7 @@ class MergedSource : HttpSource() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO more chapter dedupe
|
// TODO more chapter dedupe
|
||||||
suspend fun transformMergedChapters(mangaId: Long, chapterList: List<DomainChapter>, editScanlators: Boolean, dedupe: Boolean): List<DomainChapter> {
|
suspend fun transformMergedChapters(mangaId: Long, chapterList: List<Chapter>, editScanlators: Boolean, dedupe: Boolean): List<Chapter> {
|
||||||
val mangaReferences = getMergedReferencesById.await(mangaId)
|
val mangaReferences = getMergedReferencesById.await(mangaId)
|
||||||
val chapters = if (editScanlators) {
|
val chapters = if (editScanlators) {
|
||||||
val sources = mangaReferences.map { sourceManager.getOrStub(it.mangaSourceId) to it.mangaId }
|
val sources = mangaReferences.map { sourceManager.getOrStub(it.mangaSourceId) to it.mangaId }
|
||||||
@ -125,19 +123,19 @@ class MergedSource : HttpSource() {
|
|||||||
return if (dedupe) dedupeChapterList(mangaReferences, chapters) else chapters
|
return if (dedupe) dedupeChapterList(mangaReferences, chapters) else chapters
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getChaptersAsBlockingAsDbChapter(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List<Chapter> {
|
fun getChaptersAsBlockingAsDbChapter(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List<DbChapter> {
|
||||||
return getChaptersAsBlocking(mangaId, editScanlators, dedupe).map(DomainChapter::toDbChapter)
|
return getChaptersAsBlocking(mangaId, editScanlators, dedupe).map(Chapter::toDbChapter)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getChaptersAsBlocking(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List<DomainChapter> {
|
fun getChaptersAsBlocking(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List<Chapter> {
|
||||||
return runBlocking { getChapters(mangaId, editScanlators, dedupe) }
|
return runBlocking { getChapters(mangaId, editScanlators, dedupe) }
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getChapters(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List<DomainChapter> {
|
suspend fun getChapters(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List<Chapter> {
|
||||||
return transformMergedChapters(mangaId, getMergedChaptersByMangaId.await(mangaId), editScanlators, dedupe)
|
return transformMergedChapters(mangaId, getMergedChaptersByMangaId.await(mangaId), editScanlators, dedupe)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun dedupeChapterList(mangaReferences: List<MergedMangaReference>, chapterList: List<DomainChapter>): List<DomainChapter> {
|
private fun dedupeChapterList(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>): List<Chapter> {
|
||||||
return when (mangaReferences.firstOrNull { it.mangaSourceId == MERGED_SOURCE_ID }?.chapterSortMode) {
|
return when (mangaReferences.firstOrNull { it.mangaSourceId == MERGED_SOURCE_ID }?.chapterSortMode) {
|
||||||
MergedMangaReference.CHAPTER_SORT_NO_DEDUPE, MergedMangaReference.CHAPTER_SORT_NONE -> chapterList
|
MergedMangaReference.CHAPTER_SORT_NO_DEDUPE, MergedMangaReference.CHAPTER_SORT_NONE -> chapterList
|
||||||
MergedMangaReference.CHAPTER_SORT_PRIORITY -> chapterList
|
MergedMangaReference.CHAPTER_SORT_PRIORITY -> chapterList
|
||||||
@ -155,22 +153,22 @@ class MergedSource : HttpSource() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findSourceWithMostChapters(chapterList: List<DomainChapter>): Long? {
|
private fun findSourceWithMostChapters(chapterList: List<Chapter>): Long? {
|
||||||
return chapterList.groupBy { it.mangaId }.maxByOrNull { it.value.size }?.key
|
return chapterList.groupBy { it.mangaId }.maxByOrNull { it.value.size }?.key
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findSourceWithHighestChapterNumber(chapterList: List<DomainChapter>): Long? {
|
private fun findSourceWithHighestChapterNumber(chapterList: List<Chapter>): Long? {
|
||||||
return chapterList.maxByOrNull { it.chapterNumber }?.mangaId
|
return chapterList.maxByOrNull { it.chapterNumber }?.mangaId
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun fetchChaptersForMergedManga(manga: DomainManga, 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)
|
||||||
getChaptersAsBlockingAsDbChapter(manga.id, editScanlators, dedupe)
|
getChapters(manga.id, editScanlators, dedupe)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun fetchChaptersAndSync(manga: DomainManga, downloadChapters: Boolean = true): Pair<List<DomainChapter>, List<DomainChapter>> {
|
suspend fun fetchChaptersAndSync(manga: Manga, downloadChapters: Boolean = true): Pair<List<Chapter>, List<Chapter>> {
|
||||||
val syncChaptersWithSource = Injekt.get<SyncChaptersWithSource>()
|
val syncChaptersWithSource = Injekt.get<SyncChaptersWithSource>()
|
||||||
val mangaReferences = getMergedReferencesById.await(manga.id)
|
val mangaReferences = getMergedReferencesById.await(manga.id)
|
||||||
if (mangaReferences.isEmpty()) {
|
if (mangaReferences.isEmpty()) {
|
||||||
@ -190,7 +188,7 @@ class MergedSource : HttpSource() {
|
|||||||
values.map {
|
values.map {
|
||||||
try {
|
try {
|
||||||
val (source, loadedManga, reference) =
|
val (source, loadedManga, reference) =
|
||||||
it.load(sourceManager, getManga, insertManga)
|
it.load(sourceManager, getManga, insertManga, updateManga)
|
||||||
if (loadedManga != null && reference.getChapterUpdates) {
|
if (loadedManga != null && reference.getChapterUpdates) {
|
||||||
val chapterList = source.getChapterList(loadedManga.toMangaInfo())
|
val chapterList = source.getChapterList(loadedManga.toMangaInfo())
|
||||||
.map(ChapterInfo::toSChapter)
|
.map(ChapterInfo::toSChapter)
|
||||||
@ -199,7 +197,7 @@ class MergedSource : HttpSource() {
|
|||||||
if (ifDownloadNewChapters && reference.downloadChapters) {
|
if (ifDownloadNewChapters && reference.downloadChapters) {
|
||||||
downloadManager.downloadChapters(
|
downloadManager.downloadChapters(
|
||||||
loadedManga,
|
loadedManga,
|
||||||
results.first.map(DomainChapter::toDbChapter),
|
results.first.map(Chapter::toDbChapter),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
results
|
results
|
||||||
@ -225,27 +223,24 @@ class MergedSource : HttpSource() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun MergedMangaReference.load(sourceManager: SourceManager, getManga: GetManga, insertManga: InsertManga): LoadedMangaSource {
|
suspend fun MergedMangaReference.load(sourceManager: SourceManager, getManga: GetManga, insertManga: InsertManga, updateManga: UpdateManga): LoadedMangaSource {
|
||||||
var manga = getManga.await(mangaUrl, mangaSourceId)
|
var manga = getManga.await(mangaUrl, mangaSourceId)
|
||||||
val source = sourceManager.getOrStub(manga?.source ?: mangaSourceId)
|
val source = sourceManager.getOrStub(manga?.source ?: mangaSourceId)
|
||||||
if (manga == null) {
|
if (manga == null) {
|
||||||
val newManga = MangaImpl().apply {
|
val id = insertManga.await(
|
||||||
this.source = mangaSourceId
|
Manga.create().copy(
|
||||||
this.url = mangaUrl
|
source = mangaSourceId,
|
||||||
this.title = "TODO"
|
url = mangaUrl
|
||||||
}
|
)
|
||||||
newManga.copyFrom(source.getMangaDetails(newManga.toMangaInfo()).toSManga())
|
)!!
|
||||||
newManga.id = -1
|
val newManga = getManga.await(id)!!
|
||||||
val result = run {
|
updateManga.awaitUpdateFromSource(newManga, source.getMangaDetails(newManga.toMangaInfo()), false)
|
||||||
val id = insertManga.await(newManga.toDomainManga()!!)
|
manga = getManga.await(id)!!
|
||||||
getManga.await(id!!)
|
|
||||||
}
|
|
||||||
manga = result
|
|
||||||
}
|
}
|
||||||
return LoadedMangaSource(source, manga, this)
|
return LoadedMangaSource(source, manga, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
data class LoadedMangaSource(val source: Source, val manga: DomainManga?, val reference: MergedMangaReference)
|
data class LoadedMangaSource(val source: Source, val manga: Manga?, val reference: MergedMangaReference)
|
||||||
|
|
||||||
override val lang = "all"
|
override val lang = "all"
|
||||||
override val supportsLatest = false
|
override val supportsLatest = false
|
||||||
|
@ -11,8 +11,6 @@ import eu.kanade.domain.manga.interactor.UpdateManga
|
|||||||
import eu.kanade.domain.manga.model.Manga
|
import eu.kanade.domain.manga.model.Manga
|
||||||
import eu.kanade.domain.manga.model.toMangaInfo
|
import eu.kanade.domain.manga.model.toMangaInfo
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.models.MangaImpl
|
|
||||||
import eu.kanade.tachiyomi.data.database.models.toDomainManga
|
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.source.SourceManager
|
import eu.kanade.tachiyomi.source.SourceManager
|
||||||
import eu.kanade.tachiyomi.source.model.toSChapter
|
import eu.kanade.tachiyomi.source.model.toSChapter
|
||||||
@ -122,20 +120,18 @@ class GalleryAdder(
|
|||||||
// Use manga in DB if possible, otherwise, make a new manga
|
// Use manga in DB if possible, otherwise, make a new manga
|
||||||
var manga = getManga.await(cleanedMangaUrl, source.id)
|
var manga = getManga.await(cleanedMangaUrl, source.id)
|
||||||
?: run {
|
?: run {
|
||||||
val newManga = MangaImpl().apply {
|
insertManga.await(
|
||||||
this.url = realMangaUrl
|
Manga.create().copy(
|
||||||
this.source = source.id
|
source = source.id,
|
||||||
this.id = -1
|
url = cleanedMangaUrl
|
||||||
this.title = "TODO"
|
)
|
||||||
}
|
)
|
||||||
newManga.id = -1
|
|
||||||
insertManga.await(newManga.toDomainManga()!!)
|
|
||||||
getManga.await(cleanedMangaUrl, source.id)!!
|
getManga.await(cleanedMangaUrl, source.id)!!
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch and copy details
|
// Fetch and copy details
|
||||||
val newManga = source.getMangaDetails(manga.toMangaInfo())
|
val newManga = source.getMangaDetails(manga.toMangaInfo())
|
||||||
updateManga.awaitUpdateFromSource(manga, newManga, false, Injekt.get())
|
updateManga.awaitUpdateFromSource(manga, newManga, false)
|
||||||
manga = getManga.await(manga.id)!!
|
manga = getManga.await(manga.id)!!
|
||||||
|
|
||||||
if (fav) {
|
if (fav) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user