* Refine playback session handling and API responses * fix(watchstate): harden completed-history visibility
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package catalog
|
|
|
|
import (
|
|
"github.com/Silo-Server/silo-server/internal/models"
|
|
"github.com/Silo-Server/silo-server/internal/userstore"
|
|
)
|
|
|
|
// EpisodeRollupUserData computes aggregate watch state for a season or series
|
|
// from pre-fetched per-episode progress. Completed history should already be
|
|
// folded into progressMap by the caller's userstore helper.
|
|
func EpisodeRollupUserData(episodes []*models.Episode, progressMap map[string]userstore.WatchProgress) *SeasonUserData {
|
|
if len(episodes) == 0 {
|
|
return &SeasonUserData{}
|
|
}
|
|
|
|
watchedCount := 0
|
|
inProgressCount := 0
|
|
totalEpisodes := 0
|
|
for _, ep := range episodes {
|
|
if ep == nil {
|
|
continue
|
|
}
|
|
totalEpisodes++
|
|
progress, ok := progressMap[ep.ContentID]
|
|
if ok && progress.Completed {
|
|
watchedCount++
|
|
continue
|
|
}
|
|
if ok && progress.PositionSeconds > 0 {
|
|
inProgressCount++
|
|
}
|
|
}
|
|
if totalEpisodes == 0 {
|
|
return &SeasonUserData{}
|
|
}
|
|
|
|
unplayedCount := totalEpisodes - watchedCount
|
|
return &SeasonUserData{
|
|
WatchedCount: watchedCount,
|
|
UnplayedCount: unplayedCount,
|
|
InProgressCount: inProgressCount,
|
|
Played: watchedCount == totalEpisodes,
|
|
}
|
|
}
|