diff --git a/internal/op/current.go b/internal/op/current.go index 85d8b17..8cf8dad 100644 --- a/internal/op/current.go +++ b/internal/op/current.go @@ -22,9 +22,7 @@ func newCurrent() *current { return ¤t{ current: Current{ Status: newStatus(), - Movie: &Movie{ - Movie: &model.Movie{}, - }, + Movie: &Movie{}, }, } } @@ -62,10 +60,8 @@ func (c *current) SetMovie(movie *Movie, play bool) { c.lock.Lock() defer c.lock.Unlock() - if movie == nil || movie.Movie == nil { - c.current.Movie = &Movie{ - Movie: &model.Movie{}, - } + if movie == nil { + c.current.Movie = &Movie{} } else { c.current.Movie = movie } @@ -104,32 +100,32 @@ func (c *Current) Proto() *pb.Current { } if c.Movie != nil { current.Movie = &pb.MovieInfo{ - Id: c.Movie.ID, + Id: c.Movie.Movie.ID, Base: &pb.BaseMovieInfo{ - Url: c.Movie.Base.Url, - Name: c.Movie.Base.Name, - Live: c.Movie.Base.Live, - Proxy: c.Movie.Base.Proxy, - RtmpSource: c.Movie.Base.RtmpSource, - Type: c.Movie.Base.Type, - Headers: c.Movie.Base.Headers, + Url: c.Movie.Movie.Base.Url, + Name: c.Movie.Movie.Base.Name, + Live: c.Movie.Movie.Base.Live, + Proxy: c.Movie.Movie.Base.Proxy, + RtmpSource: c.Movie.Movie.Base.RtmpSource, + Type: c.Movie.Movie.Base.Type, + Headers: c.Movie.Movie.Base.Headers, }, - CreatedAt: c.Movie.CreatedAt.UnixMilli(), - Creator: GetUserName(c.Movie.CreatorID), + CreatedAt: c.Movie.Movie.CreatedAt.UnixMilli(), + Creator: GetUserName(c.Movie.Movie.CreatorID), } - if c.Movie.Base.VendorInfo.Vendor != "" { + if c.Movie.Movie.Base.VendorInfo.Vendor != "" { current.Movie.Base.VendorInfo = &pb.VendorInfo{ - Vendor: string(c.Movie.Base.VendorInfo.Vendor), - Shared: c.Movie.Base.VendorInfo.Shared, + Vendor: string(c.Movie.Movie.Base.VendorInfo.Vendor), + Shared: c.Movie.Movie.Base.VendorInfo.Shared, } - switch c.Movie.Base.VendorInfo.Vendor { + switch c.Movie.Movie.Base.VendorInfo.Vendor { case model.StreamingVendorBilibili: current.Movie.Base.VendorInfo.Bilibili = &pb.BilibiliVendorInfo{ - Bvid: c.Movie.Base.VendorInfo.Bilibili.Bvid, - Cid: c.Movie.Base.VendorInfo.Bilibili.Cid, - Epid: c.Movie.Base.VendorInfo.Bilibili.Epid, - Quality: c.Movie.Base.VendorInfo.Bilibili.Quality, - VendorName: c.Movie.Base.VendorInfo.Bilibili.VendorName, + Bvid: c.Movie.Movie.Base.VendorInfo.Bilibili.Bvid, + Cid: c.Movie.Movie.Base.VendorInfo.Bilibili.Cid, + Epid: c.Movie.Movie.Base.VendorInfo.Bilibili.Epid, + Quality: c.Movie.Movie.Base.VendorInfo.Bilibili.Quality, + VendorName: c.Movie.Movie.Base.VendorInfo.Bilibili.VendorName, } } } @@ -138,7 +134,7 @@ func (c *Current) Proto() *pb.Current { } func (c *Current) UpdateSeek() { - if c.Movie.Base.Live { + if c.Movie.Movie.Base.Live { c.Status.lastUpdate = time.Now() return } @@ -157,7 +153,7 @@ func (c *Current) setLiveStatus() Status { } func (c *Current) SetStatus(playing bool, seek, rate, timeDiff float64) Status { - if c.Movie.Base.Live { + if c.Movie.Movie.Base.Live { return c.setLiveStatus() } c.Status.Playing = playing @@ -172,7 +168,7 @@ func (c *Current) SetStatus(playing bool, seek, rate, timeDiff float64) Status { } func (c *Current) SetSeekRate(seek, rate, timeDiff float64) Status { - if c.Movie.Base.Live { + if c.Movie.Movie.Base.Live { return c.setLiveStatus() } if c.Status.Playing { @@ -186,7 +182,7 @@ func (c *Current) SetSeekRate(seek, rate, timeDiff float64) Status { } func (c *Current) SetSeek(seek, timeDiff float64) Status { - if c.Movie.Base.Live { + if c.Movie.Movie.Base.Live { return c.setLiveStatus() } if c.Status.Playing { diff --git a/internal/op/movie.go b/internal/op/movie.go index daa4808..1db9e2b 100644 --- a/internal/op/movie.go +++ b/internal/op/movie.go @@ -24,10 +24,10 @@ import ( ) type Movie struct { - *model.Movie + Movie model.Movie lock sync.RWMutex channel *rtmps.Channel - cache *BaseCache `gorm:"-:all" json:"-"` + cache *BaseCache } type BaseCache struct { @@ -94,13 +94,13 @@ func (m *Movie) init() (err error) { } switch { - case m.Base.Live && m.Base.RtmpSource: + case m.Movie.Base.Live && m.Movie.Base.RtmpSource: if m.channel == nil { m.channel = rtmps.NewChannel() m.channel.InitHlsPlayer(hls.WithGenTsNameFunc(genTsName)) } - case m.Base.Live && m.Base.Proxy: - u, err := url.Parse(m.Base.Url) + case m.Movie.Base.Live && m.Movie.Base.Proxy: + u, err := url.Parse(m.Movie.Base.Url) if err != nil { return err } @@ -115,7 +115,7 @@ func (m *Movie) init() (err error) { return } cli := core.NewConnClient() - if err = cli.Start(m.Base.Url, av.PLAY); err != nil { + if err = cli.Start(m.Movie.Base.Url, av.PLAY); err != nil { cli.Close() time.Sleep(time.Second) continue @@ -137,11 +137,11 @@ func (m *Movie) init() (err error) { return } r := resty.New().R() - for k, v := range m.Base.Headers { + for k, v := range m.Movie.Base.Headers { r.SetHeader(k, v) } // r.SetHeader("User-Agent", UserAgent) - resp, err := r.Get(m.Base.Url) + resp, err := r.Get(m.Movie.Base.Url) if err != nil { time.Sleep(time.Second) continue @@ -161,7 +161,7 @@ func (m *Movie) init() (err error) { } func (movie *Movie) Validate() error { - m := movie.Base + m := movie.Movie.Base if m.VendorInfo.Vendor != "" { err := movie.validateVendorMovie() if err != nil { @@ -228,21 +228,20 @@ func (movie *Movie) Validate() error { } func (movie *Movie) validateVendorMovie() error { - m := movie.Base - switch m.VendorInfo.Vendor { + switch movie.Movie.Base.VendorInfo.Vendor { case model.StreamingVendorBilibili: - err := m.VendorInfo.Bilibili.Validate() + err := movie.Movie.Base.VendorInfo.Bilibili.Validate() if err != nil { return err } - if m.Headers == nil { - m.Headers = map[string]string{ + if movie.Movie.Base.Headers == nil { + movie.Movie.Base.Headers = map[string]string{ "Referer": "https://www.bilibili.com", "User-Agent": utils.UA, } } else { - m.Headers["Referer"] = "https://www.bilibili.com" - m.Headers["User-Agent"] = utils.UA + movie.Movie.Base.Headers["Referer"] = "https://www.bilibili.com" + movie.Movie.Base.Headers["User-Agent"] = utils.UA } default: return fmt.Errorf("vendor not support") diff --git a/internal/op/movies.go b/internal/op/movies.go index fe17658..5b1feb9 100644 --- a/internal/op/movies.go +++ b/internal/op/movies.go @@ -23,7 +23,7 @@ func (m *movies) init() { m.once.Do(func() { for _, m2 := range db.GetAllMoviesByRoomID(m.roomID) { m.list.PushBack(&Movie{ - Movie: m2, + Movie: *m2, }) } }) @@ -42,7 +42,7 @@ func (m *movies) AddMovie(mo *model.Movie) error { m.init() mo.Position = uint(time.Now().UnixMilli()) movie := &Movie{ - Movie: mo, + Movie: *mo, } err := movie.init() @@ -68,7 +68,7 @@ func (m *movies) AddMovies(mos []*model.Movie) error { for _, mo := range mos { mo.Position = uint(time.Now().UnixMilli()) movie := &Movie{ - Movie: mo, + Movie: *mo, } err := movie.init() @@ -105,7 +105,7 @@ func (m *movies) GetChannel(id string) (*rtmps.Channel, error) { defer m.lock.RUnlock() m.init() for e := m.list.Front(); e != nil; e = e.Next() { - if e.Value.ID == id { + if e.Value.Movie.ID == id { return e.Value.Channel() } } @@ -117,12 +117,12 @@ func (m *movies) Update(movieId string, movie *model.BaseMovie) error { defer m.lock.Unlock() m.init() for e := m.list.Front(); e != nil; e = e.Next() { - if e.Value.ID == movieId { + if e.Value.Movie.ID == movieId { err := e.Value.Update(movie) if err != nil { return err } - return db.SaveMovie(e.Value.Movie) + return db.SaveMovie(&e.Value.Movie) } } return nil @@ -163,7 +163,7 @@ func (m *movies) DeleteMovieByID(id string) error { } for e := m.list.Front(); e != nil; e = e.Next() { - if e.Value.ID == id { + if e.Value.Movie.ID == id { m.list.Remove(e).Terminate() return nil } @@ -180,7 +180,7 @@ func (m *movies) GetMovieByID(id string) (*Movie, error) { func (m *movies) getMovieByID(id string) (*Movie, error) { m.init() for e := m.list.Front(); e != nil; e = e.Next() { - if e.Value.ID == id { + if e.Value.Movie.ID == id { return e.Value, nil } } @@ -190,7 +190,7 @@ func (m *movies) getMovieByID(id string) (*Movie, error) { func (m *movies) getMovieElementByID(id string) (*dllist.Element[*Movie], error) { m.init() for e := m.list.Front(); e != nil; e = e.Next() { - if e.Value.ID == id { + if e.Value.Movie.ID == id { return e, nil } } @@ -217,7 +217,7 @@ func (m *movies) SwapMoviePositions(id1, id2 string) error { return err } - movie1.Value.Position, movie2.Value.Position = movie2.Value.Position, movie1.Value.Position + movie1.Value.Movie.Position, movie2.Value.Movie.Position = movie2.Value.Movie.Position, movie1.Value.Movie.Position m.list.Swap(movie1, movie2) return nil diff --git a/internal/op/user.go b/internal/op/user.go index de7ada8..31a50d9 100644 --- a/internal/op/user.go +++ b/internal/op/user.go @@ -127,7 +127,7 @@ func (u *User) UpdateMovie(room *Room, movieID string, movie *model.BaseMovie) e if err != nil { return err } - if m.CreatorID != u.ID && !u.HasRoomPermission(room, model.PermissionEditUser) { + if m.Movie.CreatorID != u.ID && !u.HasRoomPermission(room, model.PermissionEditUser) { return model.ErrNoPermission } return room.UpdateMovie(movieID, movie) @@ -145,7 +145,7 @@ func (u *User) DeleteMovieByID(room *Room, movieID string) error { if err != nil { return err } - if m.CreatorID != u.ID && !u.HasRoomPermission(room, model.PermissionEditUser) { + if m.Movie.CreatorID != u.ID && !u.HasRoomPermission(room, model.PermissionEditUser) { return model.ErrNoPermission } return room.DeleteMovieByID(movieID) @@ -157,7 +157,7 @@ func (u *User) DeleteMoviesByID(room *Room, movieIDs []string) error { if err != nil { return err } - if m.CreatorID != u.ID && !u.HasRoomPermission(room, model.PermissionEditUser) { + if m.Movie.CreatorID != u.ID && !u.HasRoomPermission(room, model.PermissionEditUser) { return model.ErrNoPermission } } diff --git a/server/handlers/movie.go b/server/handlers/movie.go index dc87f0d..ec28c22 100644 --- a/server/handlers/movie.go +++ b/server/handlers/movie.go @@ -76,9 +76,9 @@ func MovieList(ctx *gin.Context) { mresp := make([]model.MoviesResp, len(m)) for i, v := range m { mresp[i] = model.MoviesResp{ - Id: v.ID, - Base: v.Base, - Creator: op.GetUserName(v.CreatorID), + Id: v.Movie.ID, + Base: v.Movie.Base, + Creator: op.GetUserName(v.Movie.CreatorID), } // hide url and headers when proxy if mresp[i].Base.Proxy { @@ -97,7 +97,7 @@ func MovieList(ctx *gin.Context) { } func genCurrent(ctx context.Context, current *op.Current, userID string) (*op.Current, error) { - if current.Movie.Base.VendorInfo.Vendor != "" { + if current.Movie.Movie.Base.VendorInfo.Vendor != "" { return current, parse2VendorMovie(ctx, userID, current.Movie) } return current, nil @@ -107,9 +107,9 @@ func genCurrentResp(current *op.Current) *model.CurrentMovieResp { c := &model.CurrentMovieResp{ Status: current.Status, Movie: model.MoviesResp{ - Id: current.Movie.ID, - Base: current.Movie.Base, - Creator: op.GetUserName(current.Movie.CreatorID), + Id: current.Movie.Movie.ID, + Base: current.Movie.Movie.Base, + Creator: op.GetUserName(current.Movie.Movie.CreatorID), }, } // hide url and headers when proxy @@ -152,9 +152,9 @@ func Movies(ctx *gin.Context) { mresp := make([]*model.MoviesResp, len(m)) for i, v := range m { mresp[i] = &model.MoviesResp{ - Id: v.ID, - Base: v.Base, - Creator: op.GetUserName(v.CreatorID), + Id: v.Movie.ID, + Base: v.Movie.Base, + Creator: op.GetUserName(v.Movie.CreatorID), } // hide url and headers when proxy if mresp[i].Base.Proxy { @@ -262,17 +262,17 @@ func NewPublishKey(ctx *gin.Context) { return } - if movie.CreatorID != user.ID && !user.HasRoomPermission(room, dbModel.PermissionEditUser) { + if movie.Movie.CreatorID != user.ID && !user.HasRoomPermission(room, dbModel.PermissionEditUser) { ctx.AbortWithStatus(http.StatusForbidden) return } - if !movie.Base.RtmpSource { + if !movie.Movie.Base.RtmpSource { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("only live movie can get publish key")) return } - token, err := rtmp.NewRtmpAuthorization(movie.ID) + token, err := rtmp.NewRtmpAuthorization(movie.Movie.ID) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return @@ -425,7 +425,7 @@ func ChangeCurrentMovie(ctx *gin.Context) { } current.UpdateSeek() - if (current.Movie.Base.VendorInfo.Vendor == "") || (current.Movie.Base.VendorInfo.Vendor != "" && current.Movie.Base.VendorInfo.Shared) { + if (current.Movie.Movie.Base.VendorInfo.Vendor == "") || (current.Movie.Movie.Base.VendorInfo.Vendor != "" && current.Movie.Movie.Base.VendorInfo.Shared) { if err := room.Broadcast(&op.ElementMessage{ ElementMessage: &pb.ElementMessage{ Type: pb.ElementMessageType_CHANGE_CURRENT, @@ -495,19 +495,19 @@ func ProxyMovie(ctx *gin.Context) { return } - if !m.Base.Proxy || m.Base.Live || m.Base.RtmpSource { + if !m.Movie.Base.Proxy || m.Movie.Base.Live || m.Movie.Base.RtmpSource { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("not support movie proxy")) return } - if m.Base.VendorInfo.Vendor != "" { + if m.Movie.Base.VendorInfo.Vendor != "" { proxyVendorMovie(ctx, m) return } - switch m.Base.Type { + switch m.Movie.Base.Type { case "mpd": - mpdCache, err := m.Cache().InitOrLoadMPDCache(initDashCache(ctx, m.Movie), time.Minute*5) + mpdCache, err := m.Cache().InitOrLoadMPDCache(initDashCache(ctx, &m.Movie), time.Minute*5) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return @@ -520,7 +520,7 @@ func ProxyMovie(ctx *gin.Context) { ctx.Data(http.StatusOK, "application/dash+xml", []byte(mpd.MPDFile)) return default: - err = proxyURL(ctx, m.Base.Url, m.Base.Headers) + err = proxyURL(ctx, m.Movie.Base.Url, m.Movie.Base.Headers) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -577,15 +577,15 @@ func proxyURL(ctx *gin.Context, u string, headers map[string]string) error { return errors.New("not allow proxy to local") } } - r, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil) if err != nil { return err } for k, v := range headers { - r.Header.Set(k, v) + req.Header.Set(k, v) } - r.Header.Set("Range", ctx.GetHeader("Range")) - resp, err := http.DefaultClient.Do(r) + req.Header.Set("Range", ctx.GetHeader("Range")) + resp, err := http.DefaultClient.Do(req) if err != nil { return err } @@ -619,10 +619,10 @@ func JoinLive(ctx *gin.Context) { ctx.AbortWithStatusJSON(http.StatusNotFound, model.NewApiErrorResp(err)) return } - if m.Base.RtmpSource && !conf.Conf.Server.Rtmp.Enable { + if m.Movie.Base.RtmpSource && !conf.Conf.Server.Rtmp.Enable { ctx.AbortWithStatusJSON(http.StatusForbidden, model.NewApiErrorStringResp("rtmp is not enabled")) return - } else if m.Base.Live && !settings.LiveProxy.Get() { + } else if m.Movie.Base.Live && !settings.LiveProxy.Get() { ctx.AbortWithStatusJSON(http.StatusForbidden, model.NewApiErrorStringResp("live proxy is not enabled")) return } @@ -791,9 +791,9 @@ func initBilibiliShareCache(ctx context.Context, CreatorID string, info *dbModel } func proxyVendorMovie(ctx *gin.Context, movie *op.Movie) { - switch movie.Base.VendorInfo.Vendor { + switch movie.Movie.Base.VendorInfo.Vendor { case dbModel.StreamingVendorBilibili: - bvc, err := movie.Cache().InitOrLoadMPDCache(initBilibiliMPDCache(ctx, movie.RoomID, movie.ID, movie.CreatorID, movie.Base.VendorInfo.Bilibili), time.Minute*119) + bvc, err := movie.Cache().InitOrLoadMPDCache(initBilibiliMPDCache(ctx, movie.Movie.RoomID, movie.Movie.ID, movie.Movie.CreatorID, movie.Movie.Base.VendorInfo.Bilibili), time.Minute*119) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return @@ -816,7 +816,7 @@ func proxyVendorMovie(ctx *gin.Context, movie *op.Movie) { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("stream id out of range")) return } - proxyURL(ctx, mpd.URLs[streamId], movie.Base.Headers) + proxyURL(ctx, mpd.URLs[streamId], movie.Movie.Base.Headers) return } @@ -827,14 +827,14 @@ func proxyVendorMovie(ctx *gin.Context, movie *op.Movie) { } func parse2VendorMovie(ctx context.Context, userID string, movie *op.Movie) (err error) { - if movie.Base.VendorInfo.Shared { - userID = movie.CreatorID + if movie.Movie.Base.VendorInfo.Shared { + userID = movie.Movie.CreatorID } - switch movie.Base.VendorInfo.Vendor { + switch movie.Movie.Base.VendorInfo.Vendor { case dbModel.StreamingVendorBilibili: - if !movie.Base.Proxy { - c, err := movie.Cache().InitOrLoadURLCache(userID, initBilibiliShareCache(ctx, movie.CreatorID, movie.Base.VendorInfo.Bilibili), time.Minute*119) + if !movie.Movie.Base.Proxy { + c, err := movie.Cache().InitOrLoadURLCache(userID, initBilibiliShareCache(ctx, movie.Movie.CreatorID, movie.Movie.Base.VendorInfo.Bilibili), time.Minute*119) if err != nil { return err } @@ -844,9 +844,9 @@ func parse2VendorMovie(ctx context.Context, userID string, movie *op.Movie) (err return err } - movie.Base.Url = data + movie.Movie.Base.Url = data } else { - movie.Base.Type = "mpd" + movie.Movie.Base.Type = "mpd" } return nil