package models import "time" type Video struct { ID string Title string Description string CategoryIDs []int16 // CategoryNames is the same filing read by name rather than id. It is // filled only where a caller needs categories to be self-describing — // the catalogue announcement — and is empty elsewhere. CategoryNames []string Tags string FileName string StorageKey string MediaConvertJobID string Status VideoStatus PlaybackURL string SizeBytes int64 CreatedAt time.Time UpdatedAt time.Time } // VideoStatus is the transcoding lifecycle state of a video, stored verbatim // in videos.status. The set is closed on both sides: the database rejects // anything outside it via the videos_status_check constraint. Adding a state // means adding a constant here, widening that constraint in a new migration, // and extending the `enums` annotation on api.CompleteResponse.Status. type VideoStatus string const ( // VideoStatusProcessing is set when the MediaConvert job is queued. Every // video starts here, and nothing moves it on yet — see Known gaps. VideoStatusProcessing VideoStatus = "processing" // VideoStatusReady means transcoding finished and the output is in the // encoded bucket, reachable through CloudFront. VideoStatusReady VideoStatus = "ready" // VideoStatusFailed means the MediaConvert job ended in an error. VideoStatusFailed VideoStatus = "failed" ) func (s VideoStatus) String() string { return string(s) }