Add source to merged chapters without messing with the scanlators

This commit is contained in:
Jobobby04 2022-11-15 01:07:43 -05:00
parent 1acb7a1a35
commit 0a6672a768
6 changed files with 43 additions and 41 deletions

View File

@ -118,7 +118,7 @@ class SYDomainModule : InjektModule {
addFactory { GetMergedManga(get()) }
addFactory { GetMergedMangaById(get()) }
addFactory { GetMergedReferencesById(get()) }
addFactory { GetMergedChapterByMangaId(get(), get(), get()) }
addFactory { GetMergedChapterByMangaId(get(), get()) }
addFactory { InsertMergedReference(get()) }
addFactory { UpdateMergedSettings(get()) }
addFactory { DeleteByMergeId(get()) }

View File

@ -3,7 +3,6 @@ package eu.kanade.domain.chapter.interactor
import eu.kanade.domain.chapter.model.Chapter
import eu.kanade.domain.chapter.repository.ChapterRepository
import eu.kanade.domain.manga.interactor.GetMergedReferencesById
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.util.system.logcat
import exh.merged.sql.models.MergedMangaReference
import exh.source.MERGED_SOURCE_ID
@ -15,18 +14,17 @@ import logcat.LogPriority
class GetMergedChapterByMangaId(
private val chapterRepository: ChapterRepository,
private val getMergedReferencesById: GetMergedReferencesById,
private val sourceManager: SourceManager,
) {
suspend fun await(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List<Chapter> {
return transformMergedChapters(getMergedReferencesById.await(mangaId), getFromDatabase(mangaId), editScanlators, dedupe)
suspend fun await(mangaId: Long, dedupe: Boolean = true): List<Chapter> {
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 {
chapterRepository.getMergedChapterByMangaIdAsFlow(mangaId)
.combine(getMergedReferencesById.subscribe(mangaId)) { chapters, references ->
transformMergedChapters(references, chapters, editScanlators, dedupe)
transformMergedChapters(references, chapters, dedupe)
}
} catch (e: Exception) {
logcat(LogPriority.ERROR, e)
@ -44,27 +42,8 @@ class GetMergedChapterByMangaId(
}
// TODO more chapter dedupe
fun transformMergedChapters(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>, editScanlators: Boolean, dedupe: Boolean): List<Chapter> {
val chapters = if (editScanlators) {
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
fun transformMergedChapters(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>, dedupe: Boolean): List<Chapter> {
return if (dedupe) dedupeChapterList(mangaReferences, chapterList) else chapterList
}
private fun dedupeChapterList(mangaReferences: List<MergedMangaReference>, chapterList: List<Chapter>): List<Chapter> {

View File

@ -810,6 +810,9 @@ private fun LazyListScope.sharedChapterItems(
date = chapterItem.dateUploadString,
readProgress = chapterItem.readProgressString,
scanlator = chapterItem.chapter.scanlator.takeIf { !it.isNullOrBlank() /* SY --> */ && chapterItem.showScanlator /* SY <-- */ },
// SY -->
sourceName = chapterItem.sourceName,
// SY <--
read = chapterItem.chapter.read,
bookmark = chapterItem.chapter.bookmark,
selected = chapterItem.selected,

View File

@ -42,6 +42,9 @@ fun MangaChapterListItem(
date: String?,
readProgress: String?,
scanlator: String?,
// SY -->
sourceName: String?,
// SY <--
read: Boolean,
bookmark: Boolean,
selected: Boolean,
@ -104,7 +107,7 @@ fun MangaChapterListItem(
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
if (readProgress != null || scanlator != null) DotSeparatorText()
if (readProgress != null || scanlator != null /* SY --> */ || sourceName != null/* SY <-- */) DotSeparatorText()
}
if (readProgress != null) {
Text(
@ -113,8 +116,18 @@ fun MangaChapterListItem(
overflow = TextOverflow.Ellipsis,
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()
}
// SY <--
if (scanlator != null) {
Text(
text = scanlator,

View File

@ -13,10 +13,13 @@ fun Source.getPreferenceKey(): String = "source_$id"
fun Source.toSourceData(): SourceData = SourceData(id = id, lang = lang, name = name)
fun Source.getNameForMangaInfo(mergeSources: List<Source>?): String {
val preferences = Injekt.get<SourcePreferences>()
val enabledLanguages = preferences.enabledLanguages().get()
.filterNot { it in listOf("all", "other") }
fun Source.getNameForMangaInfo(
// SY -->
mergeSources: List<Source>?,
enabledLanguages: List<String> = Injekt.get<SourcePreferences>().enabledLanguages().get()
.filterNot { it in listOf("all", "other") },
// SY <--
): String {
val hasOneActiveLanguages = enabledLanguages.size == 1
val isInEnabledLanguages = lang in enabledLanguages
return when {

View File

@ -45,6 +45,7 @@ import eu.kanade.domain.manga.model.PagePreview
import eu.kanade.domain.manga.model.TriStateFilter
import eu.kanade.domain.manga.model.isLocal
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.InsertTrack
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.Source
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.all.MergedSource
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
@ -324,7 +326,7 @@ class MangaInfoScreenModel(
coroutineScope.launchIO {
val manga = getMangaAndChapters.awaitManga(mangaId)
// 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)
val mergedData = getMergedReferencesById.await(mangaId).takeIf { it.isNotEmpty() }?.let { references ->
MergedMangaData(
@ -933,11 +935,15 @@ class MangaInfoScreenModel(
): List<ChapterItem> {
// SY -->
val isExhManga = manga.isEhBasedManga()
val enabledLanguages = Injekt.get<SourcePreferences>().enabledLanguages().get()
.filterNot { it in listOf("all", "other") }
// SY <--
return map { chapter ->
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 source = mergedData?.sources?.find { manga.source == it.id }
// SY <--
val downloaded = downloadManager.isChapterDownloaded(
// SY -->
chapter.name,
@ -979,6 +985,7 @@ class MangaInfoScreenModel(
)
},
// SY -->
sourceName = source?.getNameForMangaInfo(null, enabledLanguages = enabledLanguages),
showScanlator = !isExhManga,
// SY <--
)
@ -986,10 +993,6 @@ class MangaInfoScreenModel(
}
// SY -->
private fun Chapter.toMergedDownloadedChapter() = copy(
scanlator = scanlator?.substringAfter(": "),
)
private fun getPagePreviews(manga: Manga, source: Source) {
coroutineScope.launchIO {
when (val result = getPagePreviews.await(manga, source, 1)) {
@ -1174,7 +1177,7 @@ class MangaInfoScreenModel(
if (state.source is MergedSource) {
chapters.groupBy { it.mangaId }.forEach { map ->
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 <-- */
val manga = state.manga
@ -1661,7 +1664,8 @@ data class ChapterItem(
val selected: Boolean = false,
// SY -->
val showScanlator: Boolean = true,
val sourceName: String?,
val showScanlator: Boolean,
// SY <--
) {
val isDownloaded = downloadState == Download.State.DOWNLOADED