From df7978bbd92f4c48904176c576336aaa7725db08 Mon Sep 17 00:00:00 2001 From: Alessandro Jean Date: Tue, 3 Nov 2020 15:53:51 -0300 Subject: [PATCH] Fix kotlinx.serialization issue on MANGA Plus (#4775) * Fix kotlinx.serialization issue on MANGA Plus. * Fix typo. * Downgrade kotlinx.serialization version to match main repo. --- src/all/mangaplus/build.gradle | 4 +-- .../extension/all/mangaplus/MangaPlus.kt | 34 +++++++------------ .../extension/all/mangaplus/MangaPlusApi.kt | 10 ++---- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/src/all/mangaplus/build.gradle b/src/all/mangaplus/build.gradle index d4f7b7b9e..c8037c6fc 100644 --- a/src/all/mangaplus/build.gradle +++ b/src/all/mangaplus/build.gradle @@ -6,12 +6,12 @@ ext { extName = 'MANGA Plus by SHUEISHA' pkgNameSuffix = 'all.mangaplus' extClass = '.MangaPlusFactory' - extVersionCode = 13 + extVersionCode = 14 libVersion = '1.2' } dependencies { - final serialization_version = '1.0.0-RC' + final serialization_version = '1.0.0' implementation "org.jetbrains.kotlinx:kotlinx-serialization-core:$serialization_version" implementation "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$serialization_version" } diff --git a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt index bbbbccab2..15a3540b8 100644 --- a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt +++ b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt @@ -58,7 +58,8 @@ abstract class MangaPlus( .build() private val protobufJs: String by lazy { - client.newCall(GET(PROTOBUFJS_CDN, headers)).execute().body()!!.string() + val request = GET(PROTOBUFJS_CDN, headers) + client.newCall(request).execute().body()!!.string() } private val gson: Gson by lazy { Gson() } @@ -427,44 +428,35 @@ abstract class MangaPlus( } private fun Response.asProto(): MangaPlusResponse { - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) return ProtoBuf.decodeFromByteArray(MangaPlusSerializer, body()!!.bytes()) - // Apparently, the version used of Kotlinx Serialization lib causes a crash - // on KitKat devices (see #1678). So, if the device is running KitKat or lower, - // we use the old method of parsing their API -- using ProtobufJS + Duktape + Gson. + // The kotlinx.serialization library eventually always have some issues with + // devices with Android version below Nougat. So, if the device is running Marshmallow + // or lower, the deserialization is done using ProtobufJS + Duktape + Gson. val bytes = body()!!.bytes() val messageBytes = "var BYTE_ARR = new Uint8Array([${bytes.joinToString()}]);" val res = Duktape.create().use { - it.set( - "helper", - DuktapeHelper::class.java, - object : DuktapeHelper { - override fun getProtobuf(): String = protobufJs - } - ) + // The current Kotlin version brokes Duktape's module feature, + // so we need to provide an workaround to prevent the usage of 'require'. + it.evaluate("var module = { exports: true };") + it.evaluate(protobufJs) it.evaluate(messageBytes + DECODE_SCRIPT) as String } - // The Json.parse method of the Kotlinx Serialization causes the app to crash too, - // so unfortunately we have to use Gson to deserialize. return gson.fromJson(res, MangaPlusResponse::class.java) } - private interface DuktapeHelper { - @Suppress("unused") - fun getProtobuf(): String - } - companion object { private const val API_URL = "https://jumpg-webapi.tokyo-cdn.com/api" - private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36" + private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36" private val HEX_GROUP = "(.{1,2})".toRegex() - private const val PROTOBUFJS_CDN = "https://cdn.rawgit.com/dcodeIO/protobuf.js/6.8.8/dist/light/protobuf.min.js" + private const val PROTOBUFJS_CDN = "https://cdn.jsdelivr.net/npm/protobufjs@6.10.1/dist/light/protobuf.js" private const val RESOLUTION_PREF_KEY = "imageResolution" private const val RESOLUTION_PREF_TITLE = "Image resolution" diff --git a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusApi.kt b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusApi.kt index c28a62d3d..a166950ad 100644 --- a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusApi.kt +++ b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusApi.kt @@ -123,16 +123,10 @@ data class MangaPage( @ProtoNumber(5) val encryptionKey: String? = null ) -// Used for the deserialization on KitKat devices. +// Used for the deserialization on older devices. const val DECODE_SCRIPT: String = """ - Duktape.modSearch = function(id) { - if (id == "protobufjs") - return helper.getProtobuf(); - throw new Error("Cannot find module: " + id); - } - - var protobuf = require("protobufjs"); + var protobuf = module.exports; var Root = protobuf.Root; var Type = protobuf.Type;