diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolver.kt index 8b30b1d7..4fa7f3d8 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolver.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolver.kt @@ -21,6 +21,26 @@ internal fun MetaDetails.sortedPlayableEpisodes(): List = .filter { it.season != null || it.episode != null } .sortedWith(metaVideoSeasonEpisodeComparator) +internal fun List.filterUnavailableFutureSeasons( + todayIsoDate: String, +): List { + val unavailableSeasons = groupBy { episode -> normalizeSeasonNumber(episode.season) } + .filter { (seasonNumber, episodes) -> + if (seasonNumber <= 0) return@filter false + val firstEpisode = episodes.minWithOrNull( + compareBy({ it.episode ?: Int.MAX_VALUE }, { it.released.orEmpty() }), + ) ?: return@filter false + !isReleasedBy(todayIsoDate = todayIsoDate, releasedDate = firstEpisode.released) + } + .keys + + return if (unavailableSeasons.isEmpty()) { + this + } else { + filter { episode -> normalizeSeasonNumber(episode.season) !in unavailableSeasons } + } +} + internal fun MetaDetails.firstPlayableEpisode(): MetaVideo? = sortedPlayableEpisodes().firstOrNull() diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt index 5611f1c5..75a07bd4 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt @@ -20,6 +20,7 @@ import com.nuvio.app.core.ui.NuvioScreen import com.nuvio.app.core.ui.NuvioNetworkOfflineCard import com.nuvio.app.features.addons.AddonRepository import com.nuvio.app.features.details.MetaDetailsRepository +import com.nuvio.app.features.details.filterUnavailableFutureSeasons import com.nuvio.app.features.details.sortedPlayableEpisodes import com.nuvio.app.features.home.components.HomeCatalogRowSection import com.nuvio.app.features.home.components.HomeContinueWatchingSection @@ -568,6 +569,7 @@ internal fun buildHomeContinueWatchingItems( compareByDescending { it.lastUpdatedEpochMs } .thenByDescending { it.isProgressEntry }, ) + .filter { candidate -> candidate.item.shouldDisplayInContinueWatching() } .distinctBy { it.item.videoId } .map(HomeContinueWatchingCandidate::item) } @@ -627,6 +629,7 @@ private fun com.nuvio.app.features.details.MetaDetails.nextReleasedEpisodeAfter( } .drop(1) .filter { episode -> (episode.season ?: 0) > 0 } + .filterUnavailableFutureSeasons(todayIsoDate = todayIsoDate) if (showUnairedNextUp) { return ordered.firstOrNull() @@ -637,6 +640,9 @@ private fun com.nuvio.app.features.details.MetaDetails.nextReleasedEpisodeAfter( } } +private fun ContinueWatchingItem.shouldDisplayInContinueWatching(): Boolean = + isNextUp || progressFraction < 0.995f + private fun CachedNextUpItem.toContinueWatchingItem(): ContinueWatchingItem? { val subtitle = buildString { append("Up Next") diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt index 80ef13b9..c4281808 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt @@ -44,6 +44,9 @@ import com.nuvio.app.features.watchprogress.ContinueWatchingItem import com.nuvio.app.features.watchprogress.ContinueWatchingSectionStyle import kotlin.math.roundToInt +private fun continueWatchingProgressPercent(progressFraction: Float): Int = + (progressFraction * 100f).roundToInt().coerceIn(1, 99) + @Composable internal fun HomeContinueWatchingSection( items: List, @@ -361,7 +364,7 @@ private fun ContinueWatchingWideCard( trackColor = Color.White.copy(alpha = 0.10f), ) Text( - text = "${(item.progressFraction * 100).roundToInt()}% watched", + text = "${continueWatchingProgressPercent(item.progressFraction)}% watched", style = MaterialTheme.typography.labelSmall.copy( fontSize = layout.progressLabelSize, fontWeight = FontWeight.Medium,