From dc760c05961a09dae599d5b9a99548ed81cc544d Mon Sep 17 00:00:00 2001 From: Jays2Kings Date: Fri, 26 Mar 2021 01:49:39 -0400 Subject: [PATCH] Backing up custom data for manga Using 800s from J2k in BackupManga for this(except for status) (cherry picked from commit c21b91bc026213993a67089ef4bc76c68ade4445) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupRestore.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt # app/src/main/java/eu/kanade/tachiyomi/data/library/CustomMangaManager.kt # app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt # app/src/main/res/values/strings.xml --- .../data/backup/AbstractBackupManager.kt | 5 ++ .../data/backup/AbstractBackupRestore.kt | 5 ++ .../data/backup/BackupCreateService.kt | 7 ++- .../data/backup/full/FullBackupManager.kt | 4 +- .../data/backup/full/FullBackupRestore.kt | 45 ++++++++++--- .../data/backup/full/models/BackupManga.kt | 63 ++++++++++++++++--- .../data/library/CustomMangaManager.kt | 2 +- .../ui/setting/SettingsBackupController.kt | 10 ++- app/src/main/res/values/strings_sy.xml | 3 + 9 files changed, 120 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt index 2c8c048bb..dc3a21a4f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt @@ -6,6 +6,7 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.toMangaInfo +import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.source.Source @@ -23,6 +24,10 @@ abstract class AbstractBackupManager(protected val context: Context) { internal val trackManager: TrackManager by injectLazy() protected val preferences: PreferencesHelper by injectLazy() + // SY --> + protected val customMangaManager: CustomMangaManager by injectLazy() + // SY <-- + abstract fun createBackup(uri: Uri, flags: Int, isJob: Boolean): String? /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt index 6a5ac9ad2..c13b81bb0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt @@ -7,6 +7,7 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Track +import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.util.chapter.NoChaptersException @@ -24,6 +25,10 @@ abstract class AbstractBackupRestore(protected val co protected val db: DatabaseHelper by injectLazy() protected val trackManager: TrackManager by injectLazy() + // SY --> + protected val customMangaManager: CustomMangaManager by injectLazy() + // SY <-- + var job: Job? = null protected lateinit var backupManager: T diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt index 8d87f40b3..3e5d1e880 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt @@ -30,7 +30,12 @@ class BackupCreateService : Service() { internal const val BACKUP_HISTORY_MASK = 0x4 internal const val BACKUP_TRACK = 0x8 internal const val BACKUP_TRACK_MASK = 0x8 - internal const val BACKUP_ALL = 0xF + + // SY --> + internal const val BACKUP_CUSTOM_INFO = 0x10 + internal const val BACKUP_CUSTOM_INFO_MASK = 0x10 + internal const val BACKUP_ALL = 0x1F + // SY <-- /** * Returns the status of the service. 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 904c91c8c..3196639a8 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 @@ -8,6 +8,8 @@ import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CATE import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CATEGORY_MASK import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CHAPTER import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CHAPTER_MASK +import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CUSTOM_INFO +import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CUSTOM_INFO_MASK import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_HISTORY import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_HISTORY_MASK import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_TRACK @@ -161,7 +163,7 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { */ private fun backupMangaObject(manga: Manga, options: Int): BackupManga { // Entry for this manga - val mangaObject = BackupManga.copyFrom(manga) + val mangaObject = BackupManga.copyFrom(manga /* SY --> */, if (options and BACKUP_CUSTOM_INFO_MASK == BACKUP_CUSTOM_INFO) customMangaManager else null /* SY <-- */) // SY --> if (manga.source == MERGED_SOURCE_ID) { 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 a73844054..19580ad8d 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 @@ -15,6 +15,7 @@ import eu.kanade.tachiyomi.data.backup.full.models.BackupSerializer import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Track +import eu.kanade.tachiyomi.data.library.CustomMangaManager import exh.EXHMigrations import exh.source.MERGED_SOURCE_ID import okio.buffer @@ -90,6 +91,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier) : AbstractBa // SY --> val mergedMangaReferences = backupManga.mergedMangaReferences val flatMetadata = backupManga.flatMetadata + val customManga = backupManga.getCustomMangaInfo() // SY <-- // SY --> @@ -97,7 +99,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier) : AbstractBa // SY <-- try { - restoreMangaData(manga, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata) + restoreMangaData(manga, chapters, categories, history, tracks, backupCategories/* SY --> */, mergedMangaReferences, flatMetadata, customManga/* SY <-- */) } catch (e: Exception) { val sourceName = sourceMapping[manga.source] ?: manga.source.toString() errors.add(Date() to "${manga.title} [$sourceName]: ${e.message}") @@ -123,20 +125,23 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier) : AbstractBa history: List, tracks: List, backupCategories: List, + // SY --> mergedMangaReferences: List, - flatMetadata: BackupFlatMetadata? + flatMetadata: BackupFlatMetadata?, + customManga: CustomMangaManager.MangaJson?, + // SY --> ) { db.inTransaction { val dbManga = backupManager.getMangaFromDatabase(manga) if (dbManga == null) { // Manga not in database - restoreMangaFetch(manga, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata) + restoreMangaFetch(manga, chapters, categories, history, tracks, backupCategories/* SY --> */, mergedMangaReferences, flatMetadata, customManga/* SY <-- */) } else { // Manga in database // Copy information from manga already in database backupManager.restoreMangaNoFetch(manga, dbManga) // Fetch rest of manga information - restoreMangaNoFetch(manga, chapters, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata) + restoreMangaNoFetch(manga, chapters, categories, history, tracks, backupCategories/* SY --> */, mergedMangaReferences, flatMetadata, customManga/* SY <-- */) } } } @@ -155,16 +160,18 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier) : AbstractBa history: List, tracks: List, backupCategories: List, + // SY --> mergedMangaReferences: List, - flatMetadata: BackupFlatMetadata? + flatMetadata: BackupFlatMetadata?, + customManga: CustomMangaManager.MangaJson?, + // SY <-- ) { try { val fetchedManga = backupManager.restoreManga(manga) fetchedManga.id ?: return - backupManager.restoreChaptersForManga(fetchedManga, chapters) - restoreExtraForManga(fetchedManga, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata) + restoreExtraForManga(fetchedManga, categories, history, tracks, backupCategories /* SY --> */, mergedMangaReferences, flatMetadata, customManga/* SY <-- */) } catch (e: Exception) { errors.add(Date() to "${manga.title} - ${e.message}") } @@ -177,15 +184,29 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier) : AbstractBa history: List, tracks: List, backupCategories: List, + // SY --> mergedMangaReferences: List, - flatMetadata: BackupFlatMetadata? + flatMetadata: BackupFlatMetadata?, + customManga: CustomMangaManager.MangaJson?, + // SY <-- ) { backupManager.restoreChaptersForManga(backupManga, chapters) - restoreExtraForManga(backupManga, categories, history, tracks, backupCategories, mergedMangaReferences, flatMetadata) + restoreExtraForManga(backupManga, categories, history, tracks, backupCategories/* SY --> */, mergedMangaReferences, flatMetadata, customManga/* SY <-- */) } - private fun restoreExtraForManga(manga: Manga, categories: List, history: List, tracks: List, backupCategories: List, mergedMangaReferences: List, flatMetadata: BackupFlatMetadata?) { + private fun restoreExtraForManga( + manga: Manga, + categories: List, + history: List, + tracks: List, + backupCategories: List, + // SY --> + mergedMangaReferences: List, + flatMetadata: BackupFlatMetadata?, + customManga: CustomMangaManager.MangaJson?, + // SY <-- + ) { // Restore categories backupManager.restoreCategoriesForManga(manga, categories, backupCategories) @@ -201,6 +222,10 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier) : AbstractBa // Restore flat metadata for metadata sources flatMetadata?.let { backupManager.restoreFlatMetadata(manga, it) } + + // Restore Custom Info + customManga?.id = manga.id!! + customManga?.let { customMangaManager.saveMangaInfo(it) } // SY <-- } } 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 fcd24381a..4981d24c0 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 @@ -4,6 +4,7 @@ import eu.kanade.tachiyomi.data.database.models.ChapterImpl import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaImpl import eu.kanade.tachiyomi.data.database.models.TrackImpl +import eu.kanade.tachiyomi.data.library.CustomMangaManager import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @@ -36,7 +37,15 @@ data class BackupManga( @ProtoNumber(102) var history: List = emptyList(), // SY specific values @ProtoNumber(600) var mergedMangaReferences: List = emptyList(), - @ProtoNumber(601) var flatMetadata: BackupFlatMetadata? = null + @ProtoNumber(601) var flatMetadata: BackupFlatMetadata? = null, + @ProtoNumber(602) var customStatus: Int = 0, + + // J2K specific values + @ProtoNumber(800) var customTitle: String? = null, + @ProtoNumber(801) var customArtist: String? = null, + @ProtoNumber(802) var customAuthor: String? = null, + @ProtoNumber(803) var customDescription: String? = null, + @ProtoNumber(803) var customGenre: List? = null ) { fun getMangaImpl(): MangaImpl { return MangaImpl().apply { @@ -62,6 +71,29 @@ data class BackupManga( } } + // SY --> + fun getCustomMangaInfo(): CustomMangaManager.MangaJson? { + if (customTitle != null || + customArtist != null || + customAuthor != null || + customDescription != null || + customGenre != null || + customStatus != 0 + ) { + return CustomMangaManager.MangaJson( + id = 0L, + title = customTitle, + author = customAuthor, + artist = customArtist, + description = customDescription, + genre = customGenre, + status = customStatus.takeUnless { it == 0 } + ) + } + return null + } + // SY <-- + fun getTrackingImpl(): List { return tracking.map { it.getTrackingImpl() @@ -69,22 +101,35 @@ data class BackupManga( } companion object { - fun copyFrom(manga: Manga): BackupManga { + fun copyFrom(manga: Manga /* SY --> */, customMangaManager: CustomMangaManager?/* SY <-- */): BackupManga { return BackupManga( url = manga.url, - title = manga.title, - artist = manga.artist, - author = manga.author, - description = manga.description, - genre = manga.getGenres() ?: emptyList(), - status = manga.status, + // SY --> + title = manga.originalTitle, + artist = manga.originalArtist, + author = manga.originalAuthor, + description = manga.originalDescription, + genre = manga.getOriginalGenres() ?: emptyList(), + status = manga.originalStatus, + // SY <-- thumbnailUrl = manga.thumbnail_url, favorite = manga.favorite, source = manga.source, dateAdded = manga.date_added, viewer = manga.viewer, chapterFlags = manga.chapter_flags - ) + // SY --> + ).also { backupManga -> + customMangaManager?.getManga(manga)?.let { + backupManga.customTitle = it.title + backupManga.customArtist = it.artist + backupManga.customAuthor = it.author + backupManga.customDescription = it.description + backupManga.customGenre = it.getGenres() + backupManga.customStatus = it.status + } + } + // SY <-- } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/CustomMangaManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/CustomMangaManager.kt index 0310e704e..25a45c7b1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/CustomMangaManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/CustomMangaManager.kt @@ -72,7 +72,7 @@ class CustomMangaManager(val context: Context) { @Serializable data class MangaJson( - val id: Long? = null, + var id: Long? = null, val title: String? = null, val author: String? = null, val artist: String? = null, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt index 803148de4..8c216b0f6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt @@ -276,7 +276,10 @@ class SettingsBackupController : SettingsController() { R.string.categories, R.string.chapters, R.string.track, - R.string.history + R.string.history, + // SY --> + R.string.custom_manga_info + // SY <-- ) .map { activity.getString(it) } @@ -286,7 +289,7 @@ class SettingsBackupController : SettingsController() { .listItemsMultiChoice( items = options, disabledIndices = intArrayOf(0), - initialSelection = intArrayOf(0, 1, 2, 3, 4) + initialSelection = intArrayOf(0, 1, 2, 3, 4 /* SY --> */, 5 /* SY <-- */) ) { _, positions, _ -> var flags = 0 for (i in 1 until positions.size) { @@ -295,6 +298,9 @@ class SettingsBackupController : SettingsController() { 2 -> flags = flags or BackupCreateService.BACKUP_CHAPTER 3 -> flags = flags or BackupCreateService.BACKUP_TRACK 4 -> flags = flags or BackupCreateService.BACKUP_HISTORY + // SY --> + 5 -> flags = flags or BackupCreateService.BACKUP_CUSTOM_INFO + // SY <-- } } diff --git a/app/src/main/res/values/strings_sy.xml b/app/src/main/res/values/strings_sy.xml index 65d1528b6..6c4708c13 100644 --- a/app/src/main/res/values/strings_sy.xml +++ b/app/src/main/res/values/strings_sy.xml @@ -192,6 +192,9 @@ Local source hidden folders Allow local source to read hidden folders + + Custom manga info + Save Chapters as CBZ CBZ Compression level