mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-04-27 03:22:53 +00:00
feat: enhance continue watching logic to deduplicate series and keep latest episode
This commit is contained in:
parent
a1eb644369
commit
647b3e3203
2 changed files with 31 additions and 2 deletions
|
|
@ -63,7 +63,13 @@ internal fun List<WatchProgressEntry>.resumeEntryForSeries(metaId: String): Watc
|
|||
|
||||
internal fun List<WatchProgressEntry>.continueWatchingEntries(
|
||||
limit: Int = ContinueWatchingLimit,
|
||||
): List<WatchProgressEntry> =
|
||||
filterNot { it.isCompleted }
|
||||
): List<WatchProgressEntry> {
|
||||
val inProgress = filterNot { it.isCompleted }
|
||||
val (episodes, nonEpisodes) = inProgress.partition { it.isEpisode }
|
||||
val latestPerSeries = episodes
|
||||
.sortedByDescending { it.lastUpdatedEpochMs }
|
||||
.distinctBy { it.parentMetaId }
|
||||
return (nonEpisodes + latestPerSeries)
|
||||
.sortedByDescending { it.lastUpdatedEpochMs }
|
||||
.take(limit)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,6 +71,29 @@ class WatchProgressRulesTest {
|
|||
assertEquals("video-6", result.last().videoId)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `continue watching deduplicates series keeping latest episode per show`() {
|
||||
val ep1 = entry(videoId = "show:1:1", parentMetaId = "show", seasonNumber = 1, episodeNumber = 1, lastUpdatedEpochMs = 10L)
|
||||
val ep2 = entry(videoId = "show:1:2", parentMetaId = "show", seasonNumber = 1, episodeNumber = 2, lastUpdatedEpochMs = 20L)
|
||||
val movie = entry(videoId = "movie-1", parentMetaId = "movie-1", lastUpdatedEpochMs = 15L)
|
||||
|
||||
val result = listOf(ep1, ep2, movie).continueWatchingEntries()
|
||||
|
||||
assertEquals(2, result.size)
|
||||
assertEquals("show:1:2", result.first().videoId)
|
||||
assertEquals("movie-1", result.last().videoId)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `continue watching keeps multiple movies without deduplication`() {
|
||||
val m1 = entry(videoId = "movie-a", parentMetaId = "movie-a", lastUpdatedEpochMs = 10L)
|
||||
val m2 = entry(videoId = "movie-b", parentMetaId = "movie-b", lastUpdatedEpochMs = 20L)
|
||||
|
||||
val result = listOf(m1, m2).continueWatchingEntries()
|
||||
|
||||
assertEquals(2, result.size)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `build playback video id uses season and episode when present`() {
|
||||
assertEquals("show:1:2", buildPlaybackVideoId(parentMetaId = "show", seasonNumber = 1, episodeNumber = 2, fallbackVideoId = "fallback"))
|
||||
|
|
|
|||
Loading…
Reference in a new issue