From 5e531ba469eaf75dab2f7b9c284126b089a8301c Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Wed, 21 Oct 2020 23:01:57 -0400 Subject: [PATCH] Put manga metadata into backups --- .../data/backup/full/FullBackupManager.kt | 25 +++++++++++++ .../data/backup/full/FullBackupRestore.kt | 20 +++++++---- .../backup/full/models/BackupFlatMetadata.kt | 35 ++++++++++++++++++ .../data/backup/full/models/BackupManga.kt | 3 +- .../models/metadata/BackupSearchMetadata.kt | 36 +++++++++++++++++++ .../full/models/metadata/BackupSearchTag.kt | 34 ++++++++++++++++++ .../full/models/metadata/BackupSearchTitle.kt | 31 ++++++++++++++++ 7 files changed, 177 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupFlatMetadata.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchMetadata.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchTag.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchTitle.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt index 333071fd3..c80ad87ad 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt @@ -22,6 +22,7 @@ import eu.kanade.tachiyomi.data.backup.full.models.BackupSavedSearch import eu.kanade.tachiyomi.data.backup.full.models.BackupSerializer import eu.kanade.tachiyomi.data.backup.full.models.BackupSource import eu.kanade.tachiyomi.data.backup.full.models.BackupTracking +import eu.kanade.tachiyomi.data.backup.full.models.BackupFlatMetadata import eu.kanade.tachiyomi.data.backup.models.AbstractBackupManager import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.History @@ -29,12 +30,16 @@ import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaCategory import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.online.MetadataSource import eu.kanade.tachiyomi.source.online.all.EHentai import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource import exh.MERGED_SOURCE_ID import exh.eh.EHentaiThrottleManager +import exh.metadata.metadata.base.getFlatMetadataForManga +import exh.metadata.metadata.base.insertFlatMetadata import exh.savedsearches.JsonSavedSearch +import exh.source.EnhancedHttpSource.Companion.getMainSource import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString @@ -182,6 +187,15 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { .map { BackupMergedMangaReference.copyFrom(it) } } } + + val source = sourceManager.get(manga.source)?.getMainSource() + if (source is MetadataSource<*, *>) { + manga.id?.let { mangaId -> + databaseHelper.getFlatMetadataForManga(mangaId).executeAsBlocking()?.let { flatMetadata -> + mangaObject.flatMetadata = BackupFlatMetadata.copyFrom(flatMetadata) + } + } + } // SY <-- // Check if user wants chapter information in backup @@ -556,5 +570,16 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { } } } + + internal fun restoreFlatMetadata(manga: Manga, backupFlatMetadata: BackupFlatMetadata) { + manga.id?.let { mangaId -> + databaseHelper.getFlatMetadataForManga(mangaId).executeAsBlocking().let { + if (it == null) { + val flatMetadata = backupFlatMetadata.getFlatMetadata(mangaId) + databaseHelper.insertFlatMetadata(flatMetadata).await() + } + } + } + } // SY <-- } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupRestore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupRestore.kt index 3bf31ba49..bdf87ee71 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupRestore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupRestore.kt @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.backup.full.models.BackupManga import eu.kanade.tachiyomi.data.backup.full.models.BackupMergedMangaReference import eu.kanade.tachiyomi.data.backup.full.models.BackupSavedSearch import eu.kanade.tachiyomi.data.backup.full.models.BackupSerializer +import eu.kanade.tachiyomi.data.backup.full.models.BackupFlatMetadata import eu.kanade.tachiyomi.data.backup.models.AbstractBackupRestore import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga @@ -109,6 +110,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val val tracks = backupManga.getTrackingImpl() // SY --> val mergedMangaReferences = backupManga.mergedMangaReferences + val flatMetadata = backupManga.flatMetadata // SY <-- // SY --> @@ -118,7 +120,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val try { val source = fullBackupManager.sourceManager.get(manga.source) if (source != null || !online) { - restoreMangaData(manga, source, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, online) + restoreMangaData(manga, source, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata, online) } else { val sourceName = sourceMapping[manga.source] ?: manga.source.toString() errors.add(Date() to "${manga.title} - ${context.getString(R.string.source_not_found_name, sourceName)}") @@ -150,6 +152,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val tracks: List, backupCategories: List, mergedMangaReferences: List, + flatMetadata: BackupFlatMetadata?, online: Boolean ) { val dbManga = fullBackupManager.getMangaFromDatabase(manga) @@ -157,12 +160,12 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val db.inTransaction { if (dbManga == null) { // Manga not in database - restoreMangaFetch(source, manga, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, online) + restoreMangaFetch(source, manga, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata, online) } else { // Manga in database // Copy information from manga already in database fullBackupManager.restoreMangaNoFetch(manga, dbManga) // Fetch rest of manga information - restoreMangaNoFetch(source, manga, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, online) + restoreMangaNoFetch(source, manga, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata, online) } } } @@ -183,6 +186,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val tracks: List, backupCategories: List, mergedMangaReferences: List, + flatMetadata: BackupFlatMetadata?, online: Boolean ) { fullBackupManager.restoreMangaFetchObservable(source, manga, online) @@ -207,7 +211,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val } } .doOnNext { - restoreExtraForManga(it, categories, history, tracks, backupCategories, mergedMangaReferences) + restoreExtraForManga(it, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata) } .flatMap { trackingFetchObservable(it, tracks) @@ -224,6 +228,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val tracks: List, backupCategories: List, mergedMangaReferences: List, + flatMetadata: BackupFlatMetadata?, online: Boolean ) { Observable.just(backupManga) @@ -241,7 +246,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val } } .doOnNext { - restoreExtraForManga(it, categories, history, tracks, backupCategories, mergedMangaReferences) + restoreExtraForManga(it, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata) } .flatMap { manga -> trackingFetchObservable(manga, tracks) @@ -249,7 +254,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val .subscribe() } - private fun restoreExtraForManga(manga: Manga, categories: List, history: List, tracks: List, backupCategories: List, mergedMangaReferences: List) { + private fun restoreExtraForManga(manga: Manga, categories: List, history: List, tracks: List, backupCategories: List, mergedMangaReferences: List, flatMetadata: BackupFlatMetadata?) { // Restore categories fullBackupManager.restoreCategoriesForManga(manga, categories, backupCategories) @@ -262,6 +267,9 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val // SY --> // Restore merged manga references if its a merged manga fullBackupManager.restoreMergedMangaReferencesForManga(manga, mergedMangaReferences) + + // Restore flat metadata for metadata sources + flatMetadata?.let { fullBackupManager.restoreFlatMetadata(manga, it) } // SY <-- } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupFlatMetadata.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupFlatMetadata.kt new file mode 100644 index 000000000..659dd3b38 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupFlatMetadata.kt @@ -0,0 +1,35 @@ +package eu.kanade.tachiyomi.data.backup.full.models + +import eu.kanade.tachiyomi.data.backup.full.models.metadata.BackupSearchMetadata +import eu.kanade.tachiyomi.data.backup.full.models.metadata.BackupSearchTag +import eu.kanade.tachiyomi.data.backup.full.models.metadata.BackupSearchTitle +import exh.metadata.metadata.base.FlatMetadata +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@ExperimentalSerializationApi +@Serializable +data class BackupFlatMetadata( + @ProtoNumber(1) var searchMetadata: BackupSearchMetadata, + @ProtoNumber(2) var searchTags: List = emptyList(), + @ProtoNumber(3) var searchTitles: List = emptyList() +) { + fun getFlatMetadata(mangaId: Long): FlatMetadata { + return FlatMetadata( + metadata = searchMetadata.getSearchMetadata(mangaId), + tags = searchTags.map { it.getSearchTag(mangaId) }, + titles = searchTitles.map { it.getSearchTitle(mangaId) } + ) + } + + companion object { + fun copyFrom(flatMetadata: FlatMetadata): BackupFlatMetadata { + return BackupFlatMetadata( + searchMetadata = BackupSearchMetadata.copyFrom(flatMetadata.metadata), + searchTags = flatMetadata.tags.map { BackupSearchTag.copyFrom(it) }, + searchTitles = flatMetadata.titles.map { BackupSearchTitle.copyFrom(it) } + ) + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt index 72ee6485f..cbfe20689 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt @@ -37,7 +37,8 @@ data class BackupManga( @ProtoNumber(101) var chapterFlags: Int = 0, @ProtoNumber(102) var history: List = emptyList(), // SY specific values - @ProtoNumber(600) var mergedMangaReferences: List = emptyList() + @ProtoNumber(600) var mergedMangaReferences: List = emptyList(), + @ProtoNumber(601) var flatMetadata: BackupFlatMetadata? = null ) { fun getMangaImpl(): MangaImpl { return MangaImpl().apply { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchMetadata.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchMetadata.kt new file mode 100644 index 000000000..851ffd552 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchMetadata.kt @@ -0,0 +1,36 @@ +package eu.kanade.tachiyomi.data.backup.full.models.metadata + +import exh.metadata.sql.models.SearchMetadata +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@ExperimentalSerializationApi +@Serializable +data class BackupSearchMetadata( + @ProtoNumber(1) var uploader: String? = null, + @ProtoNumber(2) var extra: String, + @ProtoNumber(3) var indexedExtra: String? = null, + @ProtoNumber(4) var extraVersion: Int +) { + fun getSearchMetadata(mangaId: Long): SearchMetadata { + return SearchMetadata( + mangaId = mangaId, + uploader = uploader, + extra = extra, + indexedExtra = indexedExtra, + extraVersion = extraVersion + ) + } + + companion object { + fun copyFrom(searchMetadata: SearchMetadata): BackupSearchMetadata { + return BackupSearchMetadata( + uploader = searchMetadata.uploader, + extra = searchMetadata.extra, + indexedExtra = searchMetadata.indexedExtra, + extraVersion = searchMetadata.extraVersion + ) + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchTag.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchTag.kt new file mode 100644 index 000000000..16c1eab66 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchTag.kt @@ -0,0 +1,34 @@ +package eu.kanade.tachiyomi.data.backup.full.models.metadata + +import exh.metadata.sql.models.SearchTag +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@ExperimentalSerializationApi +@Serializable +data class BackupSearchTag( + @ProtoNumber(1) var namespace: String? = null, + @ProtoNumber(2) var name: String, + @ProtoNumber(3) var type: Int +) { + fun getSearchTag(mangaId: Long): SearchTag { + return SearchTag( + id = null, + mangaId = mangaId, + namespace = namespace, + name = name, + type = type + ) + } + + companion object { + fun copyFrom(searchTag: SearchTag): BackupSearchTag { + return BackupSearchTag( + namespace = searchTag.namespace, + name = searchTag.name, + type = searchTag.type + ) + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchTitle.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchTitle.kt new file mode 100644 index 000000000..2b8cfd3c0 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/metadata/BackupSearchTitle.kt @@ -0,0 +1,31 @@ +package eu.kanade.tachiyomi.data.backup.full.models.metadata + +import exh.metadata.sql.models.SearchTitle +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@ExperimentalSerializationApi +@Serializable +data class BackupSearchTitle( + @ProtoNumber(1) var title: String, + @ProtoNumber(2) var type: Int +) { + fun getSearchTitle(mangaId: Long): SearchTitle { + return SearchTitle( + id = null, + mangaId = mangaId, + title = title, + type = type + ) + } + + companion object { + fun copyFrom(searchTitle: SearchTitle): BackupSearchTitle { + return BackupSearchTitle( + title = searchTitle.title, + type = searchTitle.type + ) + } + } +}