diff --git a/server/server.go b/server/server.go index 4862cea..61d9d5d 100644 --- a/server/server.go +++ b/server/server.go @@ -26,10 +26,10 @@ import ( func NewServer(db db.Database) *Server { s := &Server{ db: db, - srv: &http.Server{}, + srv: &http.Server{}, language: db.GetLanguage(), - monitorNumCache: cache.NewCache[int, int](10 * time.Minute), - downloadNumCache: cache.NewCache[int, int](10 * time.Minute), + monitorNumCache: cache.NewCache[int, int](30 * time.Minute), + downloadNumCache: cache.NewCache[int, int](30 * time.Minute), } s.core = engine.NewEngine(db, s.language) s.setupRoutes() @@ -58,7 +58,7 @@ func (s *Server) setupRoutes() { } else { log.Warnf("serve web static files error: %v", err) } - + //s.r.Use(ginzap.Ginzap(log.Logger().Desugar(), time.RFC3339, false)) r.Use(ginzap.RecoveryWithZap(log.Logger().Desugar(), true)) @@ -179,6 +179,14 @@ func (s *Server) Start(addr string) (int, error) { log.Infof("----------- Polaris Server Successfully Started on Port %d------------", p) + ticker := time.NewTicker(10 * time.Minute) + go func() { + for { + s.cacheDownloadedStatus() + <-ticker.C + } + }() + return p, nil } diff --git a/server/watchlist.go b/server/watchlist.go index 2d8de74..b096c8f 100644 --- a/server/watchlist.go +++ b/server/watchlist.go @@ -89,6 +89,60 @@ type MediaWithStatus struct { DownloadedNum int `json:"downloaded_num"` } +func (s *Server) cacheDownloadedStatus() { + log.Info("cache watchlist downloaded/monitored status") + list := s.db.GetMediaWatchlist(media.MediaTypeTv) + for _, item := range list { + var ms = MediaWithStatus{ + Media: item, + MonitoredNum: 0, + DownloadedNum: 0, + } + mon, ok1 := s.monitorNumCache.Get(item.ID) + dow, ok2 := s.downloadNumCache.Get(item.ID) + if ok1 && ok2 { + ms.MonitoredNum = mon + ms.DownloadedNum = dow + } else { + details, err := s.db.GetMediaDetails(item.ID) + if err != nil { + log.Warnf("get media details: %v", err) + continue + } + for _, ep := range details.Episodes { + if ep.Monitored { + ms.MonitoredNum++ + if ep.Status == episode.StatusDownloaded { + ms.DownloadedNum++ + } + } + } + s.monitorNumCache.Set(item.ID, ms.MonitoredNum) + s.downloadNumCache.Set(item.ID, ms.DownloadedNum) + } + } + + list = s.db.GetMediaWatchlist(media.MediaTypeMovie) + for _, item := range list { + _, ok2 := s.downloadNumCache.Get(item.ID) + if ok2 { + continue + } + + dummyEp, err := s.db.GetMovieDummyEpisode(item.ID) + if err != nil { + log.Errorf("get dummy episode: %v", err) + } else { + + if dummyEp.Status == episode.StatusDownloaded { + s.downloadNumCache.Set(item.ID, 1) + } + + } + } + +} + //missing: episode aired missing //downloaded: all monitored episode downloaded //monitoring: episode aired downloaded, but still has not aired episode @@ -109,20 +163,7 @@ func (s *Server) GetTvWatchlist(c *gin.Context) (interface{}, error) { ms.MonitoredNum = mon ms.DownloadedNum = dow } else { - details, err := s.db.GetMediaDetails(item.ID) - if err != nil { - return nil, errors.Wrap(err, "get details") - } - for _, ep := range details.Episodes { - if ep.Monitored { - ms.MonitoredNum++ - if ep.Status == episode.StatusDownloaded { - ms.DownloadedNum++ - } - } - } - s.monitorNumCache.Set(item.ID, ms.MonitoredNum) - s.downloadNumCache.Set(item.ID, ms.DownloadedNum) + continue } res[i] = ms @@ -139,14 +180,10 @@ func (s *Server) GetMovieWatchlist(c *gin.Context) (interface{}, error) { MonitoredNum: 1, DownloadedNum: 0, } - dummyEp, err := s.db.GetMovieDummyEpisode(item.ID) - if err != nil { - log.Errorf("get dummy episode: %v", err) - } else { - if dummyEp.Status == episode.StatusDownloaded { - ms.DownloadedNum++ - } - } + dow, ok2 := s.downloadNumCache.Get(item.ID) + if ok2 { + ms.DownloadedNum = dow + } res[i] = ms } return res, nil