feat: add filtering for unavailable future seasons

This commit is contained in:
tapframe 2026-04-18 22:29:37 +05:30
parent 4609398b59
commit 8020e15a40
3 changed files with 30 additions and 1 deletions

View file

@ -21,6 +21,26 @@ internal fun MetaDetails.sortedPlayableEpisodes(): List<MetaVideo> =
.filter { it.season != null || it.episode != null }
.sortedWith(metaVideoSeasonEpisodeComparator)
internal fun List<MetaVideo>.filterUnavailableFutureSeasons(
todayIsoDate: String,
): List<MetaVideo> {
val unavailableSeasons = groupBy { episode -> normalizeSeasonNumber(episode.season) }
.filter { (seasonNumber, episodes) ->
if (seasonNumber <= 0) return@filter false
val firstEpisode = episodes.minWithOrNull(
compareBy<MetaVideo>({ 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()

View file

@ -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<HomeContinueWatchingCandidate> { 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")

View file

@ -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<ContinueWatchingItem>,
@ -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,