|
|
|
@ -31,7 +31,6 @@ 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
|
|
|
|
|
import tachiyomi.domain.manga.interactor.FetchInterval
|
|
|
|
|
import tachiyomi.domain.manga.interactor.GetMangaByUrlAndSourceId
|
|
|
|
@ -291,7 +290,7 @@ class BackupRestorer(
|
|
|
|
|
|
|
|
|
|
val (existingChapters, newChapters) = backupChapters
|
|
|
|
|
.mapNotNull {
|
|
|
|
|
val chapter = it.toChapterImpl()
|
|
|
|
|
val chapter = it.toChapterImpl().copy(mangaId = manga.id)
|
|
|
|
|
|
|
|
|
|
val dbChapter = dbChaptersByUrl[chapter.url]
|
|
|
|
|
?: // New chapter
|
|
|
|
@ -307,7 +306,6 @@ class BackupRestorer(
|
|
|
|
|
.copyFrom(dbChapter)
|
|
|
|
|
.copy(
|
|
|
|
|
id = dbChapter.id,
|
|
|
|
|
mangaId = manga.id,
|
|
|
|
|
bookmark = chapter.bookmark || dbChapter.bookmark,
|
|
|
|
|
)
|
|
|
|
|
if (dbChapter.read && !updatedChapter.read) {
|
|
|
|
@ -455,44 +453,39 @@ class BackupRestorer(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private suspend fun restoreHistory(backupHistory: List<BackupHistory>) {
|
|
|
|
|
val toUpdate = mutableListOf<HistoryUpdate>()
|
|
|
|
|
for ((url, lastRead, readDuration) in backupHistory) {
|
|
|
|
|
var dbHistory = handler.awaitOneOrNull { historyQueries.getHistoryByChapterUrl(url) }
|
|
|
|
|
// Check if history already in database and update
|
|
|
|
|
if (dbHistory != null) {
|
|
|
|
|
dbHistory = dbHistory.copy(
|
|
|
|
|
last_read = Date(max(lastRead, dbHistory.last_read?.time ?: 0L)),
|
|
|
|
|
time_read = max(readDuration, dbHistory.time_read) - dbHistory.time_read,
|
|
|
|
|
)
|
|
|
|
|
toUpdate.add(
|
|
|
|
|
HistoryUpdate(
|
|
|
|
|
chapterId = dbHistory.chapter_id,
|
|
|
|
|
readAt = dbHistory.last_read!!,
|
|
|
|
|
sessionReadDuration = dbHistory.time_read,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
// If not in database, create
|
|
|
|
|
handler
|
|
|
|
|
.awaitOneOrNull { chaptersQueries.getChapterByUrl(url) }
|
|
|
|
|
?.let {
|
|
|
|
|
toUpdate.add(
|
|
|
|
|
HistoryUpdate(
|
|
|
|
|
chapterId = it._id,
|
|
|
|
|
readAt = Date(lastRead),
|
|
|
|
|
sessionReadDuration = readDuration,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
val toUpdate = backupHistory.mapNotNull { history ->
|
|
|
|
|
val dbHistory = handler.awaitOneOrNull { historyQueries.getHistoryByChapterUrl(history.url) }
|
|
|
|
|
val item = history.getHistoryImpl()
|
|
|
|
|
|
|
|
|
|
if (dbHistory == null) {
|
|
|
|
|
val chapter = handler.awaitOneOrNull { chaptersQueries.getChapterByUrl(history.url) }
|
|
|
|
|
return@mapNotNull if (chapter == null) {
|
|
|
|
|
// Chapter doesn't exist; skip
|
|
|
|
|
null
|
|
|
|
|
} else {
|
|
|
|
|
// New history entry
|
|
|
|
|
item.copy(chapterId = chapter._id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update history entry
|
|
|
|
|
item.copy(
|
|
|
|
|
id = dbHistory._id,
|
|
|
|
|
chapterId = dbHistory.chapter_id,
|
|
|
|
|
readAt = max(item.readAt?.time ?: 0L, dbHistory.last_read?.time ?: 0L)
|
|
|
|
|
.takeIf { it > 0L }
|
|
|
|
|
?.let { Date(it) },
|
|
|
|
|
readDuration = max(item.readDuration, dbHistory.time_read),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (toUpdate.isNotEmpty()) {
|
|
|
|
|
handler.await(true) {
|
|
|
|
|
toUpdate.forEach { payload ->
|
|
|
|
|
toUpdate.forEach {
|
|
|
|
|
historyQueries.upsert(
|
|
|
|
|
payload.chapterId,
|
|
|
|
|
payload.readAt,
|
|
|
|
|
payload.sessionReadDuration,
|
|
|
|
|
it.chapterId,
|
|
|
|
|
it.readAt,
|
|
|
|
|
it.readDuration,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|