Opt: movie

pull/31/head
zijiren233 2 years ago
parent f0fe40a184
commit 5c39296f96

@ -22,9 +22,7 @@ func newCurrent() *current {
return &current{
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 {

@ -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")

@ -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

@ -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
}
}

@ -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

Loading…
Cancel
Save