upmigration

This commit is contained in:
2020-12-02 14:39:54 +06:00
parent 7bc1e822fc
commit f27c493771
29 changed files with 94 additions and 87 deletions

View File

@@ -0,0 +1,66 @@
package dev.inmo.saucenaoapi.models
import dev.inmo.saucenaoapi.defaultSauceNaoParser
import kotlinx.serialization.*
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonObject
@Serializable
data class Header(
@SerialName("status")
val status: Int? = null,
@SerialName("results_requested")
val resultsRequested: Int? = null,
@Serializable(IndexesSerializer::class)
@SerialName("index")
val indexes: List<HeaderIndex?> = emptyList(),
@SerialName("search_depth")
val searchDepth: Int? = null,
@SerialName("minimum_similarity")
val minSimilarity: Float? = null,
@SerialName("results_returned")
val resultsCount: Int? = null,
@SerialName("query_image_display")
val queryImageDisplay: String? = null, // something like "userdata/uuid.png",
@SerialName("query_image")
val queryImage: String? = null, // something like "uuid.jpg"
@SerialName("short_remaining")
val shortRemaining: Int = Int.MAX_VALUE,
@SerialName("long_remaining")
val longRemaining: Int = Int.MAX_VALUE,
@SerialName("short_limit")
val shortLimit: Int = Int.MAX_VALUE,
@SerialName("long_limit")
val longLimit: Int = Int.MAX_VALUE,
@SerialName("account_type")
val accountType: Int? = null,
@SerialName("user_id")
val userId: Int? = null
)
internal object IndexesSerializer : KSerializer<List<HeaderIndex?>> {
override val descriptor: SerialDescriptor = String.serializer().descriptor
override fun deserialize(decoder: Decoder): List<HeaderIndex?> {
val json = JsonObject.serializer().deserialize(decoder)
val parsed = json.keys.mapNotNull { it.toIntOrNull() }.sorted().mapNotNull {
val jsonObject = json[it.toString()] ?.jsonObject ?: return@mapNotNull null
val index = defaultSauceNaoParser.decodeFromString(
HeaderIndex.serializer(),
defaultSauceNaoParser.encodeToString(JsonObject.serializer(), jsonObject)
)
it to index
}.toMap()
return Array<HeaderIndex?>(parsed.keys.maxOrNull() ?: 0) {
parsed[it]
}.toList()
}
override fun serialize(encoder: Encoder, value: List<HeaderIndex?>) {
TODO()
}
}

View File

@@ -0,0 +1,11 @@
package dev.inmo.saucenaoapi.models
import kotlinx.serialization.Serializable
@Serializable
data class HeaderIndex(
val status: Int? = null,
val id: Int? = null,
val results: Int? = null,
val parent_id: Int? = null
)

View File

@@ -0,0 +1,11 @@
package dev.inmo.saucenaoapi.models
import kotlinx.serialization.Serializable
@Serializable
data class LimitsState(
val maxShortQuota: Int,
val maxLongQuota: Int,
val knownShortQuota: Int,
val knownLongQuota: Int
)

View File

@@ -0,0 +1,9 @@
package dev.inmo.saucenaoapi.models
import kotlinx.serialization.Serializable
@Serializable
data class Result(
val header: ResultHeader,
val data: ResultData
)

View File

@@ -0,0 +1,161 @@
package dev.inmo.saucenaoapi.models
import dev.inmo.saucenaoapi.utils.CommonMultivariantStringSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class ResultData(
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("danbooru_id")
val danbooruId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("gelbooru_id")
val gelbooruId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("drawr_id")
val drawrId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("pixiv_id")
val pixivId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("seiga_id")
val seigaId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("yandere_id")
val yandereId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("konachan_id")
val konachanId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("sankaku_id")
val sankakuId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("anime-pictures_id")
val animePicturesId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("e621_id")
val e621Id: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("idol_id")
val idolId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("imdb_id")
val imdbId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("anidb_aid")
val anidbAId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("bcy_id")
val bcyId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("ddb_id")
val ddbId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("nijie_id")
val nijieId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("getchu_id")
val getchuId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("shutterstock_id")
val shutterstockId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("contributor_id")
val contributorId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("est_time")
val estTime: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("bcy_type")
val bcyType: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("da_id")
val daId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("pg_id")
val pgId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("mal_id")
val malId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("md_id")
val mdId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("mu_id")
val muId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("pawoo_id")
val pawooId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("pawoo_user_acct")
val pawooUserAcct: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("pawoo_user_username")
val pawooUserUsername: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("pawoo_user_display_name")
val pawooUserDisplayname: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val title: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("jp_title")
val titleJp: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("eng_title")
val titleEng: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("alt_titles")
val titleAlt: List<String> = emptyList(),
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("jp_name")
val nameJp: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("eng_name")
val nameEng: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val creator: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val material: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("member_name")
val memberName: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("member_id")
val memberId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val part: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("part_name")
val partName: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val date: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val company: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val file: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val year: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("member_link_id")
val memberLinkId: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("author_name")
val authorName: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("author_url")
val authorUrl: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val characters: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val source: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val url: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
val type: String? = null,
@Serializable(CommonMultivariantStringSerializer::class)
@SerialName("created_at")
val createdAt: String? = null,
@SerialName("ext_urls")
val extUrls: List<String> = emptyList()
)

View File

@@ -0,0 +1,14 @@
package dev.inmo.saucenaoapi.models
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class ResultHeader(
val similarity: Float,
val thumbnail: String,
@SerialName("index_id")
val indexId: Int,
@SerialName("index_name")
val indexName: String
)

View File

@@ -0,0 +1,56 @@
package dev.inmo.saucenaoapi.models
import dev.inmo.saucenaoapi.defaultSauceNaoParser
import kotlinx.serialization.*
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.buildJsonObject
@Serializable
private data class TemporalSauceNaoAnswerRepresentation(
val header: Header,
val results: List<Result> = emptyList(),
)
@Serializable(SauceNaoAnswerSerializer::class)
data class SauceNaoAnswer internal constructor(
val header: Header,
val results: List<Result> = emptyList(),
val raw: JsonObject = JsonObject(emptyMap())
)
@Serializer(SauceNaoAnswer::class)
object SauceNaoAnswerSerializer : KSerializer<SauceNaoAnswer> {
private val resultsSerializer = ListSerializer(Result.serializer())
private const val headerField = "header"
private const val resultsField = "results"
private val serializer = defaultSauceNaoParser
override fun deserialize(decoder: Decoder): SauceNaoAnswer {
val raw = JsonObject.serializer().deserialize(decoder)
return serializer.decodeFromJsonElement(
TemporalSauceNaoAnswerRepresentation.serializer(),
raw
).let {
SauceNaoAnswer(
it.header,
it.results,
raw
)
}
}
override fun serialize(encoder: Encoder, value: SauceNaoAnswer) {
val resultObject = buildJsonObject {
value.raw.forEach {
put(it.key, it.value)
}
put(headerField, serializer.encodeToJsonElement(Header.serializer(), value.header))
put(resultsField, serializer.encodeToJsonElement(resultsSerializer, value.results))
}
JsonObject.serializer().serialize(encoder, resultObject)
}
}