Эх сурвалжийг харах

Use data class to parse extensions list

arkon 3 жил өмнө
parent
commit
f754b081ce

+ 29 - 23
app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt

@@ -10,11 +10,7 @@ import eu.kanade.tachiyomi.network.NetworkHelper
 import eu.kanade.tachiyomi.network.await
 import eu.kanade.tachiyomi.network.parseAs
 import eu.kanade.tachiyomi.util.lang.withIOContext
-import kotlinx.serialization.json.JsonArray
-import kotlinx.serialization.json.int
-import kotlinx.serialization.json.jsonObject
-import kotlinx.serialization.json.jsonPrimitive
-import kotlinx.serialization.json.long
+import kotlinx.serialization.Serializable
 import uy.kohesive.injekt.injectLazy
 import java.util.Date
 
@@ -28,8 +24,8 @@ internal class ExtensionGithubApi {
             networkService.client
                 .newCall(GET("${REPO_URL_PREFIX}index.min.json"))
                 .await()
-                .parseAs<JsonArray>()
-                .let { parseResponse(it) }
+                .parseAs<List<ExtensionJsonObject>>()
+                .toExtensions()
         }
     }
 
@@ -56,24 +52,23 @@ internal class ExtensionGithubApi {
         return extensionsWithUpdate
     }
 
-    private fun parseResponse(json: JsonArray): List<Extension.Available> {
-        return json
-            .filter { element ->
-                val versionName = element.jsonObject["version"]!!.jsonPrimitive.content
-                val libVersion = versionName.substringBeforeLast('.').toDouble()
+    private fun List<ExtensionJsonObject>.toExtensions(): List<Extension.Available> {
+        return this
+            .filter {
+                val libVersion = it.version.substringBeforeLast('.').toDouble()
                 libVersion >= ExtensionLoader.LIB_VERSION_MIN && libVersion <= ExtensionLoader.LIB_VERSION_MAX
             }
-            .map { element ->
-                val name = element.jsonObject["name"]!!.jsonPrimitive.content.substringAfter("Tachiyomi: ")
-                val pkgName = element.jsonObject["pkg"]!!.jsonPrimitive.content
-                val apkName = element.jsonObject["apk"]!!.jsonPrimitive.content
-                val versionName = element.jsonObject["version"]!!.jsonPrimitive.content
-                val versionCode = element.jsonObject["code"]!!.jsonPrimitive.long
-                val lang = element.jsonObject["lang"]!!.jsonPrimitive.content
-                val nsfw = element.jsonObject["nsfw"]!!.jsonPrimitive.int == 1
-                val icon = "${REPO_URL_PREFIX}icon/${apkName.replace(".apk", ".png")}"
-
-                Extension.Available(name, pkgName, versionName, versionCode, lang, nsfw, apkName, icon)
+            .map {
+                Extension.Available(
+                    name = it.name.substringAfter("Tachiyomi: "),
+                    pkgName = it.pkg,
+                    versionName = it.version,
+                    versionCode = it.code,
+                    lang = it.lang,
+                    isNsfw = it.nsfw == 1,
+                    apkName = it.apk,
+                    iconUrl = "${REPO_URL_PREFIX}icon/${it.apk.replace(".apk", ".png")}"
+                )
             }
     }
 
@@ -83,3 +78,14 @@ internal class ExtensionGithubApi {
 }
 
 private const val REPO_URL_PREFIX = "https://raw.githubusercontent.com/tachiyomiorg/tachiyomi-extensions/repo/"
+
+@Serializable
+private data class ExtensionJsonObject(
+    val name: String,
+    val pkg: String,
+    val apk: String,
+    val version: String,
+    val code: Long,
+    val lang: String,
+    val nsfw: Int,
+)

+ 3 - 7
app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt

@@ -14,7 +14,7 @@ import rx.Observable
 import rx.Producer
 import rx.Subscription
 import uy.kohesive.injekt.Injekt
-import uy.kohesive.injekt.api.fullType
+import uy.kohesive.injekt.api.get
 import java.io.IOException
 import java.util.concurrent.atomic.AtomicBoolean
 import kotlin.coroutines.resumeWithException
@@ -116,10 +116,6 @@ fun OkHttpClient.newCallWithProgress(request: Request, listener: ProgressListene
 }
 
 inline fun <reified T> Response.parseAs(): T {
-    // Avoiding Injekt.get<Json>() due to compiler issues
-    val json = Injekt.getInstance<Json>(fullType<Json>().type)
-    this.use {
-        val responseBody = it.body?.string().orEmpty()
-        return json.decodeFromString(responseBody)
-    }
+    val responseBody = this.body?.string().orEmpty()
+    return Injekt.get<Json>().decodeFromString(responseBody)
 }