diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt index 1973d4d6c2a..b01f6e07e27 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt @@ -103,9 +103,7 @@ object InAppUpdater { !rel.prerelease }.sortedWith(compareBy { release -> release.assets.firstOrNull { it.contentType == "application/vnd.android.package-archive" }?.name?.let { it1 -> - versionRegex.find( - it1 - )?.groupValues?.let { + versionRegex.find(it1)?.groupValues?.let { it[3].toInt() * 100_000_000 + it[4].toInt() * 10_000 + it[5].toInt() } } diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/AppUtils.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/AppUtils.kt index 96dda5b2599..5cc91b6d64f 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/AppUtils.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/AppUtils.kt @@ -1,5 +1,6 @@ package com.lagradost.cloudstream3.utils +import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.InternalAPI import com.lagradost.cloudstream3.json @@ -9,6 +10,7 @@ import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.KSerializer import kotlinx.serialization.SerializationException +import kotlinx.serialization.serializer import kotlinx.serialization.serializerOrNull import kotlin.reflect.KClass @@ -21,7 +23,10 @@ object AppUtils { } inline fun parseJson(value: String): T { - return parseJson(value, T::class) + // serializer() preserves full generic type info (e.g. List) + // and must be resolved here while T is still reified, same for TypeReference + val serializer = try { serializer() } catch (_: Exception) { null } + return parseJson(value, T::class, serializer, object : TypeReference() {}) } @Deprecated( @@ -63,17 +68,28 @@ object AppUtils { } @InternalAPI - fun parseJson(value: String, kClass: KClass): T { + fun parseJson( + value: String, + kClass: KClass, + serializer: KSerializer? = null, + typeReference: TypeReference? = null, + ): T { // @Serializable generates a serializer at compile time; contextual serializers are // registered manually in serializersModule, we need both to support all cases - val serializer = kClass.serializerOrNull() ?: json.serializersModule.getContextual(kClass) - return if (serializer != null) { + val s = + serializer ?: kClass.serializerOrNull() ?: json.serializersModule.getContextual(kClass) + + // Prefer Kotlin Serialization over Jackson + if (s != null) { try { - json.decodeFromString(serializer, value) + return json.decodeFromString(s, value) } catch (e: SerializationException) { logError(e) - mapper.readValue(value, kClass.java) } + } + + return if (typeReference != null) { + mapper.readValue(value, typeReference) } else { mapper.readValue(value, kClass.java) }