Read from streams for local source manga details and legacy backups

This commit is contained in:
arkon 2021-09-06 11:54:00 -04:00
parent abdb67a123
commit e942b8a402
4 changed files with 26 additions and 19 deletions

View File

@ -174,9 +174,11 @@ dependencies {
implementation("org.conscrypt:conscrypt-android:2.5.2") implementation("org.conscrypt:conscrypt-android:2.5.2")
// Data serialization (JSON, protobuf) // Data serialization (JSON, protobuf)
val kotlinSerializationVersion = "1.2.2" val kotlinSerializationVersion = "1.3.0-RC"
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinSerializationVersion") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinSerializationVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$kotlinSerializationVersion") implementation("org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$kotlinSerializationVersion")
// TODO: remove these once they're no longer used in any extensions
implementation("com.google.code.gson:gson:2.8.7") implementation("com.google.code.gson:gson:2.8.7")
implementation("com.github.salomonbrys.kotson:kotson:2.5.0") implementation("com.github.salomonbrys.kotson:kotson:2.5.0")

View File

@ -13,13 +13,12 @@ import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.decodeFromJsonElement import kotlinx.serialization.json.decodeFromJsonElement
import kotlinx.serialization.json.decodeFromStream
import kotlinx.serialization.json.intOrNull import kotlinx.serialization.json.intOrNull
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okio.buffer
import okio.source import okio.source
import java.util.Date import java.util.Date
@ -28,8 +27,8 @@ class LegacyBackupRestore(context: Context, notifier: BackupNotifier) : Abstract
override suspend fun performRestore(uri: Uri): Boolean { override suspend fun performRestore(uri: Uri): Boolean {
// Read the json and create a Json Object, // Read the json and create a Json Object,
// cannot use the backupManager json deserializer one because its not initialized yet // cannot use the backupManager json deserializer one because its not initialized yet
val backupObject = Json.decodeFromString<JsonObject>( val backupObject = Json.decodeFromStream<JsonObject>(
context.contentResolver.openInputStream(uri)!!.source().buffer().use { it.readUtf8() } context.contentResolver.openInputStream(uri)!!
) )
// Get parser version // Get parser version

View File

@ -5,9 +5,7 @@ import android.net.Uri
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.backup.AbstractBackupRestoreValidator import eu.kanade.tachiyomi.data.backup.AbstractBackupRestoreValidator
import eu.kanade.tachiyomi.data.backup.legacy.models.Backup import eu.kanade.tachiyomi.data.backup.legacy.models.Backup
import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.decodeFromStream
import okio.buffer
import okio.source
class LegacyBackupRestoreValidator : AbstractBackupRestoreValidator() { class LegacyBackupRestoreValidator : AbstractBackupRestoreValidator() {
/** /**
@ -19,8 +17,8 @@ class LegacyBackupRestoreValidator : AbstractBackupRestoreValidator() {
override fun validate(context: Context, uri: Uri): Results { override fun validate(context: Context, uri: Uri): Results {
val backupManager = LegacyBackupManager(context) val backupManager = LegacyBackupManager(context)
val backup = backupManager.parser.decodeFromString<Backup>( val backup = backupManager.parser.decodeFromStream<Backup>(
context.contentResolver.openInputStream(uri)!!.source().buffer().use { it.readUtf8() } context.contentResolver.openInputStream(uri)!!
) )
if (backup.version == null) { if (backup.version == null) {

View File

@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.source
import android.content.Context import android.content.Context
import com.github.junrar.Archive import com.github.junrar.Archive
import com.google.gson.JsonParser
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
@ -15,8 +14,16 @@ import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.storage.EpubFile import eu.kanade.tachiyomi.util.storage.EpubFile
import eu.kanade.tachiyomi.util.system.ImageUtil import eu.kanade.tachiyomi.util.system.ImageUtil
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.contentOrNull
import kotlinx.serialization.json.decodeFromStream
import kotlinx.serialization.json.intOrNull
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonPrimitive
import rx.Observable import rx.Observable
import timber.log.Timber import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.InputStream import java.io.InputStream
@ -68,6 +75,8 @@ class LocalSource(private val context: Context) : CatalogueSource {
} }
} }
private val json: Json by injectLazy()
override val id = ID override val id = ID
override val name = context.getString(R.string.local_source) override val name = context.getString(R.string.local_source)
override val lang = "" override val lang = ""
@ -157,16 +166,15 @@ class LocalSource(private val context: Context) : CatalogueSource {
.flatten() .flatten()
.firstOrNull { it.extension == "json" } .firstOrNull { it.extension == "json" }
?.apply { ?.apply {
val reader = this.inputStream().bufferedReader() val obj = json.decodeFromStream<JsonObject>(inputStream())
val json = JsonParser.parseReader(reader).asJsonObject
manga.title = json["title"]?.asString ?: manga.title manga.title = obj["title"]?.jsonPrimitive?.contentOrNull ?: manga.title
manga.author = json["author"]?.asString ?: manga.author manga.author = obj["author"]?.jsonPrimitive?.contentOrNull ?: manga.author
manga.artist = json["artist"]?.asString ?: manga.artist manga.artist = obj["artist"]?.jsonPrimitive?.contentOrNull ?: manga.artist
manga.description = json["description"]?.asString ?: manga.description manga.description = obj["description"]?.jsonPrimitive?.contentOrNull ?: manga.description
manga.genre = json["genre"]?.asJsonArray?.joinToString(", ") { it.asString } manga.genre = obj["genre"]?.jsonArray?.joinToString(", ") { it.jsonPrimitive.content }
?: manga.genre ?: manga.genre
manga.status = json["status"]?.asInt ?: manga.status manga.status = obj["status"]?.jsonPrimitive?.intOrNull ?: manga.status
} }
return Observable.just(manga) return Observable.just(manga)