Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -93,19 +93,17 @@ object InAppUpdater {
private suspend fun Activity.getReleaseUpdate(): Update {
val url = "https://api.github.com/repos/$GITHUB_USER_NAME/$GITHUB_REPO/releases"
val headers = mapOf("Accept" to "application/vnd.github.v3+json")
val response = parseJson<Array<GithubRelease>>(
Comment thread
Luna712 marked this conversation as resolved.
val response = parseJson<List<GithubRelease>>(
app.get(url, headers = headers).text
).toList()
)

val versionRegex = Regex("""(.*?((\d+)\.(\d+)\.(\d+))\.apk)""")
val versionRegexLocal = Regex("""(.*?((\d+)\.(\d+)\.(\d+)).*)""")
val foundList = response.filter { rel ->
!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()
}
}
Expand Down Expand Up @@ -150,9 +148,9 @@ object InAppUpdater {
"https://api.github.com/repos/$GITHUB_USER_NAME/$GITHUB_REPO/git/ref/tags/pre-release"
val releaseUrl = "https://api.github.com/repos/$GITHUB_USER_NAME/$GITHUB_REPO/releases"
val headers = mapOf("Accept" to "application/vnd.github.v3+json")
val response = parseJson<Array<GithubRelease>>(
val response = parseJson<List<GithubRelease>>(
app.get(releaseUrl, headers = headers).text
).toList()
)

val found = response.lastOrNull { rel ->
rel.prerelease || rel.tagName == "pre-release"
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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

Expand All @@ -21,7 +23,10 @@ object AppUtils {
}

inline fun <reified T : Any> parseJson(value: String): T {
return parseJson(value, T::class)
// serializer<T>() preserves full generic type info (e.g. List<DataClass>)
// and must be resolved here while T is still reified, same for TypeReference
val serializer = try { serializer<T>() } catch (_: SerializationException) { null }
Comment thread
Luna712 marked this conversation as resolved.
Outdated
return parseJson(value, T::class, serializer, object : TypeReference<T>() {})
}

@Deprecated(
Expand Down Expand Up @@ -63,19 +68,26 @@ object AppUtils {
}

@InternalAPI
Comment thread
Luna712 marked this conversation as resolved.
fun <T : Any> parseJson(value: String, kClass: KClass<T>): T {
fun <T : Any> parseJson(
value: String,
kClass: KClass<T>,
serializer: KSerializer<T>? = null,
typeReference: TypeReference<T>? = 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)
return if (s != null) {
try {
json.decodeFromString(serializer, value)
json.decodeFromString(s, value)
} catch (e: SerializationException) {
logError(e)
mapper.readValue(value, kClass.java)
if (typeReference != null) mapper.readValue(value, typeReference)
else mapper.readValue(value, kClass.java)
}
} else {
mapper.readValue(value, kClass.java)
if (typeReference != null) mapper.readValue(value, typeReference)
else mapper.readValue(value, kClass.java)
}
}
}