From ce5e10be955d8166f53de8118f8f12e76546b5ea Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 29 Oct 2023 11:43:06 -0400 Subject: [PATCH] Clean up chapter restoring logic a bit --- .../java/eu/kanade/domain/DomainModule.kt | 4 +- .../interactor/SyncChaptersWithSource.kt | 6 +-- .../eu/kanade/domain/chapter/model/Chapter.kt | 11 ----- .../SyncChapterProgressWithTrack.kt | 6 +-- .../tachiyomi/data/backup/BackupRestorer.kt | 40 ++++++++++++------- .../tachiyomi/data/track/BaseTracker.kt | 4 +- .../browse/migration/search/MigrateDialog.kt | 8 ++-- .../ui/library/LibraryScreenModel.kt | 4 +- .../tachiyomi/ui/reader/ReaderViewModel.kt | 6 +-- ...erByMangaId.kt => GetChaptersByMangaId.kt} | 2 +- .../tachiyomi/domain/chapter/model/Chapter.kt | 10 +++++ .../history/interactor/GetNextChapters.kt | 6 +-- .../domain/manga/interactor/FetchInterval.kt | 6 +-- 13 files changed, 61 insertions(+), 52 deletions(-) rename domain/src/main/java/tachiyomi/domain/chapter/interactor/{GetChapterByMangaId.kt => GetChaptersByMangaId.kt} (94%) diff --git a/app/src/main/java/eu/kanade/domain/DomainModule.kt b/app/src/main/java/eu/kanade/domain/DomainModule.kt index 8559cd923e..9967e000f3 100644 --- a/app/src/main/java/eu/kanade/domain/DomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/DomainModule.kt @@ -40,8 +40,8 @@ import tachiyomi.domain.category.interactor.SetSortModeForCategory import tachiyomi.domain.category.interactor.UpdateCategory import tachiyomi.domain.category.repository.CategoryRepository import tachiyomi.domain.chapter.interactor.GetChapter -import tachiyomi.domain.chapter.interactor.GetChapterByMangaId import tachiyomi.domain.chapter.interactor.GetChapterByUrlAndMangaId +import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.interactor.SetMangaDefaultChapterFlags import tachiyomi.domain.chapter.interactor.ShouldUpdateDbChapter import tachiyomi.domain.chapter.interactor.UpdateChapter @@ -128,7 +128,7 @@ class DomainModule : InjektModule { addSingletonFactory { ChapterRepositoryImpl(get()) } addFactory { GetChapter(get()) } - addFactory { GetChapterByMangaId(get()) } + addFactory { GetChaptersByMangaId(get()) } addFactory { GetChapterByUrlAndMangaId(get()) } addFactory { UpdateChapter(get()) } addFactory { SetReadStatus(get(), get(), get(), get()) } diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt index 6205ea365d..d233406f0e 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt @@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.online.HttpSource 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.UpdateChapter import tachiyomi.domain.chapter.model.Chapter @@ -32,7 +32,7 @@ class SyncChaptersWithSource( private val shouldUpdateDbChapter: ShouldUpdateDbChapter, private val updateManga: UpdateManga, private val updateChapter: UpdateChapter, - private val getChapterByMangaId: GetChapterByMangaId, + private val getChaptersByMangaId: GetChaptersByMangaId, ) { /** @@ -66,7 +66,7 @@ class SyncChaptersWithSource( } // Chapters from db. - val dbChapters = getChapterByMangaId.await(manga.id) + val dbChapters = getChaptersByMangaId.await(manga.id) // Chapters from the source not in db. val toAdd = mutableListOf() diff --git a/app/src/main/java/eu/kanade/domain/chapter/model/Chapter.kt b/app/src/main/java/eu/kanade/domain/chapter/model/Chapter.kt index af99f0e631..a852e1ae10 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/model/Chapter.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/model/Chapter.kt @@ -2,7 +2,6 @@ package eu.kanade.domain.chapter.model import eu.kanade.tachiyomi.data.database.models.ChapterImpl import eu.kanade.tachiyomi.source.model.SChapter -import tachiyomi.data.Chapters import tachiyomi.domain.chapter.model.Chapter 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 { it.id = id it.manga_id = mangaId diff --git a/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt b/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt index dcb95ff26f..6fab0792a0 100644 --- a/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt +++ b/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt @@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.data.track.EnhancedTracker import eu.kanade.tachiyomi.data.track.Tracker import logcat.LogPriority 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.model.toChapterUpdate import tachiyomi.domain.track.interactor.InsertTrack @@ -14,7 +14,7 @@ import tachiyomi.domain.track.model.Track class SyncChapterProgressWithTrack( private val updateChapter: UpdateChapter, private val insertTrack: InsertTrack, - private val getChapterByMangaId: GetChapterByMangaId, + private val getChaptersByMangaId: GetChaptersByMangaId, ) { suspend fun await( @@ -26,7 +26,7 @@ class SyncChapterProgressWithTrack( return } - val sortedChapters = getChapterByMangaId.await(mangaId) + val sortedChapters = getChaptersByMangaId.await(mangaId) .sortedBy { it.chapterNumber } .filter { it.isRecognizedNumber } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt index ec34ce08a6..753c3ef8e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt @@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.data.backup import android.content.Context import android.net.Uri -import eu.kanade.domain.chapter.model.copyFrom import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.backup.models.BackupCategory @@ -31,6 +30,7 @@ import tachiyomi.data.Manga_sync import tachiyomi.data.Mangas import tachiyomi.data.UpdateStrategyColumnAdapter import tachiyomi.domain.category.interactor.GetCategories +import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.history.model.HistoryUpdate import tachiyomi.domain.library.service.LibraryPreferences @@ -54,6 +54,7 @@ class BackupRestorer( private val handler: DatabaseHandler = Injekt.get() private val updateManga: UpdateManga = Injekt.get() private val getCategories: GetCategories = Injekt.get() + private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get() private val fetchInterval: FetchInterval = Injekt.get() private val preferenceStore: PreferenceStore = Injekt.get() @@ -285,30 +286,39 @@ class BackupRestorer( } private suspend fun restoreChapters(manga: Manga, chapters: List) { - val dbChapters = handler.awaitList { chaptersQueries.getChaptersByMangaId(manga.id) } + val dbChaptersByUrl = getChaptersByMangaId.await(manga.id) + .associateBy { it.url } val processed = chapters.map { chapter -> var updatedChapter = chapter - val dbChapter = dbChapters.find { it.url == updatedChapter.url } + + val dbChapter = dbChaptersByUrl[updatedChapter.url] if (dbChapter != null) { - updatedChapter = updatedChapter.copy(id = dbChapter._id) - updatedChapter = updatedChapter.copyFrom(dbChapter) + updatedChapter = updatedChapter + .copyFrom(dbChapter) + .copy( + id = dbChapter.id, + mangaId = manga.id, + bookmark = updatedChapter.bookmark || dbChapter.bookmark, + ) if (dbChapter.read && !updatedChapter.read) { - updatedChapter = updatedChapter.copy(read = true, lastPageRead = dbChapter.last_page_read) - } else if (updatedChapter.lastPageRead == 0L && dbChapter.last_page_read != 0L) { - updatedChapter = updatedChapter.copy(lastPageRead = dbChapter.last_page_read) - } - if (!updatedChapter.bookmark && dbChapter.bookmark) { - updatedChapter = updatedChapter.copy(bookmark = true) + updatedChapter = updatedChapter.copy( + read = true, + lastPageRead = dbChapter.lastPageRead, + ) + } else if (updatedChapter.lastPageRead == 0L && dbChapter.lastPageRead != 0L) { + updatedChapter = updatedChapter.copy( + lastPageRead = dbChapter.lastPageRead, + ) } } - updatedChapter.copy(mangaId = manga.id) + updatedChapter } - val newChapters = processed.groupBy { it.id > 0 } - newChapters[true]?.let { updateKnownChapters(it) } - newChapters[false]?.let { insertChapters(it) } + val (existingChapters, newChapters) = processed.partition { it.id > 0 } + updateKnownChapters(existingChapters) + insertChapters(newChapters) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt index 8b152d6cb5..94b81783d5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt @@ -15,7 +15,7 @@ import okhttp3.OkHttpClient import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.lang.withUIContext 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.track.interactor.InsertTrack import uy.kohesive.injekt.Injekt @@ -71,7 +71,7 @@ abstract class BaseTracker( item.manga_id = mangaId try { withIOContext { - val allChapters = Injekt.get().await(mangaId) + val allChapters = Injekt.get().await(mangaId) val hasReadChapters = allChapters.any { it.read } bind(item, hasReadChapters) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt index 26bad6a5f0..1eddff26d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt @@ -41,7 +41,7 @@ import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.withUIContext import tachiyomi.domain.category.interactor.GetCategories 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.model.toChapterUpdate import tachiyomi.domain.manga.model.Manga @@ -150,7 +150,7 @@ internal class MigrateDialogScreenModel( private val sourceManager: SourceManager = Injekt.get(), private val downloadManager: DownloadManager = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), - private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), + private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(), private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(), private val updateChapter: UpdateChapter = Injekt.get(), private val getCategories: GetCategories = Injekt.get(), @@ -222,8 +222,8 @@ internal class MigrateDialogScreenModel( // Update chapters read, bookmark and dateFetch if (migrateChapters) { - val prevMangaChapters = getChapterByMangaId.await(oldManga.id) - val mangaChapters = getChapterByMangaId.await(newManga.id) + val prevMangaChapters = getChaptersByMangaId.await(oldManga.id) + val mangaChapters = getChaptersByMangaId.await(newManga.id) val maxChapterRead = prevMangaChapters .filter { it.read } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index 6d16364c33..af0f5c81af 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -47,7 +47,7 @@ import tachiyomi.core.util.lang.withIOContext import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.category.model.Category -import tachiyomi.domain.chapter.interactor.GetChapterByMangaId +import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.history.interactor.GetNextChapters import tachiyomi.domain.library.model.LibraryDisplayMode @@ -78,7 +78,7 @@ class LibraryScreenModel( private val getCategories: GetCategories = Injekt.get(), private val getTracksPerManga: GetTracksPerManga = 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 updateManga: UpdateManga = Injekt.get(), private val setMangaCategories: SetMangaCategories = Injekt.get(), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index 1c9e4578d0..c0a252b357 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -60,7 +60,7 @@ import tachiyomi.core.util.lang.launchNonCancellable import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.lang.withUIContext 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.model.ChapterUpdate import tachiyomi.domain.chapter.service.getChapterSort @@ -92,7 +92,7 @@ class ReaderViewModel @JvmOverloads constructor( private val trackPreferences: TrackPreferences = Injekt.get(), private val trackChapter: TrackChapter = 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 upsertHistory: UpsertHistory = Injekt.get(), private val updateChapter: UpdateChapter = Injekt.get(), @@ -147,7 +147,7 @@ class ReaderViewModel @JvmOverloads constructor( */ private val chapterList by lazy { val manga = manga!! - val chapters = runBlocking { getChapterByMangaId.await(manga.id) } + val chapters = runBlocking { getChaptersByMangaId.await(manga.id) } val selectedChapter = chapters.find { it.id == chapterId } ?: error("Requested chapter of id $chapterId not found in chapter list") diff --git a/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChapterByMangaId.kt b/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChaptersByMangaId.kt similarity index 94% rename from domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChapterByMangaId.kt rename to domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChaptersByMangaId.kt index fb73508924..6dcc0d32bb 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChapterByMangaId.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChaptersByMangaId.kt @@ -5,7 +5,7 @@ import tachiyomi.core.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.repository.ChapterRepository -class GetChapterByMangaId( +class GetChaptersByMangaId( private val chapterRepository: ChapterRepository, ) { diff --git a/domain/src/main/java/tachiyomi/domain/chapter/model/Chapter.kt b/domain/src/main/java/tachiyomi/domain/chapter/model/Chapter.kt index 0029d67ead..3a4a8c4a45 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/model/Chapter.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/model/Chapter.kt @@ -18,6 +18,16 @@ data class Chapter( val isRecognizedNumber: Boolean 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 { fun create() = Chapter( id = -1, diff --git a/domain/src/main/java/tachiyomi/domain/history/interactor/GetNextChapters.kt b/domain/src/main/java/tachiyomi/domain/history/interactor/GetNextChapters.kt index 6e9526158c..2cbda1bdf0 100644 --- a/domain/src/main/java/tachiyomi/domain/history/interactor/GetNextChapters.kt +++ b/domain/src/main/java/tachiyomi/domain/history/interactor/GetNextChapters.kt @@ -1,6 +1,6 @@ package tachiyomi.domain.history.interactor -import tachiyomi.domain.chapter.interactor.GetChapterByMangaId +import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.service.getChapterSort import tachiyomi.domain.history.repository.HistoryRepository @@ -8,7 +8,7 @@ import tachiyomi.domain.manga.interactor.GetManga import kotlin.math.max class GetNextChapters( - private val getChapterByMangaId: GetChapterByMangaId, + private val getChaptersByMangaId: GetChaptersByMangaId, private val getManga: GetManga, private val historyRepository: HistoryRepository, ) { @@ -20,7 +20,7 @@ class GetNextChapters( suspend fun await(mangaId: Long, onlyUnread: Boolean = true): List { val manga = getManga.await(mangaId) ?: return emptyList() - val chapters = getChapterByMangaId.await(mangaId) + val chapters = getChaptersByMangaId.await(mangaId) .sortedWith(getChapterSort(manga, sortDescending = false)) return if (onlyUnread) { diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt index 740c0a1506..308ed8bf6f 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt @@ -1,6 +1,6 @@ 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.manga.model.Manga import tachiyomi.domain.manga.model.MangaUpdate @@ -11,7 +11,7 @@ import java.time.temporal.ChronoUnit import kotlin.math.absoluteValue class FetchInterval( - private val getChapterByMangaId: GetChapterByMangaId, + private val getChaptersByMangaId: GetChaptersByMangaId, ) { suspend fun toMangaUpdateOrNull( @@ -24,7 +24,7 @@ class FetchInterval( } else { window } - val chapters = getChapterByMangaId.await(manga.id) + val chapters = getChaptersByMangaId.await(manga.id) val interval = manga.fetchInterval.takeIf { it < 0 } ?: calculateInterval( chapters, dateTime.zone,