Fix: url cache is nil

pull/31/head
zijiren233 1 year ago
parent 5599f3d9c0
commit fb0e175475

@ -14,7 +14,7 @@ type current struct {
}
type Current struct {
Movie *Movie `json:"movie"`
Movie Movie `json:"movie"`
Status Status `json:"status"`
}
@ -22,7 +22,6 @@ func newCurrent() *current {
return &current{
current: Current{
Status: newStatus(),
Movie: &Movie{},
},
}
}
@ -49,7 +48,7 @@ func (c *current) Current() Current {
return c.current
}
func (c *current) Movie() *Movie {
func (c *current) Movie() Movie {
c.lock.RLock()
defer c.lock.RUnlock()
@ -60,11 +59,7 @@ func (c *current) SetMovie(movie *Movie, play bool) {
c.lock.Lock()
defer c.lock.Unlock()
if movie == nil {
c.current.Movie = &Movie{}
} else {
c.current.Movie = movie
}
c.current.Movie = *movie
c.current.SetSeek(0, 0)
c.current.Status.Playing = play
}
@ -98,35 +93,33 @@ func (c *Current) Proto() *pb.Current {
Playing: c.Status.Playing,
},
}
if c.Movie != nil {
current.Movie = &pb.MovieInfo{
Id: c.Movie.Movie.ID,
Base: &pb.BaseMovieInfo{
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.Movie.CreatedAt.UnixMilli(),
Creator: GetUserName(c.Movie.Movie.CreatorID),
current.Movie = &pb.MovieInfo{
Id: c.Movie.Movie.ID,
Base: &pb.BaseMovieInfo{
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.Movie.CreatedAt.UnixMilli(),
Creator: GetUserName(c.Movie.Movie.CreatorID),
}
if c.Movie.Movie.Base.VendorInfo.Vendor != "" {
current.Movie.Base.VendorInfo = &pb.VendorInfo{
Vendor: string(c.Movie.Movie.Base.VendorInfo.Vendor),
Shared: c.Movie.Movie.Base.VendorInfo.Shared,
}
if c.Movie.Movie.Base.VendorInfo.Vendor != "" {
current.Movie.Base.VendorInfo = &pb.VendorInfo{
Vendor: string(c.Movie.Movie.Base.VendorInfo.Vendor),
Shared: c.Movie.Movie.Base.VendorInfo.Shared,
}
switch c.Movie.Movie.Base.VendorInfo.Vendor {
case model.StreamingVendorBilibili:
current.Movie.Base.VendorInfo.Bilibili = &pb.BilibiliVendorInfo{
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,
}
switch c.Movie.Movie.Base.VendorInfo.Vendor {
case model.StreamingVendorBilibili:
current.Movie.Base.VendorInfo.Bilibili = &pb.BilibiliVendorInfo{
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,
}
}
}

@ -24,7 +24,7 @@ import (
type Movie struct {
Movie model.Movie
lock sync.RWMutex
lock *sync.RWMutex
channel *rtmps.Channel
cache *BaseCache
}
@ -35,6 +35,12 @@ type BaseCache struct {
mpd *refreshcache.RefreshCache[*MPDCache]
}
func newBaseCache() *BaseCache {
return &BaseCache{
url: make(map[string]*refreshcache.RefreshCache[string]),
}
}
type MPDCache struct {
MPDFile string
URLs []string
@ -87,14 +93,6 @@ func (b *BaseCache) InitOrLoadMPDCache(refreshFunc func() (*MPDCache, error), ma
return b.mpd, nil
}
func (m *Movie) Clone() *Movie {
return &Movie{
Movie: m.Movie,
channel: m.channel,
cache: m.cache,
}
}
func (m *Movie) Channel() (*rtmps.Channel, error) {
m.lock.Lock()
defer m.lock.Unlock()
@ -102,11 +100,6 @@ func (m *Movie) Channel() (*rtmps.Channel, error) {
}
func (m *Movie) Cache() *BaseCache {
m.lock.Lock()
defer m.lock.Unlock()
if m.cache == nil {
m.cache = &BaseCache{}
}
return m.cache
}
@ -287,9 +280,7 @@ func (m *Movie) terminate() {
m.channel.Close()
m.channel = nil
}
if m.cache != nil {
m.cache.Clear()
}
m.cache.Clear()
}
func (m *Movie) Update(movie *model.BaseMovie) error {

@ -24,6 +24,8 @@ func (m *movies) init() {
for _, m2 := range db.GetAllMoviesByRoomID(m.roomID) {
m.list.PushBack(&Movie{
Movie: *m2,
lock: new(sync.RWMutex),
cache: newBaseCache(),
})
}
})
@ -43,6 +45,8 @@ func (m *movies) AddMovie(mo *model.Movie) error {
mo.Position = uint(time.Now().UnixMilli())
movie := &Movie{
Movie: *mo,
lock: new(sync.RWMutex),
cache: newBaseCache(),
}
err := movie.init()
@ -69,6 +73,8 @@ func (m *movies) AddMovies(mos []*model.Movie) error {
mo.Position = uint(time.Now().UnixMilli())
movie := &Movie{
Movie: *mo,
lock: new(sync.RWMutex),
cache: newBaseCache(),
}
err := movie.init()

@ -177,7 +177,6 @@ func (r *Room) GetMovieByID(id string) (*Movie, error) {
func (r *Room) Current() *Current {
c := r.current.Current()
c.Movie = c.Movie.Clone()
return &c
}

@ -98,7 +98,7 @@ func MovieList(ctx *gin.Context) {
func genCurrent(ctx context.Context, current *op.Current, userID string) (*op.Current, error) {
if current.Movie.Movie.Base.VendorInfo.Vendor != "" {
return current, parse2VendorMovie(ctx, userID, current.Movie)
return current, parse2VendorMovie(ctx, userID, &current.Movie)
}
return current, nil
}

Loading…
Cancel
Save