Opt: update db model

pull/21/head
zijiren233 2 years ago
parent 12ef9a97c0
commit a749263f62

@ -4,24 +4,24 @@ import "gorm.io/gorm"
type Movie struct { type Movie struct {
gorm.Model gorm.Model
Position uint `gorm:"not null"` Position uint `gorm:"not null"`
RoomID uint `gorm:"not null;index"` RoomID uint `gorm:"not null;index"`
Room Room `gorm:"foreignKey:RoomID"` Room Room `gorm:"foreignKey:RoomID"`
MovieInfo `gorm:"embedded"` MovieInfo
} }
type MovieInfo struct { type MovieInfo struct {
BaseMovieInfo `gorm:"embedded"` BaseMovieInfo
PullKey string `gorm:"varchar(128)" json:"pullKey"` PullKey string `json:"pullKey"`
CreatorID uint `gorm:"not null;index" json:"creatorId"` CreatorID uint `gorm:"not null;index" json:"creatorId"`
} }
type BaseMovieInfo struct { type BaseMovieInfo struct {
Url string `gorm:"varchar(4096)" json:"url"` Url string `json:"url"`
Name string `gorm:"not null;varchar(256)" json:"name"` Name string `gorm:"not null" json:"name"`
Live bool `json:"live"` Live bool `json:"live"`
Proxy bool `json:"proxy"` Proxy bool `json:"proxy"`
RtmpSource bool `json:"rtmpSource"` RtmpSource bool `json:"rtmpSource"`
Type string `gorm:"varchar(32)" json:"type"` Type string `json:"type"`
Headers map[string]string `gorm:"serializer:fastjson" json:"headers"` Headers map[string]string `gorm:"serializer:fastjson" json:"headers"`
} }

@ -8,7 +8,7 @@ import (
type Room struct { type Room struct {
gorm.Model gorm.Model
Name string `gorm:"not null;uniqueIndex;varchar(32)"` Name string `gorm:"not null;uniqueIndex"`
Setting Setting
CreatorID uint `gorm:"index"` CreatorID uint `gorm:"index"`
Creator User `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"` Creator User `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`

@ -8,7 +8,7 @@ import (
type User struct { type User struct {
gorm.Model gorm.Model
Username string `gorm:"not null;uniqueIndex;varchar(32)"` Username string `gorm:"not null;uniqueIndex"`
HashedPassword []byte HashedPassword []byte
GroupUserRelations []RoomUserRelation `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` GroupUserRelations []RoomUserRelation `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
Movies []Movie `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"` Movies []Movie `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`

@ -27,6 +27,7 @@ import (
type Room struct { type Room struct {
model.Room model.Room
uuid uuid.UUID
version uint32 version uint32
current *current current *current
rtmpa *rtmps.App rtmpa *rtmps.App
@ -52,8 +53,8 @@ func (r *Room) LazyInit() (err error) {
} }
for _, m := range ms { for _, m := range ms {
if err = r.initMovie(m); err != nil { if err = r.initMovie(m); err != nil {
log.Errorf("failed to init movie: %s", err.Error()) log.Errorf("lazy init room %d movie %d failed: %s", r.ID, m.ID, err.Error())
return DeleteMovieByID(r.ID, m.ID)
} }
} }
}) })
@ -147,7 +148,7 @@ func (r *Room) initMovie(movie *model.Movie) error {
return errors.New("rtmp is not enabled") return errors.New("rtmp is not enabled")
} }
if movie.PullKey == "" { if movie.PullKey == "" {
movie.PullKey = uuid.New().String() movie.PullKey = uuid.NewString()
} }
_, err := r.rtmpa.NewChannel(movie.PullKey) _, err := r.rtmpa.NewChannel(movie.PullKey)
if err != nil { if err != nil {
@ -163,7 +164,7 @@ func (r *Room) initMovie(movie *model.Movie) error {
} }
switch u.Scheme { switch u.Scheme {
case "rtmp": case "rtmp":
movie.PullKey = uuid.NewMD5(uuid.NameSpaceURL, []byte(movie.Url)).String() movie.PullKey = uuid.NewMD5(r.uuid, []byte(movie.Url)).String()
c, err := r.rtmpa.NewChannel(movie.PullKey) c, err := r.rtmpa.NewChannel(movie.PullKey)
if err != nil { if err != nil {
return err return err
@ -186,7 +187,10 @@ func (r *Room) initMovie(movie *model.Movie) error {
} }
}() }()
case "http", "https": case "http", "https":
movie.PullKey = uuid.NewMD5(uuid.NameSpaceURL, []byte(movie.Url)).String() if movie.Type != "flv" {
return errors.New("only flv is supported")
}
movie.PullKey = uuid.NewMD5(r.uuid, []byte(movie.Url)).String()
c, err := r.rtmpa.NewChannel(movie.PullKey) c, err := r.rtmpa.NewChannel(movie.PullKey)
if err != nil { if err != nil {
return err return err
@ -228,7 +232,7 @@ func (r *Room) initMovie(movie *model.Movie) error {
if u.Scheme != "http" && u.Scheme != "https" { if u.Scheme != "http" && u.Scheme != "https" {
return errors.New("unsupported scheme") return errors.New("unsupported scheme")
} }
movie.PullKey = uuid.NewMD5(uuid.NameSpaceURL, []byte(movie.Url)).String() movie.PullKey = uuid.NewMD5(r.uuid, []byte(movie.Url)).String()
case !movie.Live && !movie.Proxy, movie.Live && !movie.Proxy && !movie.RtmpSource: case !movie.Live && !movie.Proxy, movie.Live && !movie.Proxy && !movie.RtmpSource:
u, err := url.Parse(movie.Url) u, err := url.Parse(movie.Url)
if err != nil { if err != nil {

@ -3,12 +3,15 @@ package op
import ( import (
"errors" "errors"
"math/rand" "math/rand"
"strconv"
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/google/uuid"
"github.com/synctv-org/synctv/internal/db" "github.com/synctv-org/synctv/internal/db"
"github.com/synctv-org/synctv/internal/model" "github.com/synctv-org/synctv/internal/model"
"github.com/zijiren233/gencontainer/rwmap" "github.com/zijiren233/gencontainer/rwmap"
"github.com/zijiren233/stream"
) )
var roomCache rwmap.RWMap[uint, *Room] var roomCache rwmap.RWMap[uint, *Room]
@ -32,6 +35,7 @@ func WithVersion(version uint32) RoomConf {
func initRoom(room *model.Room, conf ...RoomConf) (*Room, error) { func initRoom(room *model.Room, conf ...RoomConf) (*Room, error) {
r := &Room{ r := &Room{
Room: *room, Room: *room,
uuid: uuid.NewMD5(uuid.NameSpaceURL, stream.StringToBytes(strconv.Itoa(int(room.ID)))),
lastActive: time.Now().UnixMilli(), lastActive: time.Now().UnixMilli(),
version: rand.Uint32(), version: rand.Uint32(),
current: newCurrent(), current: newCurrent(),

Loading…
Cancel
Save