瀏覽代碼

Migrate to kotlinx.serialization for Anilist

arkon 4 年之前
父節點
當前提交
e7d6605490

+ 5 - 6
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<OAuth>(preferences.trackToken(this).get())
         } catch (e: Exception) {
             null
         }

+ 79 - 72
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<JsonObject>(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<JsonObject>(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<JsonObject>(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<JsonObject>(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 {

+ 3 - 0
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,