Convert SY specific usages of Gson to Kotlin Serialization

Cleanup saved searches a bit
Cleanup json parsing
This commit is contained in:
Jobobby04
2020-10-12 14:20:54 -04:00
parent bbfce97125
commit f3365cef67
46 changed files with 490 additions and 366 deletions
@@ -9,10 +9,12 @@ import exh.metadata.EX_DATE_FORMAT
import exh.metadata.ONGOING_SUFFIX
import exh.metadata.humanReadableByteCount
import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.serialization.Serializable
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.Date
@Serializable
class EHentaiSearchMetadata : RaisedSearchMetadata() {
var gId: String?
get() = indexedExtra
@@ -4,7 +4,9 @@ import android.content.Context
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.serialization.Serializable
@Serializable
class EightMusesSearchMetadata : RaisedSearchMetadata() {
var path: List<String> = emptyList()
@@ -5,7 +5,9 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.metadata.EightMusesSearchMetadata.Companion.ARTIST_NAMESPACE
import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.serialization.Serializable
@Serializable
class HBrowseSearchMetadata : RaisedSearchMetadata() {
var hbId: Long? = null
@@ -4,7 +4,9 @@ import android.content.Context
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.serialization.Serializable
@Serializable
class HentaiCafeSearchMetadata : RaisedSearchMetadata() {
var hcId: String? = null
var readerId: String? = null
@@ -5,9 +5,10 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.EX_DATE_FORMAT
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.plusAssign
import kotlinx.serialization.Serializable
import java.util.Date
@Serializable
class HitomiSearchMetadata : RaisedSearchMetadata() {
var url get() = hlId?.let { urlFromHlId(it) }
set(a) {
@@ -26,7 +27,7 @@ class HitomiSearchMetadata : RaisedSearchMetadata() {
var group: String? = null
var type: String? = null
var genre: String? = null
var language: String? = null
@@ -101,7 +102,7 @@ class HitomiSearchMetadata : RaisedSearchMetadata() {
pairs += Pair(context.getString(R.string.artist), artists)
}
group?.let { pairs += Pair(context.getString(R.string.group), it) }
type?.let { pairs += Pair(context.getString(R.string.genre), it) }
genre?.let { pairs += Pair(context.getString(R.string.genre), it) }
language?.let { pairs += Pair(context.getString(R.string.language), it) }
val series = series.joinToString()
if (series.isNotBlank()) {
@@ -5,7 +5,9 @@ import androidx.core.net.toUri
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.serialization.Serializable
@Serializable
class MangaDexSearchMetadata : RaisedSearchMetadata() {
var mdId: String? = null
@@ -6,9 +6,11 @@ import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.EX_DATE_FORMAT
import exh.metadata.ONGOING_SUFFIX
import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.serialization.Serializable
import uy.kohesive.injekt.api.get
import java.util.Date
@Serializable
class NHentaiSearchMetadata : RaisedSearchMetadata() {
var url get() = nhId?.let { BASE_URL + nhIdToPath(it) }
set(a) {
@@ -6,7 +6,9 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.metadata.metadata.base.RaisedTitle
import kotlinx.serialization.Serializable
@Serializable
class PervEdenSearchMetadata : RaisedSearchMetadata() {
var pvId: String? = null
@@ -23,7 +25,7 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
var artist: String? = null
var type: String? = null
var genre: String? = null
var rating: Float? = null
@@ -102,7 +104,7 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
pairs += Pair(context.getString(R.string.alt_titles), altTitles)
}
artist?.let { pairs += Pair(context.getString(R.string.artist), it) }
type?.let { pairs += Pair(context.getString(R.string.genre), it) }
genre?.let { pairs += Pair(context.getString(R.string.genre), it) }
rating?.let { pairs += Pair(context.getString(R.string.average_rating), it.toString()) }
status?.let { pairs += Pair(context.getString(R.string.status), it) }
lang?.let { pairs += Pair(context.getString(R.string.language), it) }
@@ -4,7 +4,9 @@ import android.content.Context
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.serialization.Serializable
@Serializable
class PururinSearchMetadata : RaisedSearchMetadata() {
var prId: Int? = null
@@ -6,10 +6,12 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.EX_DATE_FORMAT
import exh.metadata.metadata.base.RaisedSearchMetadata
import kotlinx.serialization.Serializable
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
@Serializable
class TsuminoSearchMetadata : RaisedSearchMetadata() {
var tmId: Int? = null
@@ -5,10 +5,15 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper
import exh.metadata.sql.models.SearchMetadata
import exh.metadata.sql.models.SearchTag
import exh.metadata.sql.models.SearchTitle
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.serializer
import rx.Completable
import rx.Single
import kotlin.reflect.KClass
@Serializable
data class FlatMetadata(
val metadata: SearchMetadata,
val tags: List<SearchTag>,
@@ -16,9 +21,10 @@ data class FlatMetadata(
) {
inline fun <reified T : RaisedSearchMetadata> raise(): T = raise(T::class)
@OptIn(InternalSerializationApi::class)
fun <T : RaisedSearchMetadata> raise(clazz: KClass<T>): T =
RaisedSearchMetadata.raiseFlattenGson
.fromJson(metadata.extra, clazz.java).apply {
RaisedSearchMetadata.raiseFlattenJson
.decodeFromString(clazz.serializer(), metadata.extra).apply {
fillBaseFields(this@FlatMetadata)
}
}
@@ -1,17 +1,35 @@
package exh.metadata.metadata.base
import android.content.Context
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.forEach
import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.EightMusesSearchMetadata
import exh.metadata.metadata.HBrowseSearchMetadata
import exh.metadata.metadata.HentaiCafeSearchMetadata
import exh.metadata.metadata.HitomiSearchMetadata
import exh.metadata.metadata.MangaDexSearchMetadata
import exh.metadata.metadata.NHentaiSearchMetadata
import exh.metadata.metadata.PervEdenSearchMetadata
import exh.metadata.metadata.PururinSearchMetadata
import exh.metadata.metadata.TsuminoSearchMetadata
import exh.metadata.sql.models.SearchMetadata
import exh.metadata.sql.models.SearchTag
import exh.metadata.sql.models.SearchTitle
import exh.plusAssign
import kotlinx.serialization.Polymorphic
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
@Polymorphic
@Serializable
abstract class RaisedSearchMetadata {
@Transient
var mangaId: Long = -1
@@ -67,7 +85,7 @@ abstract class RaisedSearchMetadata {
fun flatten(): FlatMetadata {
require(mangaId != -1L)
val extra = raiseFlattenGson.toJson(this)
val extra = raiseFlattenJson.encodeToString(this)
return FlatMetadata(
SearchMetadata(
mangaId,
@@ -122,7 +140,25 @@ abstract class RaisedSearchMetadata {
(this).filter { it.type != TAG_TYPE_VIRTUAL }
.joinToString { (if (it.namespace != null) "${it.namespace}: " else "") + it.name }
val raiseFlattenGson: Gson = GsonBuilder().create()
private val module = SerializersModule {
polymorphic(RaisedSearchMetadata::class) {
subclass(EHentaiSearchMetadata::class)
subclass(EightMusesSearchMetadata::class)
subclass(HBrowseSearchMetadata::class)
subclass(HentaiCafeSearchMetadata::class)
subclass(HitomiSearchMetadata::class)
subclass(MangaDexSearchMetadata::class)
subclass(NHentaiSearchMetadata::class)
subclass(PervEdenSearchMetadata::class)
subclass(PururinSearchMetadata::class)
subclass(TsuminoSearchMetadata::class)
}
}
val raiseFlattenJson = Json {
ignoreUnknownKeys = true
serializersModule = module
}
fun titleDelegate(type: Int) = object : ReadWriteProperty<RaisedSearchMetadata, String?> {
/**
@@ -1,5 +1,8 @@
package exh.metadata.metadata.base
import kotlinx.serialization.Serializable
@Serializable
data class RaisedTag(
val namespace: String?,
val name: String,
@@ -1,5 +1,8 @@
package exh.metadata.metadata.base
import kotlinx.serialization.Serializable
@Serializable
data class RaisedTitle(
val title: String,
val type: Int = 0
@@ -1,5 +1,9 @@
package exh.metadata.sql.models
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
@Serializable
data class SearchMetadata(
// Manga ID this gallery is linked to
val mangaId: Long,
@@ -17,5 +21,6 @@ data class SearchMetadata(
val extraVersion: Int
) {
// Transient information attached to this piece of metadata, useful for caching
var transientCache: Map<String, Any>? = null
var transientCache: Map<String, @Contextual Any>? = null
}
@@ -1,5 +1,8 @@
package exh.metadata.sql.models
import kotlinx.serialization.Serializable
@Serializable
data class SearchTag(
// Tag identifier, unique
val id: Long?,
@@ -1,5 +1,8 @@
package exh.metadata.sql.models
import kotlinx.serialization.Serializable
@Serializable
data class SearchTitle(
// Title identifier, unique
val id: Long?,