From e5581918cd79d59484c2ce5199c7ded46fb7e33a Mon Sep 17 00:00:00 2001 From: KhooLy <73142442+KhooLy@users.noreply.github.com> Date: Thu, 16 Jul 2026 00:36:08 +0300 Subject: [PATCH] Migrate Meta/MetaDetail models from Gson to kotlinx.serialization Gson is JVM-only and can't live in shared commonMain, which was the real reason Meta/MetaDetail/Video/CastMember/DetailTrailer were stuck in the Android-only app module. Ports the existing JsonElement-tree-based custom parsing (flexible alternate-key extraction, free-form cast/trailer JSON tolerance) to kotlinx.serialization's equivalent JsonObject/JsonElement API, using @JsonNames for simple alternate keys and custom KSerializers for CastMember/DetailTrailer/MetaDetail where the existing Gson deserializers did manual extraction. StremioAddonResourceClient now parses addon catalog/meta responses via kotlinx.serialization (stremioJson) instead of Gson for these types; Gson stays in place for Stream/SubtitleData, which are out of scope here. StremioService.getMetaDetail now returns the raw response body instead of relying on Retrofit's automatic (Gson-based) conversion, since the models it returns no longer carry Gson annotations. Verified on-device: addon catalog list parsing (Home rows), billboard, and meta detail (title/year/runtime/description) all render correctly against real addon responses. --- data/build.gradle.kts | 6 + .../com/fluxa/app/data/remote/MetaModels.kt | 525 ++++++++++-------- .../fluxa/app/data/remote/StremioModels.kt | 1 - .../fluxa/app/data/remote/StremioService.kt | 2 +- .../repository/StremioAddonResourceClient.kt | 43 +- .../app/data/repository/StremioRepository.kt | 11 +- 6 files changed, 349 insertions(+), 239 deletions(-) rename data/src/{main/java => commonMain/kotlin}/com/fluxa/app/data/remote/MetaModels.kt (50%) diff --git a/data/build.gradle.kts b/data/build.gradle.kts index cb760f4..737400b 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -4,6 +4,7 @@ plugins { alias(libs.plugins.fluxa.kmp.library) alias(libs.plugins.fluxa.android.hilt) alias(libs.plugins.ksp) + alias(libs.plugins.kotlin.serialization) } val localProperties = Properties().apply { @@ -43,6 +44,11 @@ kotlin { tvosSimulatorArm64() sourceSets { + commonMain { + dependencies { + implementation(libs.kotlinx.serialization.json) + } + } androidMain { kotlin.srcDir("src/main/java") dependencies { diff --git a/data/src/main/java/com/fluxa/app/data/remote/MetaModels.kt b/data/src/commonMain/kotlin/com/fluxa/app/data/remote/MetaModels.kt similarity index 50% rename from data/src/main/java/com/fluxa/app/data/remote/MetaModels.kt rename to data/src/commonMain/kotlin/com/fluxa/app/data/remote/MetaModels.kt index c7ad27c..90bde3c 100644 --- a/data/src/main/java/com/fluxa/app/data/remote/MetaModels.kt +++ b/data/src/commonMain/kotlin/com/fluxa/app/data/remote/MetaModels.kt @@ -1,14 +1,32 @@ package com.fluxa.app.data.remote -import com.google.gson.JsonDeserializer -import com.google.gson.JsonElement -import com.google.gson.JsonObject -import com.google.gson.annotations.JsonAdapter -import com.google.gson.annotations.SerializedName -import java.lang.reflect.Type +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonEncoder +import kotlinx.serialization.json.JsonNull +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.encodeToJsonElement +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put -data class MetaRating(val source: String, val value: Any?) +@Serializable +data class MetaRating(val source: String, val value: String?) +@Serializable data class AppExtras( val seasonPosters: List? = null, val certification: String? = null, @@ -16,85 +34,26 @@ data class AppExtras( val cast: List? = null ) -@JsonAdapter(MetaDetailDeserializer::class) -data class MetaDetail( +@Serializable +data class MetaLink(val name: String, val category: String, val url: String) + +@Serializable +data class Video( val id: String, - val type: String, - val name: String, - @JsonAdapter(StringListDeserializer::class) val genres: List?, - val poster: String?, - val background: String?, - val logo: String?, - val description: String?, - val releaseInfo: String?, - val released: String? = null, - val runtime: String?, - @SerializedName(value = "videos", alternate = ["episodes"]) val videos: List