From 3dad199b6fbb6c422361f74e681ac18e3646dad0 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Mon, 13 Apr 2026 00:38:10 +0530 Subject: [PATCH] feat: fix meta retry logic --- .../features/details/MetaDetailsRepository.kt | 11 ++++++----- .../app/features/details/MetaDetailsScreen.kt | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt index b7d64661..ad11531c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt @@ -217,12 +217,13 @@ object MetaDetailsRepository { id: String, includeMdbList: Boolean, ): MetaDetails? { + val baseUrl = manifest.transportUrl + .substringBefore("?") + .removeSuffix("/manifest.json") + val url = "$baseUrl/meta/$type/$id.json" + return try { TmdbSettingsRepository.ensureLoaded() - val baseUrl = manifest.transportUrl - .substringBefore("?") - .removeSuffix("/manifest.json") - val url = "$baseUrl/meta/$type/$id.json" log.d { "Fetching meta from: $url" } val payload = httpGetText(url) log.d { "Raw payload length=${payload.length}, first 500 chars: ${payload.take(500)}" } @@ -254,7 +255,7 @@ object MetaDetailsRepository { enriched } catch (e: Throwable) { if (e is CancellationException) throw e - log.e(e) { "Failed to fetch/parse meta from ${manifest.transportUrl}" } + log.e(e) { "Failed to fetch/parse meta from $url (manifest=${manifest.transportUrl})" } null } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt index ebe5c1c3..6b7de178 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt @@ -27,6 +27,7 @@ import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme @@ -140,7 +141,7 @@ fun MetaDetailsScreen( PlayerSettingsRepository.ensureLoaded() PlayerSettingsRepository.uiState }.collectAsStateWithLifecycle() - val needsFreshLoad = displayedMeta == null && !uiState.isLoading + var autoLoadAttempted by remember(type, id) { mutableStateOf(false) } var selectedEpisodeForActions by remember(type, id) { mutableStateOf(null) } val commentsEnabled by remember { TraktCommentsSettings.ensureLoaded() @@ -186,8 +187,11 @@ fun MetaDetailsScreen( isCommentsLoading = false } - LaunchedEffect(type, id, needsFreshLoad) { - if (needsFreshLoad) MetaDetailsRepository.load(type, id) + LaunchedEffect(type, id, displayedMeta, uiState.isLoading, autoLoadAttempted) { + if (!autoLoadAttempted && displayedMeta == null && !uiState.isLoading) { + autoLoadAttempted = true + MetaDetailsRepository.load(type, id) + } } Box( @@ -221,6 +225,12 @@ fun MetaDetailsScreen( style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) + Spacer(modifier = Modifier.height(8.dp)) + Button( + onClick = { MetaDetailsRepository.load(type, id) }, + ) { + Text("Retry") + } } }