fix: restore unaired next up episodes

This commit is contained in:
tapframe 2026-07-11 09:09:09 +05:30
parent 0112e33897
commit de4e269879
3 changed files with 67 additions and 1 deletions

View file

@ -48,8 +48,15 @@ internal fun shouldSurfaceNextEpisode(
showUnairedNextUp: Boolean,
available: Boolean = true,
): Boolean {
if (!available) return false
val isSeasonRollover = normalizeSeasonNumber(candidateSeasonNumber) != normalizeSeasonNumber(watchedSeasonNumber)
if (!available) {
val daysUntilRelease = daysUntilExplicitRelease(
todayIsoDate = todayIsoDate,
releasedDate = releasedDate,
) ?: return false
if (!showUnairedNextUp || daysUntilRelease <= 0) return false
return !isSeasonRollover || daysUntilRelease <= UpcomingNextSeasonWindowDays
}
if (!isSeasonRollover) {
if (showUnairedNextUp) return true
return isReleasedBy(todayIsoDate = todayIsoDate, releasedDate = releasedDate)

View file

@ -141,6 +141,26 @@ class SeriesContinuityTest {
assertNull(nextEpisode)
}
@Test
fun nextReleasedEpisodeAfter_surfaces_dated_unavailable_upcoming_episode_when_enabled() {
val episodes = listOf(
WatchingReleasedEpisode(videoId = "s1e1", seasonNumber = 1, episodeNumber = 1, title = "Episode 1", releasedDate = "2026-07-01"),
WatchingReleasedEpisode(videoId = "s1e2", seasonNumber = 1, episodeNumber = 2, title = "Episode 2", releasedDate = "2026-07-12", available = false),
)
val nextEpisode = nextReleasedEpisodeAfter(
content = show,
episodes = episodes,
seasonNumber = 1,
episodeNumber = 1,
todayIsoDate = "2026-07-05",
showUnairedNextUp = true,
)
assertNotNull(nextEpisode)
assertEquals("s1e2", nextEpisode.videoId)
}
@Test
fun decideSeriesPrimaryAction_falls_back_to_specials_when_no_main_season() {
val specialsOnly = listOf(

View file

@ -2,6 +2,7 @@ package com.nuvio.app.features.watching.domain
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
@ -49,6 +50,44 @@ class WatchingPoliciesTest {
assertTrue(result)
}
@Test
fun shouldSurfaceNextEpisode_allows_dated_unavailable_upcoming_episode_only_when_enabled() {
assertTrue(
shouldSurfaceNextEpisode(
watchedSeasonNumber = 1,
candidateSeasonNumber = 1,
todayIsoDate = "2026-07-05",
releasedDate = "2026-07-12",
showUnairedNextUp = true,
available = false,
),
)
assertFalse(
shouldSurfaceNextEpisode(
watchedSeasonNumber = 1,
candidateSeasonNumber = 1,
todayIsoDate = "2026-07-05",
releasedDate = "2026-07-12",
showUnairedNextUp = false,
available = false,
),
)
}
@Test
fun shouldSurfaceNextEpisode_keeps_unavailable_phantom_episode_hidden() {
assertFalse(
shouldSurfaceNextEpisode(
watchedSeasonNumber = 1,
candidateSeasonNumber = 3,
todayIsoDate = "2026-07-05",
releasedDate = null,
showUnairedNextUp = true,
available = false,
),
)
}
@Test
fun latestCompletedSeriesEpisode_prefers_newer_manual_watch_marker() {
val latestCompleted = latestCompletedSeriesEpisode(