Files
huobao-drama/domain/models/timeline.go
Connor 9600fc542c init
2026-01-12 13:17:11 +08:00

179 lines
5.9 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
)
type Timeline struct {
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
DramaID uint `gorm:"not null;index" json:"drama_id"`
Drama Drama `gorm:"foreignKey:DramaID" json:"drama,omitempty"`
EpisodeID *uint `gorm:"index" json:"episode_id,omitempty"`
Episode *Episode `gorm:"foreignKey:EpisodeID" json:"episode,omitempty"`
Name string `gorm:"type:varchar(200);not null" json:"name"`
Description *string `gorm:"type:text" json:"description,omitempty"`
Duration int `gorm:"default:0" json:"duration"`
FPS int `gorm:"default:30" json:"fps"`
Resolution *string `gorm:"type:varchar(50)" json:"resolution,omitempty"`
Status TimelineStatus `gorm:"type:varchar(20);not null;default:'draft';index" json:"status"`
Tracks []TimelineTrack `gorm:"foreignKey:TimelineID" json:"tracks,omitempty"`
}
type TimelineStatus string
const (
TimelineStatusDraft TimelineStatus = "draft"
TimelineStatusEditing TimelineStatus = "editing"
TimelineStatusCompleted TimelineStatus = "completed"
TimelineStatusExporting TimelineStatus = "exporting"
)
func (Timeline) TableName() string {
return "timelines"
}
type TimelineTrack struct {
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
TimelineID uint `gorm:"not null;index" json:"timeline_id"`
Timeline Timeline `gorm:"foreignKey:TimelineID" json:"-"`
Name string `gorm:"type:varchar(100);not null" json:"name"`
Type TrackType `gorm:"type:varchar(20);not null" json:"type"`
Order int `gorm:"not null;default:0" json:"order"`
IsLocked bool `gorm:"default:false" json:"is_locked"`
IsMuted bool `gorm:"default:false" json:"is_muted"`
Volume *int `gorm:"default:100" json:"volume,omitempty"`
Clips []TimelineClip `gorm:"foreignKey:TrackID" json:"clips,omitempty"`
}
type TrackType string
const (
TrackTypeVideo TrackType = "video"
TrackTypeAudio TrackType = "audio"
TrackTypeText TrackType = "text"
)
func (TimelineTrack) TableName() string {
return "timeline_tracks"
}
type TimelineClip struct {
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
TrackID uint `gorm:"not null;index" json:"track_id"`
Track TimelineTrack `gorm:"foreignKey:TrackID" json:"-"`
AssetID *uint `gorm:"index" json:"asset_id,omitempty"`
Asset Asset `gorm:"foreignKey:AssetID" json:"asset,omitempty"`
StoryboardID *uint `gorm:"index" json:"storyboard_id,omitempty"`
Storyboard *Storyboard `gorm:"foreignKey:StoryboardID" json:"storyboard,omitempty"`
Name string `gorm:"type:varchar(200)" json:"name"`
StartTime int `gorm:"not null" json:"start_time"`
EndTime int `gorm:"not null" json:"end_time"`
Duration int `gorm:"not null" json:"duration"`
TrimStart *int `json:"trim_start,omitempty"`
TrimEnd *int `json:"trim_end,omitempty"`
Speed *float64 `gorm:"default:1.0" json:"speed,omitempty"`
Volume *int `json:"volume,omitempty"`
IsMuted bool `gorm:"default:false" json:"is_muted"`
FadeIn *int `json:"fade_in,omitempty"`
FadeOut *int `json:"fade_out,omitempty"`
TransitionIn *uint `gorm:"index" json:"transition_in_id,omitempty"`
TransitionOut *uint `gorm:"index" json:"transition_out_id,omitempty"`
InTransition ClipTransition `gorm:"foreignKey:TransitionIn" json:"in_transition,omitempty"`
OutTransition ClipTransition `gorm:"foreignKey:TransitionOut" json:"out_transition,omitempty"`
Effects []ClipEffect `gorm:"foreignKey:ClipID" json:"effects,omitempty"`
}
func (TimelineClip) TableName() string {
return "timeline_clips"
}
type ClipTransition struct {
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
Type TransitionType `gorm:"type:varchar(50);not null" json:"type"`
Duration int `gorm:"not null;default:500" json:"duration"`
Easing *string `gorm:"type:varchar(50)" json:"easing,omitempty"`
Config map[string]interface{} `gorm:"serializer:json" json:"config,omitempty"`
}
type TransitionType string
const (
TransitionTypeFade TransitionType = "fade"
TransitionTypeCrossFade TransitionType = "crossfade"
TransitionTypeSlide TransitionType = "slide"
TransitionTypeWipe TransitionType = "wipe"
TransitionTypeZoom TransitionType = "zoom"
TransitionTypeDissolve TransitionType = "dissolve"
)
func (ClipTransition) TableName() string {
return "clip_transitions"
}
type ClipEffect struct {
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
ClipID uint `gorm:"not null;index" json:"clip_id"`
Clip TimelineClip `gorm:"foreignKey:ClipID" json:"-"`
Type EffectType `gorm:"type:varchar(50);not null" json:"type"`
Name string `gorm:"type:varchar(100)" json:"name"`
IsEnabled bool `gorm:"default:true" json:"is_enabled"`
Order int `gorm:"default:0" json:"order"`
Config map[string]interface{} `gorm:"serializer:json" json:"config,omitempty"`
}
type EffectType string
const (
EffectTypeFilter EffectType = "filter"
EffectTypeColor EffectType = "color"
EffectTypeBlur EffectType = "blur"
EffectTypeBrightness EffectType = "brightness"
EffectTypeContrast EffectType = "contrast"
EffectTypeSaturation EffectType = "saturation"
)
func (ClipEffect) TableName() string {
return "clip_effects"
}