fix: check expired error

pull/282/head
zijiren233 2 years ago
parent 6c835ae043
commit bf07d4e7ca

@ -396,8 +396,8 @@ type BilibiliMovieCache struct {
func NewBilibiliMovieCache(movie *model.Movie) *BilibiliMovieCache { func NewBilibiliMovieCache(movie *model.Movie) *BilibiliMovieCache {
return &BilibiliMovieCache{ return &BilibiliMovieCache{
NoSharedMovie: newMapCache(NewBilibiliNoSharedMovieCacheInitFunc(movie), time.Minute*60), NoSharedMovie: newMapCache(NewBilibiliNoSharedMovieCacheInitFunc(movie), time.Minute*55),
SharedMpd: refreshcache1.NewRefreshCache(NewBilibiliSharedMpdCacheInitFunc(movie), time.Minute*60), SharedMpd: refreshcache1.NewRefreshCache(NewBilibiliSharedMpdCacheInitFunc(movie), time.Minute*55),
Subtitle: refreshcache1.NewRefreshCache(NewBilibiliSubtitleCacheInitFunc(movie), -1), Subtitle: refreshcache1.NewRefreshCache(NewBilibiliSubtitleCacheInitFunc(movie), -1),
Live: refreshcache0.NewRefreshCache(NewBilibiliLiveCacheInitFunc(movie), time.Minute*55), Live: refreshcache0.NewRefreshCache(NewBilibiliLiveCacheInitFunc(movie), time.Minute*55),
} }

@ -38,30 +38,39 @@ func (m *Movie) SubPath() string {
return m.subPath return m.subPath
} }
func (m *Movie) ExpireID() uint64 { func (m *Movie) ExpireID(ctx context.Context) (uint64, error) {
switch { switch {
case m.Movie.MovieBase.VendorInfo.Vendor == model.VendorAlist: case m.Movie.MovieBase.VendorInfo.Vendor == model.VendorAlist:
amcd, _ := m.AlistCache().Raw() amcd, _ := m.AlistCache().Raw()
if amcd != nil && amcd.Ali != nil { if amcd != nil && amcd.Ali != nil {
return uint64(amcd.Ali.Last()) return uint64(amcd.Ali.Last()), nil
} }
case m.Movie.MovieBase.Live && m.Movie.MovieBase.VendorInfo.Vendor == model.VendorBilibili: case m.Movie.MovieBase.Live && m.Movie.MovieBase.VendorInfo.Vendor == model.VendorBilibili:
return uint64(m.BilibiliCache().Live.Last()) liveCache := m.BilibiliCache().Live
_, err := liveCache.Get(ctx)
if err != nil {
return 0, err
}
return uint64(liveCache.Last()), nil
} }
return uint64(crc32.ChecksumIEEE([]byte(m.Movie.ID))) return uint64(crc32.ChecksumIEEE([]byte(m.Movie.ID))), nil
} }
func (m *Movie) CheckExpired(expireID uint64) bool { func (m *Movie) CheckExpired(ctx context.Context, expireID uint64) (bool, error) {
switch { switch {
case m.Movie.MovieBase.VendorInfo.Vendor == model.VendorAlist: case m.Movie.MovieBase.VendorInfo.Vendor == model.VendorAlist:
amcd, _ := m.AlistCache().Raw() amcd, _ := m.AlistCache().Raw()
if amcd != nil && amcd.Ali != nil { if amcd != nil && amcd.Ali != nil {
return time.Now().UnixNano()-int64(amcd.Ali.Last()) > amcd.Ali.MaxAge() return time.Now().UnixNano()-int64(amcd.Ali.Last()) > amcd.Ali.MaxAge(), nil
} }
case m.Movie.MovieBase.Live && m.Movie.MovieBase.VendorInfo.Vendor == model.VendorBilibili: case m.Movie.MovieBase.Live && m.Movie.MovieBase.VendorInfo.Vendor == model.VendorBilibili:
return time.Now().UnixNano()-int64(expireID) > m.BilibiliCache().Live.MaxAge() return time.Now().UnixNano()-int64(expireID) > m.BilibiliCache().Live.MaxAge(), nil
}
id, err := m.ExpireID(ctx)
if err != nil {
return false, err
} }
return expireID != m.ExpireID() return expireID != id, nil
} }
func (m *Movie) ClearCache() error { func (m *Movie) ClearCache() error {

@ -1,6 +1,7 @@
package op package op
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"sync/atomic" "sync/atomic"
@ -434,12 +435,12 @@ func (r *Room) LoadCurrentMovie() (*Movie, error) {
return r.GetMovieByID(id) return r.GetMovieByID(id)
} }
func (r *Room) CheckCurrentExpired(expireID uint64) (bool, error) { func (r *Room) CheckCurrentExpired(ctx context.Context, expireID uint64) (bool, error) {
m, err := r.LoadCurrentMovie() m, err := r.LoadCurrentMovie()
if err != nil { if err != nil {
return false, err return false, err
} }
return m.CheckExpired(expireID), nil return m.CheckExpired(ctx, expireID)
} }
func (r *Room) SetCurrentMovie(movieID string, subPath string, play bool) error { func (r *Room) SetCurrentMovie(movieID string, subPath string, play bool) error {

@ -131,10 +131,14 @@ func genCurrentRespWithCurrent(ctx context.Context, room *op.Room, user *op.User
if err != nil { if err != nil {
return nil, fmt.Errorf("gen current movie info error: %w", err) return nil, fmt.Errorf("gen current movie info error: %w", err)
} }
expireID, err := opMovie.ExpireID(ctx)
if err != nil {
return nil, fmt.Errorf("get expire id error: %w", err)
}
resp := &model.CurrentMovieResp{ resp := &model.CurrentMovieResp{
Status: current.UpdateStatus(), Status: current.UpdateStatus(),
Movie: mr, Movie: mr,
ExpireID: opMovie.ExpireID(), ExpireID: expireID,
} }
return resp, nil return resp, nil
} }

@ -1,6 +1,7 @@
package handlers package handlers
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"io" "io"
@ -420,7 +421,13 @@ func handleExpiredMessage(cli *op.Client, expirationID uint64) error {
if err != nil { if err != nil {
return sendErrorMessage(cli, fmt.Sprintf("get movie by id error: %v", err)) return sendErrorMessage(cli, fmt.Sprintf("get movie by id error: %v", err))
} }
if currentMovie.CheckExpired(expirationID) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
expired, err := currentMovie.CheckExpired(ctx, expirationID)
if err != nil {
return sendErrorMessage(cli, fmt.Sprintf("check expired error: %v", err))
}
if expired {
return cli.Send(&pb.Message{ return cli.Send(&pb.Message{
Type: pb.MessageType_EXPIRED, Type: pb.MessageType_EXPIRED,
}) })

@ -1 +1 @@
Subproject commit 06afd9cf4a261f8395d09f7859db9ec40abc67c7 Subproject commit b2d6acf0abff3947ade63d17c0a3cfecf55726d6
Loading…
Cancel
Save