From bf07d4e7cacceb18bb01a40ef6831c74b0210c9d Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Fri, 17 Jan 2025 15:51:23 +0800 Subject: [PATCH] fix: check expired error --- internal/cache/bilibili.go | 4 ++-- internal/op/movie.go | 25 +++++++++++++++++-------- internal/op/room.go | 5 +++-- server/handlers/movie.go | 6 +++++- server/handlers/websocket.go | 9 ++++++++- synctv-web | 2 +- 6 files changed, 36 insertions(+), 15 deletions(-) diff --git a/internal/cache/bilibili.go b/internal/cache/bilibili.go index 03fb03e..b23ca47 100644 --- a/internal/cache/bilibili.go +++ b/internal/cache/bilibili.go @@ -396,8 +396,8 @@ type BilibiliMovieCache struct { func NewBilibiliMovieCache(movie *model.Movie) *BilibiliMovieCache { return &BilibiliMovieCache{ - NoSharedMovie: newMapCache(NewBilibiliNoSharedMovieCacheInitFunc(movie), time.Minute*60), - SharedMpd: refreshcache1.NewRefreshCache(NewBilibiliSharedMpdCacheInitFunc(movie), time.Minute*60), + NoSharedMovie: newMapCache(NewBilibiliNoSharedMovieCacheInitFunc(movie), time.Minute*55), + SharedMpd: refreshcache1.NewRefreshCache(NewBilibiliSharedMpdCacheInitFunc(movie), time.Minute*55), Subtitle: refreshcache1.NewRefreshCache(NewBilibiliSubtitleCacheInitFunc(movie), -1), Live: refreshcache0.NewRefreshCache(NewBilibiliLiveCacheInitFunc(movie), time.Minute*55), } diff --git a/internal/op/movie.go b/internal/op/movie.go index 1085699..a0c2ff7 100644 --- a/internal/op/movie.go +++ b/internal/op/movie.go @@ -38,30 +38,39 @@ func (m *Movie) SubPath() string { return m.subPath } -func (m *Movie) ExpireID() uint64 { +func (m *Movie) ExpireID(ctx context.Context) (uint64, error) { switch { case m.Movie.MovieBase.VendorInfo.Vendor == model.VendorAlist: amcd, _ := m.AlistCache().Raw() 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: - 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 { case m.Movie.MovieBase.VendorInfo.Vendor == model.VendorAlist: amcd, _ := m.AlistCache().Raw() 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: - 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 { diff --git a/internal/op/room.go b/internal/op/room.go index f6d7049..ecf4f77 100644 --- a/internal/op/room.go +++ b/internal/op/room.go @@ -1,6 +1,7 @@ package op import ( + "context" "errors" "fmt" "sync/atomic" @@ -434,12 +435,12 @@ func (r *Room) LoadCurrentMovie() (*Movie, error) { 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() if err != nil { return false, err } - return m.CheckExpired(expireID), nil + return m.CheckExpired(ctx, expireID) } func (r *Room) SetCurrentMovie(movieID string, subPath string, play bool) error { diff --git a/server/handlers/movie.go b/server/handlers/movie.go index 365a855..4e21bee 100644 --- a/server/handlers/movie.go +++ b/server/handlers/movie.go @@ -131,10 +131,14 @@ func genCurrentRespWithCurrent(ctx context.Context, room *op.Room, user *op.User if err != nil { 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{ Status: current.UpdateStatus(), Movie: mr, - ExpireID: opMovie.ExpireID(), + ExpireID: expireID, } return resp, nil } diff --git a/server/handlers/websocket.go b/server/handlers/websocket.go index d574540..12b579d 100644 --- a/server/handlers/websocket.go +++ b/server/handlers/websocket.go @@ -1,6 +1,7 @@ package handlers import ( + "context" "errors" "fmt" "io" @@ -420,7 +421,13 @@ func handleExpiredMessage(cli *op.Client, expirationID uint64) error { if err != nil { 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{ Type: pb.MessageType_EXPIRED, }) diff --git a/synctv-web b/synctv-web index 06afd9c..b2d6acf 160000 --- a/synctv-web +++ b/synctv-web @@ -1 +1 @@ -Subproject commit 06afd9cf4a261f8395d09f7859db9ec40abc67c7 +Subproject commit b2d6acf0abff3947ade63d17c0a3cfecf55726d6