Add source to merged chapters without messing with the scanlators
This commit is contained in:
parent
1acb7a1a35
commit
0a6672a768
@ -118,7 +118,7 @@ class SYDomainModule : InjektModule {
|
|||||||
addFactory { GetMergedManga(get()) }
|
addFactory { GetMergedManga(get()) }
|
||||||
addFactory { GetMergedMangaById(get()) }
|
addFactory { GetMergedMangaById(get()) }
|
||||||
addFactory { GetMergedReferencesById(get()) }
|
addFactory { GetMergedReferencesById(get()) }
|
||||||
addFactory { GetMergedChapterByMangaId(get(), get(), get()) }
|
addFactory { GetMergedChapterByMangaId(get(), get()) }
|
||||||
addFactory { InsertMergedReference(get()) }
|
addFactory { InsertMergedReference(get()) }
|
||||||
addFactory { UpdateMergedSettings(get()) }
|
addFactory { UpdateMergedSettings(get()) }
|
||||||
addFactory { DeleteByMergeId(get()) }
|
addFactory { DeleteByMergeId(get()) }
|
||||||
|
@ -3,7 +3,6 @@ package eu.kanade.domain.chapter.interactor
|
|||||||
import eu.kanade.domain.chapter.model.Chapter
|
import eu.kanade.domain.chapter.model.Chapter
|
||||||
import eu.kanade.domain.chapter.repository.ChapterRepository
|
import eu.kanade.domain.chapter.repository.ChapterRepository
|
||||||
import eu.kanade.domain.manga.interactor.GetMergedReferencesById
|
import eu.kanade.domain.manga.interactor.GetMergedReferencesById
|
||||||
import eu.kanade.tachiyomi.source.SourceManager
|
|
||||||
import eu.kanade.tachiyomi.util.system.logcat
|
import eu.kanade.tachiyomi.util.system.logcat
|
||||||
import exh.merged.sql.models.MergedMangaReference
|
import exh.merged.sql.models.MergedMangaReference
|
||||||
import exh.source.MERGED_SOURCE_ID
|
import exh.source.MERGED_SOURCE_ID
|
||||||
@ -15,18 +14,17 @@ import logcat.LogPriority
|
|||||||
class GetMergedChapterByMangaId(
|
class GetMergedChapterByMangaId(
|
||||||
private val chapterRepository: ChapterRepository,
|
private val chapterRepository: ChapterRepository,
|
||||||
private val getMergedReferencesById: GetMergedReferencesById,
|
private val getMergedReferencesById: GetMergedReferencesById,
|
||||||
private val sourceManager: SourceManager,
|
|
||||||
) {
|
) {
|
||||||
|
|
||||||
suspend fun await(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List<Chapter> {
|
suspend fun await(mangaId: Long, dedupe: Boolean = true): List<Chapter> {
|
||||||
return transformMergedChapters(getMergedReferencesById.await(mangaId), getFromDatabase(mangaId), editScanlators, dedupe)
|
return transformMergedChapters(getMergedReferencesById.await(mangaId), getFromDatabase(mangaId), dedupe)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun subscribe(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): Flow<List<Chapter>> {
|
suspend fun subscribe(mangaId: Long, dedupe: Boolean = true): Flow<List<Chapter>> {
|
||||||
return try {
|
return try {
|
||||||
chapterRepository.getMergedChapterByMangaIdAsFlow(mangaId)
|
chapterRepository.getMergedChapterByMangaIdAsFlow(mangaId)
|
||||||
.combine(getMergedReferencesById.subscribe(mangaId)) { chapters, references ->
|
.combine(getMergedReferencesById.subscribe(mangaId)) { chapters, references ->
|
||||||
transformMergedChapters(references, chapters, editScanlators, dedupe)
|
transformMergedChapters(references, chapters, dedupe)
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
logcat(LogPriority.ERROR, e)
|
logcat(LogPriority.ERROR, e)
|
||||||
@ -44,27 +42,8 @@ class GetMergedChapterByMangaId(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO more chapter dedupe
|
// TODO more chapter dedupe
|
||||||
fun transformMergedChapters(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>, editScanlators: Boolean, dedupe: Boolean): List<Chapter> {
|
fun transformMergedChapters(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>, dedupe: Boolean): List<Chapter> {
|
||||||
val chapters = if (editScanlators) {
|
return if (dedupe) dedupeChapterList(mangaReferences, chapterList) else chapterList
|
||||||
val sources = mangaReferences.map { sourceManager.getOrStub(it.mangaSourceId) to it.mangaId }
|
|
||||||
chapterList.map { chapter ->
|
|
||||||
val source = sources.firstOrNull { chapter.mangaId == it.second }?.first
|
|
||||||
if (source != null) {
|
|
||||||
chapter.copy(
|
|
||||||
scanlator = if (chapter.scanlator.isNullOrBlank()) {
|
|
||||||
source.name
|
|
||||||
} else {
|
|
||||||
"$source: ${chapter.scanlator}"
|
|
||||||
},
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
chapter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
chapterList
|
|
||||||
}
|
|
||||||
return if (dedupe) dedupeChapterList(mangaReferences, chapters) else chapters
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun dedupeChapterList(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>): List<Chapter> {
|
private fun dedupeChapterList(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>): List<Chapter> {
|
||||||
|
@ -810,6 +810,9 @@ private fun LazyListScope.sharedChapterItems(
|
|||||||
date = chapterItem.dateUploadString,
|
date = chapterItem.dateUploadString,
|
||||||
readProgress = chapterItem.readProgressString,
|
readProgress = chapterItem.readProgressString,
|
||||||
scanlator = chapterItem.chapter.scanlator.takeIf { !it.isNullOrBlank() /* SY --> */ && chapterItem.showScanlator /* SY <-- */ },
|
scanlator = chapterItem.chapter.scanlator.takeIf { !it.isNullOrBlank() /* SY --> */ && chapterItem.showScanlator /* SY <-- */ },
|
||||||
|
// SY -->
|
||||||
|
sourceName = chapterItem.sourceName,
|
||||||
|
// SY <--
|
||||||
read = chapterItem.chapter.read,
|
read = chapterItem.chapter.read,
|
||||||
bookmark = chapterItem.chapter.bookmark,
|
bookmark = chapterItem.chapter.bookmark,
|
||||||
selected = chapterItem.selected,
|
selected = chapterItem.selected,
|
||||||
|
@ -42,6 +42,9 @@ fun MangaChapterListItem(
|
|||||||
date: String?,
|
date: String?,
|
||||||
readProgress: String?,
|
readProgress: String?,
|
||||||
scanlator: String?,
|
scanlator: String?,
|
||||||
|
// SY -->
|
||||||
|
sourceName: String?,
|
||||||
|
// SY <--
|
||||||
read: Boolean,
|
read: Boolean,
|
||||||
bookmark: Boolean,
|
bookmark: Boolean,
|
||||||
selected: Boolean,
|
selected: Boolean,
|
||||||
@ -104,7 +107,7 @@ fun MangaChapterListItem(
|
|||||||
maxLines = 1,
|
maxLines = 1,
|
||||||
overflow = TextOverflow.Ellipsis,
|
overflow = TextOverflow.Ellipsis,
|
||||||
)
|
)
|
||||||
if (readProgress != null || scanlator != null) DotSeparatorText()
|
if (readProgress != null || scanlator != null /* SY --> */ || sourceName != null/* SY <-- */) DotSeparatorText()
|
||||||
}
|
}
|
||||||
if (readProgress != null) {
|
if (readProgress != null) {
|
||||||
Text(
|
Text(
|
||||||
@ -113,8 +116,18 @@ fun MangaChapterListItem(
|
|||||||
overflow = TextOverflow.Ellipsis,
|
overflow = TextOverflow.Ellipsis,
|
||||||
modifier = Modifier.alpha(ReadItemAlpha),
|
modifier = Modifier.alpha(ReadItemAlpha),
|
||||||
)
|
)
|
||||||
|
if (scanlator != null/* SY --> */ || sourceName != null/* SY <-- */) DotSeparatorText()
|
||||||
|
}
|
||||||
|
// SY -->
|
||||||
|
if (sourceName != null) {
|
||||||
|
Text(
|
||||||
|
text = sourceName,
|
||||||
|
maxLines = 1,
|
||||||
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
)
|
||||||
if (scanlator != null) DotSeparatorText()
|
if (scanlator != null) DotSeparatorText()
|
||||||
}
|
}
|
||||||
|
// SY <--
|
||||||
if (scanlator != null) {
|
if (scanlator != null) {
|
||||||
Text(
|
Text(
|
||||||
text = scanlator,
|
text = scanlator,
|
||||||
|
@ -13,10 +13,13 @@ fun Source.getPreferenceKey(): String = "source_$id"
|
|||||||
|
|
||||||
fun Source.toSourceData(): SourceData = SourceData(id = id, lang = lang, name = name)
|
fun Source.toSourceData(): SourceData = SourceData(id = id, lang = lang, name = name)
|
||||||
|
|
||||||
fun Source.getNameForMangaInfo(mergeSources: List<Source>?): String {
|
fun Source.getNameForMangaInfo(
|
||||||
val preferences = Injekt.get<SourcePreferences>()
|
// SY -->
|
||||||
val enabledLanguages = preferences.enabledLanguages().get()
|
mergeSources: List<Source>?,
|
||||||
.filterNot { it in listOf("all", "other") }
|
enabledLanguages: List<String> = Injekt.get<SourcePreferences>().enabledLanguages().get()
|
||||||
|
.filterNot { it in listOf("all", "other") },
|
||||||
|
// SY <--
|
||||||
|
): String {
|
||||||
val hasOneActiveLanguages = enabledLanguages.size == 1
|
val hasOneActiveLanguages = enabledLanguages.size == 1
|
||||||
val isInEnabledLanguages = lang in enabledLanguages
|
val isInEnabledLanguages = lang in enabledLanguages
|
||||||
return when {
|
return when {
|
||||||
|
@ -45,6 +45,7 @@ import eu.kanade.domain.manga.model.PagePreview
|
|||||||
import eu.kanade.domain.manga.model.TriStateFilter
|
import eu.kanade.domain.manga.model.TriStateFilter
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
import eu.kanade.domain.manga.model.isLocal
|
||||||
import eu.kanade.domain.manga.model.toDbManga
|
import eu.kanade.domain.manga.model.toDbManga
|
||||||
|
import eu.kanade.domain.source.service.SourcePreferences
|
||||||
import eu.kanade.domain.track.interactor.GetTracks
|
import eu.kanade.domain.track.interactor.GetTracks
|
||||||
import eu.kanade.domain.track.interactor.InsertTrack
|
import eu.kanade.domain.track.interactor.InsertTrack
|
||||||
import eu.kanade.domain.track.model.toDbTrack
|
import eu.kanade.domain.track.model.toDbTrack
|
||||||
@ -66,6 +67,7 @@ import eu.kanade.tachiyomi.source.LocalSource
|
|||||||
import eu.kanade.tachiyomi.source.PagePreviewSource
|
import eu.kanade.tachiyomi.source.PagePreviewSource
|
||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.SourceManager
|
import eu.kanade.tachiyomi.source.SourceManager
|
||||||
|
import eu.kanade.tachiyomi.source.getNameForMangaInfo
|
||||||
import eu.kanade.tachiyomi.source.online.MetadataSource
|
import eu.kanade.tachiyomi.source.online.MetadataSource
|
||||||
import eu.kanade.tachiyomi.source.online.all.MergedSource
|
import eu.kanade.tachiyomi.source.online.all.MergedSource
|
||||||
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
|
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
|
||||||
@ -324,7 +326,7 @@ class MangaInfoScreenModel(
|
|||||||
coroutineScope.launchIO {
|
coroutineScope.launchIO {
|
||||||
val manga = getMangaAndChapters.awaitManga(mangaId)
|
val manga = getMangaAndChapters.awaitManga(mangaId)
|
||||||
// SY -->
|
// SY -->
|
||||||
val chapters = (if (manga.source == MERGED_SOURCE_ID) getMergedChapterByMangaId.await(mangaId, true) else getMangaAndChapters.awaitChapters(mangaId))
|
val chapters = (if (manga.source == MERGED_SOURCE_ID) getMergedChapterByMangaId.await(mangaId) else getMangaAndChapters.awaitChapters(mangaId))
|
||||||
.toChapterItemsParams(manga, null)
|
.toChapterItemsParams(manga, null)
|
||||||
val mergedData = getMergedReferencesById.await(mangaId).takeIf { it.isNotEmpty() }?.let { references ->
|
val mergedData = getMergedReferencesById.await(mangaId).takeIf { it.isNotEmpty() }?.let { references ->
|
||||||
MergedMangaData(
|
MergedMangaData(
|
||||||
@ -933,11 +935,15 @@ class MangaInfoScreenModel(
|
|||||||
): List<ChapterItem> {
|
): List<ChapterItem> {
|
||||||
// SY -->
|
// SY -->
|
||||||
val isExhManga = manga.isEhBasedManga()
|
val isExhManga = manga.isEhBasedManga()
|
||||||
|
val enabledLanguages = Injekt.get<SourcePreferences>().enabledLanguages().get()
|
||||||
|
.filterNot { it in listOf("all", "other") }
|
||||||
// SY <--
|
// SY <--
|
||||||
return map { chapter ->
|
return map { chapter ->
|
||||||
val activeDownload = downloadManager.queue.find { chapter.id == it.chapter.id }
|
val activeDownload = downloadManager.queue.find { chapter.id == it.chapter.id }
|
||||||
val chapter = chapter.let { if (mergedData != null) it.toMergedDownloadedChapter() else it }
|
// SY -->
|
||||||
val manga = mergedData?.manga?.get(chapter.mangaId) ?: manga
|
val manga = mergedData?.manga?.get(chapter.mangaId) ?: manga
|
||||||
|
val source = mergedData?.sources?.find { manga.source == it.id }
|
||||||
|
// SY <--
|
||||||
val downloaded = downloadManager.isChapterDownloaded(
|
val downloaded = downloadManager.isChapterDownloaded(
|
||||||
// SY -->
|
// SY -->
|
||||||
chapter.name,
|
chapter.name,
|
||||||
@ -979,6 +985,7 @@ class MangaInfoScreenModel(
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
// SY -->
|
// SY -->
|
||||||
|
sourceName = source?.getNameForMangaInfo(null, enabledLanguages = enabledLanguages),
|
||||||
showScanlator = !isExhManga,
|
showScanlator = !isExhManga,
|
||||||
// SY <--
|
// SY <--
|
||||||
)
|
)
|
||||||
@ -986,10 +993,6 @@ class MangaInfoScreenModel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SY -->
|
// SY -->
|
||||||
private fun Chapter.toMergedDownloadedChapter() = copy(
|
|
||||||
scanlator = scanlator?.substringAfter(": "),
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun getPagePreviews(manga: Manga, source: Source) {
|
private fun getPagePreviews(manga: Manga, source: Source) {
|
||||||
coroutineScope.launchIO {
|
coroutineScope.launchIO {
|
||||||
when (val result = getPagePreviews.await(manga, source, 1)) {
|
when (val result = getPagePreviews.await(manga, source, 1)) {
|
||||||
@ -1174,7 +1177,7 @@ class MangaInfoScreenModel(
|
|||||||
if (state.source is MergedSource) {
|
if (state.source is MergedSource) {
|
||||||
chapters.groupBy { it.mangaId }.forEach { map ->
|
chapters.groupBy { it.mangaId }.forEach { map ->
|
||||||
val manga = state.mergedData?.manga?.get(map.key) ?: return@forEach
|
val manga = state.mergedData?.manga?.get(map.key) ?: return@forEach
|
||||||
downloadManager.downloadChapters(manga, map.value.map { it.toMergedDownloadedChapter() })
|
downloadManager.downloadChapters(manga, map.value)
|
||||||
}
|
}
|
||||||
} else { /* SY <-- */
|
} else { /* SY <-- */
|
||||||
val manga = state.manga
|
val manga = state.manga
|
||||||
@ -1661,7 +1664,8 @@ data class ChapterItem(
|
|||||||
val selected: Boolean = false,
|
val selected: Boolean = false,
|
||||||
|
|
||||||
// SY -->
|
// SY -->
|
||||||
val showScanlator: Boolean = true,
|
val sourceName: String?,
|
||||||
|
val showScanlator: Boolean,
|
||||||
// SY <--
|
// SY <--
|
||||||
) {
|
) {
|
||||||
val isDownloaded = downloadState == Download.State.DOWNLOADED
|
val isDownloaded = downloadState == Download.State.DOWNLOADED
|
||||||
|
Loading…
x
Reference in New Issue
Block a user