From 6c278604ecc34240f16eaf64953de3ba22458fe7 Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Sat, 21 Aug 2021 06:23:58 +0430 Subject: [PATCH] got rid of legacy backups --- .../suwayomi/tachidesk/manga/MangaAPI.kt | 8 - .../manga/controller/BackupController.kt | 58 ----- .../impl/backup/legacy/LegacyBackupBase.kt | 45 ---- .../impl/backup/legacy/LegacyBackupExport.kt | 154 ------------- .../impl/backup/legacy/LegacyBackupImport.kt | 212 ------------------ .../backup/legacy/LegacyBackupValidator.kt | 71 ------ .../manga/impl/backup/legacy/models/Backup.kt | 25 --- .../impl/backup/legacy/models/DHistory.kt | 3 - .../legacy/serializer/CategoryTypeAdapter.kt | 31 --- .../legacy/serializer/ChapterTypeAdapter.kt | 59 ----- .../legacy/serializer/HistoryTypeAdapter.kt | 32 --- .../legacy/serializer/MangaTypeAdapter.kt | 37 --- .../legacy/serializer/TrackTypeAdapter.kt | 59 ----- 13 files changed, 794 deletions(-) delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupBase.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupExport.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupImport.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupValidator.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/models/Backup.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/models/DHistory.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/CategoryTypeAdapter.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/ChapterTypeAdapter.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/HistoryTypeAdapter.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/MangaTypeAdapter.kt delete mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/TrackTypeAdapter.kt diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt index 294b9253..9268ad8f 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt @@ -85,14 +85,6 @@ object MangaAPI { } path("backup") { - path("legacy") { // legacy json - post("import", BackupController::legacyImport) - post("import/file", BackupController::legacyImportFile) - - get("export", BackupController::legacyExport) - get("export/file", BackupController::legacyExportFile) - } - post("import", BackupController::protobufImport) post("import/file", BackupController::protobufImportFile) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/BackupController.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/BackupController.kt index d61a4d73..8fe32a0f 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/BackupController.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/BackupController.kt @@ -2,8 +2,6 @@ package suwayomi.tachidesk.manga.controller import io.javalin.http.Context import suwayomi.tachidesk.manga.impl.backup.BackupFlags -import suwayomi.tachidesk.manga.impl.backup.legacy.LegacyBackupExport -import suwayomi.tachidesk.manga.impl.backup.legacy.LegacyBackupImport import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupExport import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupImport import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupValidator @@ -19,62 +17,6 @@ import java.util.Date * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ object BackupController { - /** expects a Tachiyomi legacy backup json in the body */ - fun legacyImport(ctx: Context) { - ctx.result( - JavalinSetup.future { - LegacyBackupImport.performRestore(ctx.bodyAsInputStream()) - } - ) - } - - /** expects a Tachiyomi legacy backup json as a file upload, the file must be named "backup.json" */ - fun legacyImportFile(ctx: Context) { - ctx.result( - JavalinSetup.future { - LegacyBackupImport.performRestore(ctx.uploadedFile("backup.json")!!.content) - } - ) - } - - /** returns a Tachiyomi legacy backup json created from the current database as a json body */ - fun legacyExport(ctx: Context) { - ctx.contentType("application/json") - ctx.result( - JavalinSetup.future { - LegacyBackupExport.createBackup( - BackupFlags( - includeManga = true, - includeCategories = true, - includeChapters = true, - includeTracking = true, - includeHistory = true, - ) - ) - } - ) - } - - /** returns a Tachiyomi legacy backup json created from the current database as a file */ - fun legacyExportFile(ctx: Context) { - ctx.contentType("application/json") - val currentDate = SimpleDateFormat("yyyy-MM-dd_HH-mm").format(Date()) - - ctx.header("Content-Disposition", """attachment; filename="tachidesk_$currentDate.json"""") - ctx.result( - JavalinSetup.future { - LegacyBackupExport.createBackup( - BackupFlags( - includeManga = true, - includeCategories = true, - includeChapters = true, - includeTracking = true, - includeHistory = true, - ) - ) - } - ) - } /** expects a Tachiyomi protobuf backup in the body */ fun protobufImport(ctx: Context) { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupBase.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupBase.kt deleted file mode 100644 index dfcfc6b2..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupBase.kt +++ /dev/null @@ -1,45 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy - -/* - * Copyright (C) Contributors to the Suwayomi project - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -import com.github.salomonbrys.kotson.registerTypeAdapter -import com.github.salomonbrys.kotson.registerTypeHierarchyAdapter -import com.google.gson.Gson -import com.google.gson.GsonBuilder -import suwayomi.tachidesk.manga.impl.backup.legacy.models.DHistory -import suwayomi.tachidesk.manga.impl.backup.legacy.serializer.CategoryTypeAdapter -import suwayomi.tachidesk.manga.impl.backup.legacy.serializer.ChapterTypeAdapter -import suwayomi.tachidesk.manga.impl.backup.legacy.serializer.HistoryTypeAdapter -import suwayomi.tachidesk.manga.impl.backup.legacy.serializer.MangaTypeAdapter -import suwayomi.tachidesk.manga.impl.backup.legacy.serializer.TrackTypeAdapter -import suwayomi.tachidesk.manga.impl.backup.models.CategoryImpl -import suwayomi.tachidesk.manga.impl.backup.models.ChapterImpl -import suwayomi.tachidesk.manga.impl.backup.models.MangaImpl -import suwayomi.tachidesk.manga.impl.backup.models.TrackImpl -import java.util.Date - -open class LegacyBackupBase { - protected val parser: Gson = when (version) { - 2 -> GsonBuilder() - .registerTypeAdapter(MangaTypeAdapter.build()) - .registerTypeHierarchyAdapter(ChapterTypeAdapter.build()) - .registerTypeAdapter(CategoryTypeAdapter.build()) - .registerTypeAdapter(HistoryTypeAdapter.build()) - .registerTypeHierarchyAdapter(TrackTypeAdapter.build()) - .create() - else -> throw Exception("Unknown backup version") - } - - protected var sourceMapping: Map = emptyMap() - - protected val errors = mutableListOf>() - - companion object { - internal const val version = 2 - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupExport.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupExport.kt deleted file mode 100644 index cbcbd323..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupExport.kt +++ /dev/null @@ -1,154 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy - -/* - * Copyright (C) Contributors to the Suwayomi project - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -import com.github.salomonbrys.kotson.set -import com.google.gson.JsonArray -import com.google.gson.JsonElement -import com.google.gson.JsonObject -import eu.kanade.tachiyomi.source.LocalSource -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.transactions.transaction -import suwayomi.tachidesk.manga.impl.Category.getCategoryList -import suwayomi.tachidesk.manga.impl.CategoryManga.getMangaCategories -import suwayomi.tachidesk.manga.impl.backup.BackupFlags -import suwayomi.tachidesk.manga.impl.backup.legacy.models.Backup -import suwayomi.tachidesk.manga.impl.backup.legacy.models.Backup.CURRENT_VERSION -import suwayomi.tachidesk.manga.impl.backup.models.CategoryImpl -import suwayomi.tachidesk.manga.impl.backup.models.ChapterImpl -import suwayomi.tachidesk.manga.impl.backup.models.Manga -import suwayomi.tachidesk.manga.impl.backup.models.MangaImpl -import suwayomi.tachidesk.manga.impl.util.GetHttpSource.getHttpSource -import suwayomi.tachidesk.manga.model.table.ChapterTable -import suwayomi.tachidesk.manga.model.table.MangaTable - -object LegacyBackupExport : LegacyBackupBase() { - - suspend fun createBackup(flags: BackupFlags): ByteArray { - // Create root object - val root = JsonObject() - - // Create manga array - val mangaEntries = JsonArray() - - // Create category array - val categoryEntries = JsonArray() - - // Create extension ID/name mapping - val extensionEntries = JsonArray() - - // Add values to root - root[Backup.VERSION] = CURRENT_VERSION - root[Backup.MANGAS] = mangaEntries - root[Backup.CATEGORIES] = categoryEntries - root[Backup.EXTENSIONS] = extensionEntries - - transaction { - val mangas = MangaTable.select { (MangaTable.inLibrary eq true) } - - val extensions: MutableSet = mutableSetOf() - - // Backup library manga and its dependencies - mangas.map { - MangaImpl.fromQuery(it) - }.forEach { manga -> - - mangaEntries.add(backupMangaObject(manga, flags)) - - // Maintain set of extensions/sources used (excludes local source) - if (manga.source != LocalSource.ID) { - getHttpSource(manga.source).let { - extensions.add("${it.id}:${it.name}") - } - } - } - - // Backup categories - if (flags.includeCategories) { - backupCategories(categoryEntries) - } - - // Backup extension ID/name mapping - backupExtensionInfo(extensionEntries, extensions) - } - - return parser.toJson(root).encodeToByteArray() - } - - private fun backupMangaObject(manga: Manga, options: BackupFlags): JsonElement { - // Entry for this manga - val entry = JsonObject() - - // Backup manga fields - entry[Backup.MANGA] = parser.toJsonTree(manga) - val mangaId = manga.id!!.toInt() - - // Check if user wants chapter information in backup - if (options.includeChapters) { - // Backup all the chapters - val chapters = ChapterTable.select { ChapterTable.manga eq mangaId }.map { ChapterImpl.fromQuery(it) } - if (chapters.count() > 0) { - val chaptersJson = parser.toJsonTree(chapters) - if (chaptersJson.asJsonArray.size() > 0) { - entry[Backup.CHAPTERS] = chaptersJson - } - } - } - - // Check if user wants category information in backup - if (options.includeCategories) { - // Backup categories for this manga - val categoriesForManga = getMangaCategories(mangaId) - if (categoriesForManga.isNotEmpty()) { - val categoriesNames = categoriesForManga.map { it.name } - entry[Backup.CATEGORIES] = parser.toJsonTree(categoriesNames) - } - } - - // Check if user wants track information in backup - if (options.includeTracking) { // TODO -// val tracks = databaseHelper.getTracks(manga).executeAsBlocking() -// if (tracks.isNotEmpty()) { -// entry[TRACK] = parser.toJsonTree(tracks) -// } - } -// -// // Check if user wants history information in backup - if (options.includeHistory) { // TODO -// val historyForManga = databaseHelper.getHistoryByMangaId(manga.id!!).executeAsBlocking() -// if (historyForManga.isNotEmpty()) { -// val historyData = historyForManga.mapNotNull { history -> -// val url = databaseHelper.getChapter(history.chapter_id).executeAsBlocking()?.url -// url?.let { DHistory(url, history.last_read) } -// } -// val historyJson = parser.toJsonTree(historyData) -// if (historyJson.asJsonArray.size() > 0) { -// entry[HISTORY] = historyJson -// } -// } - } - - return entry - } - - private fun backupCategories(root: JsonArray) { - val categories = getCategoryList().map { - CategoryImpl().apply { - name = it.name - order = it.order - } - } - categories.forEach { root.add(parser.toJsonTree(it)) } - } - - private fun backupExtensionInfo(root: JsonArray, extensions: Set) { - extensions.sorted().forEach { - root.add(it) - } - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupImport.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupImport.kt deleted file mode 100644 index 7f5d01c5..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupImport.kt +++ /dev/null @@ -1,212 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy - -/* - * Copyright (C) Contributors to the Suwayomi project - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -import com.github.salomonbrys.kotson.fromJson -import com.google.gson.JsonArray -import com.google.gson.JsonElement -import com.google.gson.JsonObject -import com.google.gson.JsonParser -import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.model.SManga -import mu.KotlinLogging -import org.jetbrains.exposed.sql.and -import org.jetbrains.exposed.sql.insert -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.transactions.transaction -import org.jetbrains.exposed.sql.update -import suwayomi.tachidesk.manga.impl.Category.createCategory -import suwayomi.tachidesk.manga.impl.Category.getCategoryList -import suwayomi.tachidesk.manga.impl.backup.AbstractBackupValidator.ValidationResult -import suwayomi.tachidesk.manga.impl.backup.legacy.LegacyBackupValidator.validate -import suwayomi.tachidesk.manga.impl.backup.legacy.models.Backup -import suwayomi.tachidesk.manga.impl.backup.legacy.models.DHistory -import suwayomi.tachidesk.manga.impl.backup.models.CategoryImpl -import suwayomi.tachidesk.manga.impl.backup.models.Chapter -import suwayomi.tachidesk.manga.impl.backup.models.ChapterImpl -import suwayomi.tachidesk.manga.impl.backup.models.Manga -import suwayomi.tachidesk.manga.impl.backup.models.MangaImpl -import suwayomi.tachidesk.manga.impl.backup.models.Track -import suwayomi.tachidesk.manga.impl.backup.models.TrackImpl -import suwayomi.tachidesk.manga.impl.util.GetHttpSource.getHttpSource -import suwayomi.tachidesk.manga.impl.util.lang.awaitSingle -import suwayomi.tachidesk.manga.model.table.MangaTable -import java.io.InputStream -import java.util.Date - -private val logger = KotlinLogging.logger {} - -object LegacyBackupImport : LegacyBackupBase() { - suspend fun performRestore(sourceStream: InputStream): ValidationResult { - val reader = sourceStream.bufferedReader() - val json = JsonParser.parseReader(reader).asJsonObject - - val validationResult = validate(json) - - val mangasJson = json.get(Backup.MANGAS).asJsonArray - - // Restore categories - json.get(Backup.CATEGORIES)?.let { restoreCategories(it) } - - // Store source mapping for error messages - sourceMapping = LegacyBackupValidator.getSourceMapping(json) - - // Restore individual manga - mangasJson.forEach { - restoreManga(it.asJsonObject) - } - - logger.info { - """ - Restore Errors: - ${ errors.joinToString("\n") { "${it.first} - ${it.second}" } } - Restore Summary: - - Missing Sources: - ${validationResult.missingSources.joinToString("\n")} - - Missing Trackers: - ${validationResult.missingTrackers.joinToString("\n")} - """.trimIndent() - } - - return validationResult - } - - private fun restoreCategories(jsonCategories: JsonElement) { - val backupCategories = parser.fromJson>(jsonCategories) - val dbCategories = getCategoryList() - - // Iterate over them and create missing categories - backupCategories.forEach { category -> - if (dbCategories.none { it.name == category.name }) { - createCategory(category.name) - } - } - } - - private suspend fun restoreManga(mangaJson: JsonObject) { - val manga = parser.fromJson( - mangaJson.get( - Backup.MANGA - ) - ) - val chapters = parser.fromJson>( - mangaJson.get(Backup.CHAPTERS) - ?: JsonArray() - ) - val categories = parser.fromJson>( - mangaJson.get(Backup.CATEGORIES) - ?: JsonArray() - ) - val history = parser.fromJson>( - mangaJson.get(Backup.HISTORY) - ?: JsonArray() - ) - val tracks = parser.fromJson>( - mangaJson.get(Backup.TRACK) - ?: JsonArray() - ) - - val source = try { - getHttpSource(manga.source) - } catch (e: NullPointerException) { - null - } catch (e: NoSuchElementException) { - null - } - val sourceName = sourceMapping[manga.source] ?: manga.source.toString() - - logger.debug("Restoring Manga: ${manga.title} from $sourceName") - - try { - if (source != null) { - restoreMangaData(manga, source, chapters, categories, history, tracks) - } else { - errors.add(Date() to "${manga.title} [$sourceName]: Source not found: $sourceName (${manga.source})") - } - } catch (e: Exception) { - errors.add(Date() to "${manga.title} [$sourceName]: ${e.message}") - } - } - - /** - * @param manga manga data from json - * @param source source to get manga data from - * @param chapters chapters data from json - * @param categories categories data from json - * @param history history data from json - * @param tracks tracking data from json - */ - @Suppress("UNUSED_PARAMETER") - private suspend fun restoreMangaData( - manga: Manga, - source: Source, - chapters: List, - categories: List, - history: List, - tracks: List - ) { - val fetchedManga = fetchManga(source, manga) - - updateChapters(source, fetchedManga, chapters) - - // TODO -// backupManager.restoreCategoriesForManga(manga, categories) - -// backupManager.restoreHistoryForManga(history) - -// backupManager.restoreTrackForManga(manga, tracks) - -// updateTracking(fetchedManga, tracks) - } - - /** - * Fetches manga information - * - * @param source source of manga - * @param manga manga that needs updating - * @return Updated manga. - */ - private suspend fun fetchManga(source: Source, manga: Manga): SManga { - // make sure we have the manga record in library - transaction { - if (MangaTable.select { (MangaTable.url eq manga.url) and (MangaTable.sourceReference eq manga.source) }.firstOrNull() == null) { - MangaTable.insert { - it[url] = manga.url - it[title] = manga.title - - it[sourceReference] = manga.source - } - } - MangaTable.update({ (MangaTable.url eq manga.url) and (MangaTable.sourceReference eq manga.source) }) { - it[MangaTable.inLibrary] = true - } - } - - // update manga details - val fetchedManga = source.fetchMangaDetails(manga).awaitSingle() - transaction { - MangaTable.update({ (MangaTable.url eq manga.url) and (MangaTable.sourceReference eq manga.source) }) { - - it[artist] = fetchedManga.artist - it[author] = fetchedManga.author - it[description] = fetchedManga.description - it[genre] = fetchedManga.genre - it[status] = fetchedManga.status - if (fetchedManga.thumbnail_url != null && fetchedManga.thumbnail_url.orEmpty().isNotEmpty()) - it[MangaTable.thumbnail_url] = fetchedManga.thumbnail_url - } - } - - return fetchedManga - } - - @Suppress("UNUSED_PARAMETER") // TODO: remove this suppress when update Chapters is written - private fun updateChapters(source: Source, fetchedManga: SManga, chapters: List) { - // TODO("Not yet implemented") - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupValidator.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupValidator.kt deleted file mode 100644 index 7e3e2721..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/LegacyBackupValidator.kt +++ /dev/null @@ -1,71 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy - -/* - * Copyright (C) Contributors to the Suwayomi project - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -import com.google.gson.JsonObject -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.transactions.transaction -import suwayomi.tachidesk.manga.impl.backup.AbstractBackupValidator -import suwayomi.tachidesk.manga.impl.backup.legacy.models.Backup -import suwayomi.tachidesk.manga.model.table.SourceTable - -object LegacyBackupValidator : AbstractBackupValidator() { - - /** - * Checks for critical backup file data. - * - * @throws Exception if version or manga cannot be found. - * @return List of missing sources or missing trackers. - */ - fun validate(json: JsonObject): ValidationResult { - val version = json.get(Backup.VERSION) - val mangasJson = json.get(Backup.MANGAS) - if (version == null || mangasJson == null) { - throw Exception("File is missing data.") - } - - val mangas = mangasJson.asJsonArray - if (mangas.size() == 0) { - throw Exception("Backup does not contain any manga.") - } - - val sources = getSourceMapping(json) - val missingSources = transaction { - sources - .filter { SourceTable.select { SourceTable.id eq it.key }.firstOrNull() == null } - .map { "${it.value} (${it.key})" } - .sorted() - } - -// val trackers = mangas -// .filter { it.asJsonObject.has("track") } -// .flatMap { it.asJsonObject["track"].asJsonArray } -// .map { it.asJsonObject["s"].asInt } -// .distinct() - - val missingTrackers = listOf("") -// val missingTrackers = trackers -// .mapNotNull { trackManager.getService(it) } -// .filter { !it.isLogged } -// .map { context.getString(it.nameRes()) } -// .sorted() - - return ValidationResult(missingSources, missingTrackers) - } - - fun getSourceMapping(json: JsonObject): Map { - val extensionsMapping = json.get(Backup.EXTENSIONS) ?: return emptyMap() - - return extensionsMapping.asJsonArray - .map { - val items = it.asString.split(":") - items[0].toLong() to items[1] - } - .toMap() - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/models/Backup.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/models/Backup.kt deleted file mode 100644 index 2f58de8f..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/models/Backup.kt +++ /dev/null @@ -1,25 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy.models - -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale - -/** - * Json values - */ -object Backup { - const val CURRENT_VERSION = 2 - const val MANGA = "manga" - const val MANGAS = "mangas" - const val TRACK = "track" - const val CHAPTERS = "chapters" - const val CATEGORIES = "categories" - const val EXTENSIONS = "extensions" - const val HISTORY = "history" - const val VERSION = "version" - - fun getDefaultFilename(): String { - val date = SimpleDateFormat("yyyy-MM-dd_HH-mm", Locale.getDefault()).format(Date()) - return "tachiyomi_$date.json" - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/models/DHistory.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/models/DHistory.kt deleted file mode 100644 index 6d91fbd1..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/models/DHistory.kt +++ /dev/null @@ -1,3 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy.models - -data class DHistory(val url: String, val lastRead: Long) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/CategoryTypeAdapter.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/CategoryTypeAdapter.kt deleted file mode 100644 index edd73f27..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/CategoryTypeAdapter.kt +++ /dev/null @@ -1,31 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy.serializer - -import com.github.salomonbrys.kotson.typeAdapter -import com.google.gson.TypeAdapter -import suwayomi.tachidesk.manga.impl.backup.models.CategoryImpl - -/** - * JSON Serializer used to write / read [CategoryImpl] to / from json - */ -object CategoryTypeAdapter { - - fun build(): TypeAdapter { - return typeAdapter { - write { - beginArray() - value(it.name) - value(it.order) - endArray() - } - - read { - beginArray() - val category = CategoryImpl() - category.name = nextString() - category.order = nextInt() - endArray() - category - } - } - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/ChapterTypeAdapter.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/ChapterTypeAdapter.kt deleted file mode 100644 index a669db89..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/ChapterTypeAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy.serializer - -import com.github.salomonbrys.kotson.typeAdapter -import com.google.gson.TypeAdapter -import com.google.gson.stream.JsonToken -import suwayomi.tachidesk.manga.impl.backup.models.ChapterImpl - -/** - * JSON Serializer used to write / read [ChapterImpl] to / from json - */ -object ChapterTypeAdapter { - - private const val URL = "u" - private const val READ = "r" - private const val BOOKMARK = "b" - private const val LAST_READ = "l" - - fun build(): TypeAdapter { - return typeAdapter { - write { - if (it.read || it.bookmark || it.last_page_read != 0) { - beginObject() - name(URL) - value(it.url) - if (it.read) { - name(READ) - value(1) - } - if (it.bookmark) { - name(BOOKMARK) - value(1) - } - if (it.last_page_read != 0) { - name(LAST_READ) - value(it.last_page_read) - } - endObject() - } - } - - read { - val chapter = ChapterImpl() - beginObject() - while (hasNext()) { - if (peek() == JsonToken.NAME) { - when (nextName()) { - URL -> chapter.url = nextString() - READ -> chapter.read = nextInt() == 1 - BOOKMARK -> chapter.bookmark = nextInt() == 1 - LAST_READ -> chapter.last_page_read = nextInt() - } - } - } - endObject() - chapter - } - } - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/HistoryTypeAdapter.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/HistoryTypeAdapter.kt deleted file mode 100644 index b5cdd1d9..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/HistoryTypeAdapter.kt +++ /dev/null @@ -1,32 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy.serializer - -import com.github.salomonbrys.kotson.typeAdapter -import com.google.gson.TypeAdapter -import suwayomi.tachidesk.manga.impl.backup.legacy.models.DHistory - -/** - * JSON Serializer used to write / read [DHistory] to / from json - */ -object HistoryTypeAdapter { - - fun build(): TypeAdapter { - return typeAdapter { - write { - if (it.lastRead != 0L) { - beginArray() - value(it.url) - value(it.lastRead) - endArray() - } - } - - read { - beginArray() - val url = nextString() - val lastRead = nextLong() - endArray() - DHistory(url, lastRead) - } - } - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/MangaTypeAdapter.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/MangaTypeAdapter.kt deleted file mode 100644 index c54b7621..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/MangaTypeAdapter.kt +++ /dev/null @@ -1,37 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy.serializer - -import com.github.salomonbrys.kotson.typeAdapter -import com.google.gson.TypeAdapter -import suwayomi.tachidesk.manga.impl.backup.models.MangaImpl - -/** - * JSON Serializer used to write / read [MangaImpl] to / from json - */ -object MangaTypeAdapter { - - fun build(): TypeAdapter { - return typeAdapter { - write { - beginArray() - value(it.url) - value(it.title) - value(it.source) - value(it.viewer_flags) - value(it.chapter_flags) - endArray() - } - - read { - beginArray() - val manga = MangaImpl() - manga.url = nextString() - manga.title = nextString() - manga.source = nextLong() - manga.viewer_flags = nextInt() - manga.chapter_flags = nextInt() - endArray() - manga - } - } - } -} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/TrackTypeAdapter.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/TrackTypeAdapter.kt deleted file mode 100644 index c6053f6b..00000000 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/legacy/serializer/TrackTypeAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package suwayomi.tachidesk.manga.impl.backup.legacy.serializer - -import com.github.salomonbrys.kotson.typeAdapter -import com.google.gson.TypeAdapter -import com.google.gson.stream.JsonToken -import suwayomi.tachidesk.manga.impl.backup.models.TrackImpl - -/** - * JSON Serializer used to write / read [TrackImpl] to / from json - */ -object TrackTypeAdapter { - - private const val SYNC = "s" - private const val MEDIA = "r" - private const val LIBRARY = "ml" - private const val TITLE = "t" - private const val LAST_READ = "l" - private const val TRACKING_URL = "u" - - fun build(): TypeAdapter { - return typeAdapter { - write { - beginObject() - name(TITLE) - value(it.title) - name(SYNC) - value(it.sync_id) - name(MEDIA) - value(it.media_id) - name(LIBRARY) - value(it.library_id) - name(LAST_READ) - value(it.last_chapter_read) - name(TRACKING_URL) - value(it.tracking_url) - endObject() - } - - read { - val track = TrackImpl() - beginObject() - while (hasNext()) { - if (peek() == JsonToken.NAME) { - when (nextName()) { - TITLE -> track.title = nextString() - SYNC -> track.sync_id = nextInt() - MEDIA -> track.media_id = nextInt() - LIBRARY -> track.library_id = nextLong() - LAST_READ -> track.last_chapter_read = nextInt() - TRACKING_URL -> track.tracking_url = nextString() - } - } - } - endObject() - track - } - } - } -}