Clean up chapter restoring logic a bit

(cherry picked from commit ce5e10be955d8166f53de8118f8f12e76546b5ea)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt
#	domain/src/main/java/tachiyomi/domain/history/interactor/GetNextChapters.kt
This commit is contained in:
arkon 2023-10-29 11:43:06 -04:00 committed by Jobobby04
parent c99e4cc94b
commit dfb3e2da8e
22 changed files with 98 additions and 90 deletions

View File

@ -40,8 +40,8 @@ import tachiyomi.domain.category.interactor.SetSortModeForCategory
import tachiyomi.domain.category.interactor.UpdateCategory import tachiyomi.domain.category.interactor.UpdateCategory
import tachiyomi.domain.category.repository.CategoryRepository import tachiyomi.domain.category.repository.CategoryRepository
import tachiyomi.domain.chapter.interactor.GetChapter import tachiyomi.domain.chapter.interactor.GetChapter
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId
import tachiyomi.domain.chapter.interactor.GetChapterByUrlAndMangaId import tachiyomi.domain.chapter.interactor.GetChapterByUrlAndMangaId
import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.interactor.SetMangaDefaultChapterFlags import tachiyomi.domain.chapter.interactor.SetMangaDefaultChapterFlags
import tachiyomi.domain.chapter.interactor.ShouldUpdateDbChapter import tachiyomi.domain.chapter.interactor.ShouldUpdateDbChapter
import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.interactor.UpdateChapter
@ -128,7 +128,7 @@ class DomainModule : InjektModule {
addSingletonFactory<ChapterRepository> { ChapterRepositoryImpl(get()) } addSingletonFactory<ChapterRepository> { ChapterRepositoryImpl(get()) }
addFactory { GetChapter(get()) } addFactory { GetChapter(get()) }
addFactory { GetChapterByMangaId(get()) } addFactory { GetChaptersByMangaId(get()) }
addFactory { GetChapterByUrlAndMangaId(get()) } addFactory { GetChapterByUrlAndMangaId(get()) }
addFactory { UpdateChapter(get()) } addFactory { UpdateChapter(get()) }
addFactory { SetReadStatus(get(), get(), get(), get(), get()) } addFactory { SetReadStatus(get(), get(), get(), get(), get()) }

View File

@ -25,7 +25,7 @@ import tachiyomi.data.source.FeedSavedSearchRepositoryImpl
import tachiyomi.data.source.SavedSearchRepositoryImpl import tachiyomi.data.source.SavedSearchRepositoryImpl
import tachiyomi.domain.chapter.interactor.DeleteChapters import tachiyomi.domain.chapter.interactor.DeleteChapters
import tachiyomi.domain.chapter.interactor.GetChapterByUrl import tachiyomi.domain.chapter.interactor.GetChapterByUrl
import tachiyomi.domain.chapter.interactor.GetMergedChapterByMangaId import tachiyomi.domain.chapter.interactor.GetMergedChaptersByMangaId
import tachiyomi.domain.history.interactor.GetHistoryByMangaId import tachiyomi.domain.history.interactor.GetHistoryByMangaId
import tachiyomi.domain.manga.interactor.DeleteByMergeId import tachiyomi.domain.manga.interactor.DeleteByMergeId
import tachiyomi.domain.manga.interactor.DeleteFavoriteEntries import tachiyomi.domain.manga.interactor.DeleteFavoriteEntries
@ -130,7 +130,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()) } addFactory { GetMergedChaptersByMangaId(get(), get()) }
addFactory { InsertMergedReference(get()) } addFactory { InsertMergedReference(get()) }
addFactory { UpdateMergedSettings(get()) } addFactory { UpdateMergedSettings(get()) }
addFactory { DeleteByMergeId(get()) } addFactory { DeleteByMergeId(get()) }

View File

@ -5,7 +5,7 @@ import exh.source.MERGED_SOURCE_ID
import logcat.LogPriority import logcat.LogPriority
import tachiyomi.core.util.lang.withNonCancellableContext import tachiyomi.core.util.lang.withNonCancellableContext
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.domain.chapter.interactor.GetMergedChapterByMangaId import tachiyomi.domain.chapter.interactor.GetMergedChaptersByMangaId
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.chapter.model.ChapterUpdate
import tachiyomi.domain.chapter.repository.ChapterRepository import tachiyomi.domain.chapter.repository.ChapterRepository
@ -19,7 +19,7 @@ class SetReadStatus(
private val mangaRepository: MangaRepository, private val mangaRepository: MangaRepository,
private val chapterRepository: ChapterRepository, private val chapterRepository: ChapterRepository,
// SY --> // SY -->
private val getMergedChapterByMangaId: GetMergedChapterByMangaId, private val getMergedChaptersByMangaId: GetMergedChaptersByMangaId,
// SY <-- // SY <--
) { ) {
@ -78,7 +78,7 @@ class SetReadStatus(
private suspend fun awaitMerged(mangaId: Long, read: Boolean) = withNonCancellableContext f@{ private suspend fun awaitMerged(mangaId: Long, read: Boolean) = withNonCancellableContext f@{
return@f await( return@f await(
read = read, read = read,
chapters = getMergedChapterByMangaId chapters = getMergedChaptersByMangaId
.await(mangaId, dedupe = false) .await(mangaId, dedupe = false)
.toTypedArray(), .toTypedArray(),
) )

View File

@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import exh.source.isEhBasedManga import exh.source.isEhBasedManga
import tachiyomi.data.chapter.ChapterSanitizer import tachiyomi.data.chapter.ChapterSanitizer
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.interactor.ShouldUpdateDbChapter import tachiyomi.domain.chapter.interactor.ShouldUpdateDbChapter
import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.interactor.UpdateChapter
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
@ -33,7 +33,7 @@ class SyncChaptersWithSource(
private val shouldUpdateDbChapter: ShouldUpdateDbChapter, private val shouldUpdateDbChapter: ShouldUpdateDbChapter,
private val updateManga: UpdateManga, private val updateManga: UpdateManga,
private val updateChapter: UpdateChapter, private val updateChapter: UpdateChapter,
private val getChapterByMangaId: GetChapterByMangaId, private val getChaptersByMangaId: GetChaptersByMangaId,
) { ) {
/** /**
@ -67,7 +67,7 @@ class SyncChaptersWithSource(
} }
// Chapters from db. // Chapters from db.
val dbChapters = getChapterByMangaId.await(manga.id) val dbChapters = getChaptersByMangaId.await(manga.id)
// Chapters from the source not in db. // Chapters from the source not in db.
val toAdd = mutableListOf<Chapter>() val toAdd = mutableListOf<Chapter>()

View File

@ -2,7 +2,6 @@ package eu.kanade.domain.chapter.model
import eu.kanade.tachiyomi.data.database.models.ChapterImpl import eu.kanade.tachiyomi.data.database.models.ChapterImpl
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import tachiyomi.data.Chapters
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import eu.kanade.tachiyomi.data.database.models.Chapter as DbChapter import eu.kanade.tachiyomi.data.database.models.Chapter as DbChapter
@ -27,16 +26,6 @@ fun Chapter.copyFromSChapter(sChapter: SChapter): Chapter {
) )
} }
fun Chapter.copyFrom(other: Chapters): Chapter {
return copy(
name = other.name,
url = other.url,
dateUpload = other.date_upload,
chapterNumber = other.chapter_number,
scanlator = other.scanlator?.ifBlank { null },
)
}
fun Chapter.toDbChapter(): DbChapter = ChapterImpl().also { fun Chapter.toDbChapter(): DbChapter = ChapterImpl().also {
it.id = id it.id = id
it.manga_id = mangaId it.manga_id = mangaId

View File

@ -7,18 +7,18 @@ import eu.kanade.tachiyomi.data.cache.PagePreviewCache
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 exh.source.getMainSource import exh.source.getMainSource
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
class GetPagePreviews( class GetPagePreviews(
private val pagePreviewCache: PagePreviewCache, private val pagePreviewCache: PagePreviewCache,
private val getChapters: GetChapterByMangaId, private val getChaptersByMangaId: GetChaptersByMangaId,
) { ) {
suspend fun await(manga: Manga, source: Source, page: Int): Result { suspend fun await(manga: Manga, source: Source, page: Int): Result {
@Suppress("NAME_SHADOWING") @Suppress("NAME_SHADOWING")
val source = source.getMainSource<PagePreviewSource>() ?: return Result.Unused val source = source.getMainSource<PagePreviewSource>() ?: return Result.Unused
val chapters = getChapters.await(manga.id).sortedByDescending { it.sourceOrder } val chapters = getChaptersByMangaId.await(manga.id).sortedByDescending { it.sourceOrder }
val chapterIds = chapters.map { it.id } val chapterIds = chapters.map { it.id }
return try { return try {
val pagePreviews = try { val pagePreviews = try {

View File

@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.data.track.EnhancedTracker
import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.Tracker
import logcat.LogPriority import logcat.LogPriority
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.interactor.UpdateChapter
import tachiyomi.domain.chapter.model.toChapterUpdate import tachiyomi.domain.chapter.model.toChapterUpdate
import tachiyomi.domain.track.interactor.InsertTrack import tachiyomi.domain.track.interactor.InsertTrack
@ -14,7 +14,7 @@ import tachiyomi.domain.track.model.Track
class SyncChapterProgressWithTrack( class SyncChapterProgressWithTrack(
private val updateChapter: UpdateChapter, private val updateChapter: UpdateChapter,
private val insertTrack: InsertTrack, private val insertTrack: InsertTrack,
private val getChapterByMangaId: GetChapterByMangaId, private val getChaptersByMangaId: GetChaptersByMangaId,
) { ) {
suspend fun await( suspend fun await(
@ -26,7 +26,7 @@ class SyncChapterProgressWithTrack(
return return
} }
val sortedChapters = getChapterByMangaId.await(mangaId) val sortedChapters = getChaptersByMangaId.await(mangaId)
.sortedBy { it.chapterNumber } .sortedBy { it.chapterNumber }
.filter { it.isRecognizedNumber } .filter { it.isRecognizedNumber }

View File

@ -77,10 +77,9 @@ import tachiyomi.core.util.lang.launchNonCancellable
import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.lang.withUIContext
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.UnsortedPreferences
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.manga.interactor.GetAllManga import tachiyomi.domain.manga.interactor.GetAllManga
import tachiyomi.domain.manga.interactor.ResetViewerFlags import tachiyomi.domain.manga.interactor.ResetViewerFlags
import tachiyomi.domain.manga.repository.MangaRepository
import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.source.service.SourceManager
import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.LabeledCheckbox
import tachiyomi.presentation.core.util.collectAsState import tachiyomi.presentation.core.util.collectAsState
@ -497,7 +496,7 @@ object SettingsAdvancedScreen : SearchableSettings {
) )
mangaFolder.delete() mangaFolder.delete()
} else { } else {
val chapterList = Injekt.get<GetChapterByMangaId>().await(manga.id) val chapterList = Injekt.get<GetChaptersByMangaId>().await(manga.id)
foldersCleared += downloadManager.cleanupChapters( foldersCleared += downloadManager.cleanupChapters(
chapterList, chapterList,
manga, manga,

View File

@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.data.backup
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import eu.kanade.domain.chapter.model.copyFrom
import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.domain.manga.interactor.UpdateManga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupCategory
@ -41,6 +40,7 @@ import tachiyomi.data.UpdateStrategyColumnAdapter
import tachiyomi.data.manga.MangaMapper import tachiyomi.data.manga.MangaMapper
import tachiyomi.data.manga.MergedMangaMapper import tachiyomi.data.manga.MergedMangaMapper
import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.GetCategories
import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.history.model.HistoryUpdate import tachiyomi.domain.history.model.HistoryUpdate
import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.library.service.LibraryPreferences
@ -68,6 +68,7 @@ class BackupRestorer(
private val handler: DatabaseHandler = Injekt.get() private val handler: DatabaseHandler = Injekt.get()
private val updateManga: UpdateManga = Injekt.get() private val updateManga: UpdateManga = Injekt.get()
private val getCategories: GetCategories = Injekt.get() private val getCategories: GetCategories = Injekt.get()
private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get()
private val fetchInterval: FetchInterval = Injekt.get() private val fetchInterval: FetchInterval = Injekt.get()
private val preferenceStore: PreferenceStore = Injekt.get() private val preferenceStore: PreferenceStore = Injekt.get()
@ -354,30 +355,39 @@ class BackupRestorer(
} }
private suspend fun restoreChapters(manga: Manga, chapters: List<Chapter>) { private suspend fun restoreChapters(manga: Manga, chapters: List<Chapter>) {
val dbChapters = handler.awaitList { chaptersQueries.getChaptersByMangaId(manga.id) } val dbChaptersByUrl = getChaptersByMangaId.await(manga.id)
.associateBy { it.url }
val processed = chapters.map { chapter -> val processed = chapters.map { chapter ->
var updatedChapter = chapter var updatedChapter = chapter
val dbChapter = dbChapters.find { it.url == updatedChapter.url }
val dbChapter = dbChaptersByUrl[updatedChapter.url]
if (dbChapter != null) { if (dbChapter != null) {
updatedChapter = updatedChapter.copy(id = dbChapter._id) updatedChapter = updatedChapter
updatedChapter = updatedChapter.copyFrom(dbChapter) .copyFrom(dbChapter)
.copy(
id = dbChapter.id,
mangaId = manga.id,
bookmark = updatedChapter.bookmark || dbChapter.bookmark,
)
if (dbChapter.read && !updatedChapter.read) { if (dbChapter.read && !updatedChapter.read) {
updatedChapter = updatedChapter.copy(read = true, lastPageRead = dbChapter.last_page_read) updatedChapter = updatedChapter.copy(
} else if (updatedChapter.lastPageRead == 0L && dbChapter.last_page_read != 0L) { read = true,
updatedChapter = updatedChapter.copy(lastPageRead = dbChapter.last_page_read) lastPageRead = dbChapter.lastPageRead,
} )
if (!updatedChapter.bookmark && dbChapter.bookmark) { } else if (updatedChapter.lastPageRead == 0L && dbChapter.lastPageRead != 0L) {
updatedChapter = updatedChapter.copy(bookmark = true) updatedChapter = updatedChapter.copy(
lastPageRead = dbChapter.lastPageRead,
)
} }
} }
updatedChapter.copy(mangaId = manga.id) updatedChapter
} }
val newChapters = processed.groupBy { it.id > 0 } val (existingChapters, newChapters) = processed.partition { it.id > 0 }
newChapters[true]?.let { updateKnownChapters(it) } updateKnownChapters(existingChapters)
newChapters[false]?.let { insertChapters(it) } insertChapters(newChapters)
} }
/** /**

View File

@ -15,7 +15,7 @@ import okhttp3.OkHttpClient
import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.lang.withIOContext
import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.lang.withUIContext
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.history.interactor.GetHistory import tachiyomi.domain.history.interactor.GetHistory
import tachiyomi.domain.track.interactor.InsertTrack import tachiyomi.domain.track.interactor.InsertTrack
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
@ -71,7 +71,7 @@ abstract class BaseTracker(
item.manga_id = mangaId item.manga_id = mangaId
try { try {
withIOContext { withIOContext {
val allChapters = Injekt.get<GetChapterByMangaId>().await(mangaId) val allChapters = Injekt.get<GetChaptersByMangaId>().await(mangaId)
val hasReadChapters = allChapters.any { it.read } val hasReadChapters = allChapters.any { it.read }
bind(item, hasReadChapters) bind(item, hasReadChapters)

View File

@ -39,7 +39,7 @@ import tachiyomi.core.util.system.logcat
import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.UnsortedPreferences
import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.GetCategories
import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.category.interactor.SetMangaCategories
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.interactor.UpdateChapter
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.chapter.model.ChapterUpdate
@ -70,7 +70,7 @@ class MigrationListScreenModel(
private val updateManga: UpdateManga = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(),
private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(), private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(),
private val updateChapter: UpdateChapter = Injekt.get(), private val updateChapter: UpdateChapter = Injekt.get(),
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(),
private val getMergedReferencesById: GetMergedReferencesById = Injekt.get(), private val getMergedReferencesById: GetMergedReferencesById = Injekt.get(),
private val getHistoryByMangaId: GetHistoryByMangaId = Injekt.get(), private val getHistoryByMangaId: GetHistoryByMangaId = Injekt.get(),
private val upsertHistory: UpsertHistory = Injekt.get(), private val upsertHistory: UpsertHistory = Injekt.get(),
@ -134,7 +134,7 @@ class MigrationListScreenModel(
suspend fun getManga(result: SearchResult.Result) = getManga(result.id) suspend fun getManga(result: SearchResult.Result) = getManga(result.id)
suspend fun getManga(id: Long) = getManga.await(id) suspend fun getManga(id: Long) = getManga.await(id)
suspend fun getChapterInfo(result: SearchResult.Result) = getChapterInfo(result.id) suspend fun getChapterInfo(result: SearchResult.Result) = getChapterInfo(result.id)
suspend fun getChapterInfo(id: Long) = getChapterByMangaId.await(id).let { chapters -> suspend fun getChapterInfo(id: Long) = getChaptersByMangaId.await(id).let { chapters ->
MigratingManga.ChapterInfo( MigratingManga.ChapterInfo(
latestChapter = chapters.maxOfOrNull { it.chapterNumber }, latestChapter = chapters.maxOfOrNull { it.chapterNumber },
chapterCount = chapters.size, chapterCount = chapters.size,
@ -310,10 +310,10 @@ class MigrationListScreenModel(
val flags = preferences.migrateFlags().get() val flags = preferences.migrateFlags().get()
// Update chapters read // Update chapters read
if (MigrationFlags.hasChapters(flags)) { if (MigrationFlags.hasChapters(flags)) {
val prevMangaChapters = getChapterByMangaId.await(prevManga.id) val prevMangaChapters = getChaptersByMangaId.await(prevManga.id)
val maxChapterRead = prevMangaChapters.filter(Chapter::read) val maxChapterRead = prevMangaChapters.filter(Chapter::read)
.maxOfOrNull(Chapter::chapterNumber) .maxOfOrNull(Chapter::chapterNumber)
val dbChapters = getChapterByMangaId.await(manga.id) val dbChapters = getChaptersByMangaId.await(manga.id)
val prevHistoryList = getHistoryByMangaId.await(prevManga.id) val prevHistoryList = getHistoryByMangaId.await(prevManga.id)
val chapterUpdates = mutableListOf<ChapterUpdate>() val chapterUpdates = mutableListOf<ChapterUpdate>()

View File

@ -79,8 +79,8 @@ import tachiyomi.domain.UnsortedPreferences
import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.GetCategories
import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.category.interactor.SetMangaCategories
import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.Category
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.interactor.GetMergedChapterByMangaId import tachiyomi.domain.chapter.interactor.GetMergedChaptersByMangaId
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.history.interactor.GetNextChapters import tachiyomi.domain.history.interactor.GetNextChapters
import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.model.LibraryDisplayMode
@ -121,7 +121,7 @@ class LibraryScreenModel(
private val getCategories: GetCategories = Injekt.get(), private val getCategories: GetCategories = Injekt.get(),
private val getTracksPerManga: GetTracksPerManga = Injekt.get(), private val getTracksPerManga: GetTracksPerManga = Injekt.get(),
private val getNextChapters: GetNextChapters = Injekt.get(), private val getNextChapters: GetNextChapters = Injekt.get(),
private val getChaptersByMangaId: GetChapterByMangaId = Injekt.get(), private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(),
private val setReadStatus: SetReadStatus = Injekt.get(), private val setReadStatus: SetReadStatus = Injekt.get(),
private val updateManga: UpdateManga = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(),
private val setMangaCategories: SetMangaCategories = Injekt.get(), private val setMangaCategories: SetMangaCategories = Injekt.get(),
@ -142,7 +142,7 @@ class LibraryScreenModel(
private val getSearchTitles: GetSearchTitles = Injekt.get(), private val getSearchTitles: GetSearchTitles = Injekt.get(),
private val searchEngine: SearchEngine = Injekt.get(), private val searchEngine: SearchEngine = Injekt.get(),
private val setCustomMangaInfo: SetCustomMangaInfo = Injekt.get(), private val setCustomMangaInfo: SetCustomMangaInfo = Injekt.get(),
private val getMergedChapterByMangaId: GetMergedChapterByMangaId = Injekt.get(), private val getMergedChaptersByMangaId: GetMergedChaptersByMangaId = Injekt.get(),
// SY <-- // SY <--
) : StateScreenModel<LibraryScreenModel.State>(State()) { ) : StateScreenModel<LibraryScreenModel.State>(State()) {
@ -581,7 +581,7 @@ class LibraryScreenModel(
// SY --> // SY -->
val mergedManga = getMergedMangaById.await(manga.id).associateBy { it.id } val mergedManga = getMergedMangaById.await(manga.id).associateBy { it.id }
return if (manga.id == MERGED_SOURCE_ID) { return if (manga.id == MERGED_SOURCE_ID) {
getMergedChapterByMangaId.await(manga.id) getMergedChaptersByMangaId.await(manga.id)
} else { } else {
getChaptersByMangaId.await(manga.id) getChaptersByMangaId.await(manga.id)
}.getNextUnread(manga, downloadManager, mergedManga) }.getNextUnread(manga, downloadManager, mergedManga)

View File

@ -82,7 +82,7 @@ import tachiyomi.core.util.system.logcat
import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.GetCategories
import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.category.interactor.SetMangaCategories
import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.Category
import tachiyomi.domain.chapter.interactor.GetMergedChapterByMangaId import tachiyomi.domain.chapter.interactor.GetMergedChaptersByMangaId
import tachiyomi.domain.chapter.interactor.SetMangaDefaultChapterFlags import tachiyomi.domain.chapter.interactor.SetMangaDefaultChapterFlags
import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.interactor.UpdateChapter
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
@ -139,7 +139,7 @@ class MangaScreenModel(
private val sourceManager: SourceManager = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(),
private val getManga: GetManga = Injekt.get(), private val getManga: GetManga = Injekt.get(),
private val setMangaFilteredScanlators: SetMangaFilteredScanlators = Injekt.get(), private val setMangaFilteredScanlators: SetMangaFilteredScanlators = Injekt.get(),
private val getMergedChapterByMangaId: GetMergedChapterByMangaId = Injekt.get(), private val getMergedChaptersByMangaId: GetMergedChaptersByMangaId = Injekt.get(),
private val getMergedMangaById: GetMergedMangaById = Injekt.get(), private val getMergedMangaById: GetMergedMangaById = Injekt.get(),
private val getMergedReferencesById: GetMergedReferencesById = Injekt.get(), private val getMergedReferencesById: GetMergedReferencesById = Injekt.get(),
private val insertMergedReference: InsertMergedReference = Injekt.get(), private val insertMergedReference: InsertMergedReference = Injekt.get(),
@ -239,7 +239,7 @@ class MangaScreenModel(
.distinctUntilChanged() .distinctUntilChanged()
// SY --> // SY -->
.combine( .combine(
getMergedChapterByMangaId.subscribe(mangaId, true) getMergedChaptersByMangaId.subscribe(mangaId, true)
.distinctUntilChanged(), .distinctUntilChanged(),
) { (manga, chapters), mergedChapters -> ) { (manga, chapters), mergedChapters ->
if (manga.source == MERGED_SOURCE_ID) { if (manga.source == MERGED_SOURCE_ID) {
@ -320,7 +320,7 @@ class MangaScreenModel(
screenModelScope.launchIO { screenModelScope.launchIO {
val manga = getMangaAndChapters.awaitManga(mangaId) val manga = getMangaAndChapters.awaitManga(mangaId)
// SY --> // SY -->
val chapters = (if (manga.source == MERGED_SOURCE_ID) getMergedChapterByMangaId.await(mangaId) else getMangaAndChapters.awaitChapters(mangaId)) val chapters = (if (manga.source == MERGED_SOURCE_ID) getMergedChaptersByMangaId.await(mangaId) else getMangaAndChapters.awaitChapters(mangaId))
.toChapterItems(manga, null) .toChapterItems(manga, null)
val mergedData = getMergedReferencesById.await(mangaId).takeIf { it.isNotEmpty() }?.let { references -> val mergedData = getMergedReferencesById.await(mangaId).takeIf { it.isNotEmpty() }?.let { references ->
MergedMangaData( MergedMangaData(

View File

@ -79,8 +79,8 @@ import tachiyomi.core.util.lang.withUIContext
import tachiyomi.core.util.system.ImageUtil import tachiyomi.core.util.system.ImageUtil
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.decoder.ImageDecoder import tachiyomi.decoder.ImageDecoder
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.interactor.GetMergedChapterByMangaId import tachiyomi.domain.chapter.interactor.GetMergedChaptersByMangaId
import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.interactor.UpdateChapter
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.chapter.model.ChapterUpdate
@ -116,7 +116,7 @@ class ReaderViewModel @JvmOverloads constructor(
private val trackPreferences: TrackPreferences = Injekt.get(), private val trackPreferences: TrackPreferences = Injekt.get(),
private val trackChapter: TrackChapter = Injekt.get(), private val trackChapter: TrackChapter = Injekt.get(),
private val getManga: GetManga = Injekt.get(), private val getManga: GetManga = Injekt.get(),
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(),
private val getNextChapters: GetNextChapters = Injekt.get(), private val getNextChapters: GetNextChapters = Injekt.get(),
private val upsertHistory: UpsertHistory = Injekt.get(), private val upsertHistory: UpsertHistory = Injekt.get(),
private val updateChapter: UpdateChapter = Injekt.get(), private val updateChapter: UpdateChapter = Injekt.get(),
@ -126,7 +126,7 @@ class ReaderViewModel @JvmOverloads constructor(
private val getFlatMetadataById: GetFlatMetadataById = Injekt.get(), private val getFlatMetadataById: GetFlatMetadataById = Injekt.get(),
private val getMergedMangaById: GetMergedMangaById = Injekt.get(), private val getMergedMangaById: GetMergedMangaById = Injekt.get(),
private val getMergedReferencesById: GetMergedReferencesById = Injekt.get(), private val getMergedReferencesById: GetMergedReferencesById = Injekt.get(),
private val getMergedChapterByMangaId: GetMergedChapterByMangaId = Injekt.get(), private val getMergedChaptersByMangaId: GetMergedChaptersByMangaId = Injekt.get(),
// SY <-- // SY <--
) : ViewModel() { ) : ViewModel() {
@ -181,10 +181,10 @@ class ReaderViewModel @JvmOverloads constructor(
// SY --> // SY -->
val (chapters, mangaMap) = runBlocking { val (chapters, mangaMap) = runBlocking {
if (manga.source == MERGED_SOURCE_ID) { if (manga.source == MERGED_SOURCE_ID) {
getMergedChapterByMangaId.await(manga.id) to getMergedMangaById.await(manga.id) getMergedChaptersByMangaId.await(manga.id) to getMergedMangaById.await(manga.id)
.associateBy { it.id } .associateBy { it.id }
} else { } else {
getChapterByMangaId.await(manga.id) to null getChaptersByMangaId.await(manga.id) to null
} }
} }
fun isChapterDownloaded(chapter: Chapter): Boolean { fun isChapterDownloaded(chapter: Chapter): Boolean {

View File

@ -8,8 +8,8 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.GetCategories
import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.category.interactor.SetMangaCategories
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId
import tachiyomi.domain.chapter.interactor.GetChapterByUrl import tachiyomi.domain.chapter.interactor.GetChapterByUrl
import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.chapter.model.ChapterUpdate
import tachiyomi.domain.chapter.repository.ChapterRepository import tachiyomi.domain.chapter.repository.ChapterRepository
@ -35,7 +35,7 @@ class EHentaiUpdateHelper(context: Context) {
GalleryEntry.Serializer(), GalleryEntry.Serializer(),
) )
private val getChapterByUrl: GetChapterByUrl by injectLazy() private val getChapterByUrl: GetChapterByUrl by injectLazy()
private val getChapterByMangaId: GetChapterByMangaId by injectLazy() private val getChaptersByMangaId: GetChaptersByMangaId by injectLazy()
private val getManga: GetManga by injectLazy() private val getManga: GetManga by injectLazy()
private val updateManga: UpdateManga by injectLazy() private val updateManga: UpdateManga by injectLazy()
private val setMangaCategories: SetMangaCategories by injectLazy() private val setMangaCategories: SetMangaCategories by injectLazy()
@ -64,7 +64,7 @@ class EHentaiUpdateHelper(context: Context) {
getManga.await(mangaId) getManga.await(mangaId)
} }
val chapterList = async(Dispatchers.IO) { val chapterList = async(Dispatchers.IO) {
getChapterByMangaId.await(mangaId) getChaptersByMangaId.await(mangaId)
} }
val history = async(Dispatchers.IO) { val history = async(Dispatchers.IO) {
getHistoryByMangaId.await(mangaId) getHistoryByMangaId.await(mangaId)
@ -115,7 +115,7 @@ class EHentaiUpdateHelper(context: Context) {
chapterRepository.updateAll(chapterUpdates) chapterRepository.updateAll(chapterUpdates)
chapterRepository.addAll(newChapters) chapterRepository.addAll(newChapters)
val (newHistory, deleteHistory) = getHistory(getChapterByMangaId.await(accepted.manga.id), chainsAsChapters, chainsAsHistory) val (newHistory, deleteHistory) = getHistory(getChaptersByMangaId.await(accepted.manga.id), chainsAsChapters, chainsAsHistory)
// Delete the duplicate history first // Delete the duplicate history first
deleteHistory.forEach { deleteHistory.forEach {

View File

@ -28,7 +28,7 @@ import kotlinx.coroutines.flow.toList
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import tachiyomi.domain.UnsortedPreferences import tachiyomi.domain.UnsortedPreferences
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_CHARGING import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_CHARGING
import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_ONLY_ON_WIFI import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_ONLY_ON_WIFI
@ -51,7 +51,7 @@ class EHentaiUpdateWorker(private val context: Context, workerParams: WorkerPara
private val logger: Logger = xLog() private val logger: Logger = xLog()
private val updateManga: UpdateManga by injectLazy() private val updateManga: UpdateManga by injectLazy()
private val syncChaptersWithSource: SyncChaptersWithSource by injectLazy() private val syncChaptersWithSource: SyncChaptersWithSource by injectLazy()
private val getChapterByMangaId: GetChapterByMangaId by injectLazy() private val getChaptersByMangaId: GetChaptersByMangaId by injectLazy()
private val getFlatMetadataById: GetFlatMetadataById by injectLazy() private val getFlatMetadataById: GetFlatMetadataById by injectLazy()
private val insertFlatMetadata: InsertFlatMetadata by injectLazy() private val insertFlatMetadata: InsertFlatMetadata by injectLazy()
private val getExhFavoriteMangaWithMetadata: GetExhFavoriteMangaWithMetadata by injectLazy() private val getExhFavoriteMangaWithMetadata: GetExhFavoriteMangaWithMetadata by injectLazy()
@ -92,7 +92,7 @@ class EHentaiUpdateWorker(private val context: Context, workerParams: WorkerPara
return@mapNotNull null return@mapNotNull null
} }
val chapter = getChapterByMangaId.await(manga.id).minByOrNull { val chapter = getChaptersByMangaId.await(manga.id).minByOrNull {
it.dateUpload it.dateUpload
} }
@ -206,7 +206,7 @@ class EHentaiUpdateWorker(private val context: Context, workerParams: WorkerPara
val newChapters = source.getChapterList(manga.toSManga()) val newChapters = source.getChapterList(manga.toSManga())
val new = syncChaptersWithSource.await(newChapters, manga, source) val new = syncChaptersWithSource.await(newChapters, manga, source)
return new to getChapterByMangaId.await(manga.id) return new to getChaptersByMangaId.await(manga.id)
} catch (t: Throwable) { } catch (t: Throwable) {
if (t is EHentai.GalleryNotFoundException) { if (t is EHentai.GalleryNotFoundException) {
val meta = getFlatMetadataById.await(manga.id)?.raise<EHentaiSearchMetadata>() val meta = getFlatMetadataById.await(manga.id)?.raise<EHentaiSearchMetadata>()

View File

@ -14,7 +14,7 @@ import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.launchIO
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.interactor.GetManga
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
@ -26,7 +26,7 @@ class PagePreviewScreenModel(
private val mangaId: Long, private val mangaId: Long,
private val getPagePreviews: GetPagePreviews = Injekt.get(), private val getPagePreviews: GetPagePreviews = Injekt.get(),
private val getManga: GetManga = Injekt.get(), private val getManga: GetManga = Injekt.get(),
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(),
private val sourceManager: SourceManager = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(),
) : StateScreenModel<PagePreviewState>(PagePreviewState.Loading) { ) : StateScreenModel<PagePreviewState>(PagePreviewState.Loading) {
@ -37,7 +37,7 @@ class PagePreviewScreenModel(
init { init {
screenModelScope.launchIO { screenModelScope.launchIO {
val manga = getManga.await(mangaId)!! val manga = getManga.await(mangaId)!!
val chapter = getChapterByMangaId.await(mangaId).minByOrNull { it.sourceOrder } val chapter = getChaptersByMangaId.await(mangaId).minByOrNull { it.sourceOrder }
if (chapter == null) { if (chapter == null) {
mutableState.update { mutableState.update {
PagePreviewState.Error(Exception("No chapters found")) PagePreviewState.Error(Exception("No chapters found"))

View File

@ -5,7 +5,7 @@ import tachiyomi.core.util.system.logcat
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.chapter.repository.ChapterRepository import tachiyomi.domain.chapter.repository.ChapterRepository
class GetChapterByMangaId( class GetChaptersByMangaId(
private val chapterRepository: ChapterRepository, private val chapterRepository: ChapterRepository,
) { ) {

View File

@ -11,7 +11,7 @@ import tachiyomi.domain.chapter.repository.ChapterRepository
import tachiyomi.domain.manga.interactor.GetMergedReferencesById import tachiyomi.domain.manga.interactor.GetMergedReferencesById
import tachiyomi.domain.manga.model.MergedMangaReference import tachiyomi.domain.manga.model.MergedMangaReference
class GetMergedChapterByMangaId( class GetMergedChaptersByMangaId(
private val chapterRepository: ChapterRepository, private val chapterRepository: ChapterRepository,
private val getMergedReferencesById: GetMergedReferencesById, private val getMergedReferencesById: GetMergedReferencesById,
) { ) {

View File

@ -18,6 +18,16 @@ data class Chapter(
val isRecognizedNumber: Boolean val isRecognizedNumber: Boolean
get() = chapterNumber >= 0f get() = chapterNumber >= 0f
fun copyFrom(other: Chapter): Chapter {
return copy(
name = other.name,
url = other.url,
dateUpload = other.dateUpload,
chapterNumber = other.chapterNumber,
scanlator = other.scanlator?.ifBlank { null },
)
}
companion object { companion object {
fun create() = Chapter( fun create() = Chapter(
id = -1, id = -1,

View File

@ -2,8 +2,8 @@ package tachiyomi.domain.history.interactor
import exh.source.MERGED_SOURCE_ID import exh.source.MERGED_SOURCE_ID
import exh.source.isEhBasedManga import exh.source.isEhBasedManga
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.interactor.GetMergedChapterByMangaId import tachiyomi.domain.chapter.interactor.GetMergedChaptersByMangaId
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.chapter.service.getChapterSort import tachiyomi.domain.chapter.service.getChapterSort
import tachiyomi.domain.history.repository.HistoryRepository import tachiyomi.domain.history.repository.HistoryRepository
@ -11,9 +11,9 @@ import tachiyomi.domain.manga.interactor.GetManga
import kotlin.math.max import kotlin.math.max
class GetNextChapters( class GetNextChapters(
private val getChapterByMangaId: GetChapterByMangaId, private val getChaptersByMangaId: GetChaptersByMangaId,
// SY --> // SY -->
private val getMergedChapterByMangaId: GetMergedChapterByMangaId, private val getMergedChaptersByMangaId: GetMergedChaptersByMangaId,
// SY <-- // SY <--
private val getManga: GetManga, private val getManga: GetManga,
private val historyRepository: HistoryRepository, private val historyRepository: HistoryRepository,
@ -29,7 +29,7 @@ class GetNextChapters(
// SY --> // SY -->
if (manga.source == MERGED_SOURCE_ID) { if (manga.source == MERGED_SOURCE_ID) {
val chapters = getMergedChapterByMangaId.await(mangaId) val chapters = getMergedChaptersByMangaId.await(mangaId)
.sortedWith(getChapterSort(manga, sortDescending = false)) .sortedWith(getChapterSort(manga, sortDescending = false))
return if (onlyUnread) { return if (onlyUnread) {
@ -39,7 +39,7 @@ class GetNextChapters(
} }
} }
if (manga.isEhBasedManga()) { if (manga.isEhBasedManga()) {
val chapters = getChapterByMangaId.await(mangaId) val chapters = getChaptersByMangaId.await(mangaId)
.sortedWith(getChapterSort(manga, sortDescending = false)) .sortedWith(getChapterSort(manga, sortDescending = false))
return if (onlyUnread) { return if (onlyUnread) {
@ -50,7 +50,7 @@ class GetNextChapters(
} }
// SY <-- // SY <--
val chapters = getChapterByMangaId.await(mangaId) val chapters = getChaptersByMangaId.await(mangaId)
.sortedWith(getChapterSort(manga, sortDescending = false)) .sortedWith(getChapterSort(manga, sortDescending = false))
return if (onlyUnread) { return if (onlyUnread) {

View File

@ -1,6 +1,6 @@
package tachiyomi.domain.manga.interactor package tachiyomi.domain.manga.interactor
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.manga.model.MangaUpdate import tachiyomi.domain.manga.model.MangaUpdate
@ -11,7 +11,7 @@ import java.time.temporal.ChronoUnit
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
class FetchInterval( class FetchInterval(
private val getChapterByMangaId: GetChapterByMangaId, private val getChaptersByMangaId: GetChaptersByMangaId,
) { ) {
suspend fun toMangaUpdateOrNull( suspend fun toMangaUpdateOrNull(
@ -24,7 +24,7 @@ class FetchInterval(
} else { } else {
window window
} }
val chapters = getChapterByMangaId.await(manga.id) val chapters = getChaptersByMangaId.await(manga.id)
val interval = manga.fetchInterval.takeIf { it < 0 } ?: calculateInterval( val interval = manga.fetchInterval.takeIf { it < 0 } ?: calculateInterval(
chapters, chapters,
dateTime.zone, dateTime.zone,