From e7d660549059e55f5cbeeb8607c658279a64ffdc Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 11 Oct 2020 15:26:30 -0400 Subject: [PATCH] Migrate to kotlinx.serialization for Anilist --- .../tachiyomi/data/track/anilist/Anilist.kt | 11 +- .../data/track/anilist/AnilistApi.kt | 151 +++++++++--------- .../tachiyomi/data/track/anilist/OAuth.kt | 3 + 3 files changed, 87 insertions(+), 78 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt index 0ad37fa03a..cf4c1ef94b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt @@ -2,14 +2,15 @@ package eu.kanade.tachiyomi.data.track.anilist import android.content.Context import android.graphics.Color -import com.google.gson.Gson import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.model.TrackSearch +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import rx.Completable import rx.Observable -import uy.kohesive.injekt.injectLazy class Anilist(private val context: Context, id: Int) : TrackService(id) { @@ -33,8 +34,6 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) { override val name = "AniList" - private val gson: Gson by injectLazy() - private val interceptor by lazy { AnilistInterceptor(this, getPassword()) } private val api by lazy { AnilistApi(client, interceptor) } @@ -197,12 +196,12 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) { } fun saveOAuth(oAuth: OAuth?) { - preferences.trackToken(this).set(gson.toJson(oAuth)) + preferences.trackToken(this).set(Json.encodeToString(oAuth)) } fun loadOAuth(): OAuth? { return try { - gson.fromJson(preferences.trackToken(this).get(), OAuth::class.java) + Json.decodeFromString(preferences.trackToken(this).get()) } catch (e: Exception) { null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index 1258677501..d7e97c64d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -2,17 +2,22 @@ package eu.kanade.tachiyomi.data.track.anilist import android.net.Uri import androidx.core.net.toUri -import com.github.salomonbrys.kotson.array -import com.github.salomonbrys.kotson.get -import com.github.salomonbrys.kotson.jsonObject -import com.github.salomonbrys.kotson.nullInt -import com.github.salomonbrys.kotson.nullString -import com.github.salomonbrys.kotson.obj -import com.google.gson.JsonObject -import com.google.gson.JsonParser import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.network.asObservableSuccess +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.int +import kotlinx.serialization.json.intOrNull +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.long +import kotlinx.serialization.json.put +import kotlinx.serialization.json.putJsonObject import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.Request @@ -35,15 +40,14 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { |} |} |""".trimMargin() - val variables = jsonObject( - "mangaId" to track.media_id, - "progress" to track.last_chapter_read, - "status" to track.toAnilistStatus() - ) - val payload = jsonObject( - "query" to query, - "variables" to variables - ) + val payload = buildJsonObject { + put("query", query) + putJsonObject("variables") { + put("mangaId", track.media_id) + put("progress", track.last_chapter_read) + put("status", track.toAnilistStatus()) + } + } val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) @@ -57,8 +61,8 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { if (responseBody.isEmpty()) { throw Exception("Null Response") } - val response = JsonParser.parseString(responseBody).obj - track.library_id = response["data"]["SaveMediaListEntry"]["id"].asLong + val response = Json.decodeFromString(responseBody) + track.library_id = response["data"]!!.jsonObject["SaveMediaListEntry"]!!.jsonObject["id"]!!.jsonPrimitive.long track } } @@ -74,16 +78,15 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { |} |} |""".trimMargin() - val variables = jsonObject( - "listId" to track.library_id, - "progress" to track.last_chapter_read, - "status" to track.toAnilistStatus(), - "score" to track.score.toInt() - ) - val payload = jsonObject( - "query" to query, - "variables" to variables - ) + val payload = buildJsonObject { + put("query", query) + putJsonObject("variables") { + put("listId", track.library_id) + put("progress", track.last_chapter_read) + put("status", track.toAnilistStatus()) + put("score", track.score.toInt()) + } + } val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) @@ -122,13 +125,12 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { |} |} |""".trimMargin() - val variables = jsonObject( - "query" to search - ) - val payload = jsonObject( - "query" to query, - "variables" to variables - ) + val payload = buildJsonObject { + put("query", query) + putJsonObject("variables") { + put("query", search) + } + } val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) @@ -141,11 +143,11 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { if (responseBody.isEmpty()) { throw Exception("Null Response") } - val response = JsonParser.parseString(responseBody).obj - val data = response["data"]!!.obj - val page = data["Page"].obj - val media = page["media"].array - val entries = media.map { jsonToALManga(it.obj) } + val response = Json.decodeFromString(responseBody) + val data = response["data"]!!.jsonObject + val page = data["Page"]!!.jsonObject + val media = page["media"]!!.jsonArray + val entries = media.map { jsonToALManga(it.jsonObject) } entries.map { it.toTrack() } } } @@ -182,14 +184,13 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { |} |} |""".trimMargin() - val variables = jsonObject( - "id" to userid, - "manga_id" to track.media_id - ) - val payload = jsonObject( - "query" to query, - "variables" to variables - ) + val payload = buildJsonObject { + put("query", query) + putJsonObject("variables") { + put("id", userid) + put("manga_id", track.media_id) + } + } val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) @@ -202,11 +203,11 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { if (responseBody.isEmpty()) { throw Exception("Null Response") } - val response = JsonParser.parseString(responseBody).obj - val data = response["data"]!!.obj - val page = data["Page"].obj - val media = page["mediaList"].array - val entries = media.map { jsonToALUserManga(it.obj) } + val response = Json.decodeFromString(responseBody) + val data = response["data"]!!.jsonObject + val page = data["Page"]!!.jsonObject + val media = page["mediaList"]!!.jsonArray + val entries = media.map { jsonToALUserManga(it.jsonObject) } entries.firstOrNull()?.toTrack() } } @@ -232,9 +233,9 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { |} |} |""".trimMargin() - val payload = jsonObject( - "query" to query - ) + val payload = buildJsonObject { + put("query", query) + } val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) @@ -247,10 +248,10 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { if (responseBody.isEmpty()) { throw Exception("Null Response") } - val response = JsonParser.parseString(responseBody).obj - val data = response["data"]!!.obj - val viewer = data["Viewer"].obj - Pair(viewer["id"].asInt, viewer["mediaListOptions"]["scoreFormat"].asString) + val response = Json.decodeFromString(responseBody) + val data = response["data"]!!.jsonObject + val viewer = data["Viewer"]!!.jsonObject + Pair(viewer["id"]!!.jsonPrimitive.int, viewer["mediaListOptions"]!!.jsonObject["scoreFormat"]!!.jsonPrimitive.content) } } @@ -258,12 +259,12 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { val date = try { val date = Calendar.getInstance() date.set( - struct["startDate"]["year"].nullInt ?: 0, + struct["startDate"]!!.jsonObject["year"]!!.jsonPrimitive.intOrNull ?: 0, ( - struct["startDate"]["month"].nullInt + struct["startDate"]!!.jsonObject["month"]!!.jsonPrimitive.intOrNull ?: 0 ) - 1, - struct["startDate"]["day"].nullInt ?: 0 + struct["startDate"]!!.jsonObject["day"]!!.jsonPrimitive.intOrNull ?: 0 ) date.timeInMillis } catch (_: Exception) { @@ -271,19 +272,25 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { } return ALManga( - struct["id"].asInt, - struct["title"]["romaji"].asString, - struct["coverImage"]["large"].asString, - struct["description"].nullString.orEmpty(), - struct["type"].asString, - struct["status"].nullString.orEmpty(), + struct["id"]!!.jsonPrimitive.int, + struct["title"]!!.jsonObject["romaji"]!!.jsonPrimitive.content, + struct["coverImage"]!!.jsonObject["large"]!!.jsonPrimitive.content, + struct["description"]!!.jsonPrimitive.contentOrNull, + struct["type"]!!.jsonPrimitive.content, + struct["status"]!!.jsonPrimitive.contentOrNull ?: "", date, - struct["chapters"].nullInt ?: 0 + struct["chapters"]!!.jsonPrimitive.intOrNull ?: 0 ) } private fun jsonToALUserManga(struct: JsonObject): ALUserManga { - return ALUserManga(struct["id"].asLong, struct["status"].asString, struct["scoreRaw"].asInt, struct["progress"].asInt, jsonToALManga(struct["media"].obj)) + return ALUserManga( + struct["id"]!!.jsonPrimitive.long, + struct["status"]!!.jsonPrimitive.content, + struct["scoreRaw"]!!.jsonPrimitive.int, + struct["progress"]!!.jsonPrimitive.int, + jsonToALManga(struct["media"]!!.jsonObject) + ) } companion object { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/OAuth.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/OAuth.kt index 5df10fd510..d6de7e1a94 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/OAuth.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/OAuth.kt @@ -1,5 +1,8 @@ package eu.kanade.tachiyomi.data.track.anilist +import kotlinx.serialization.Serializable + +@Serializable data class OAuth( val access_token: String, val token_type: String,