mirror of
https://github.com/simon-ding/polaris.git
synced 2026-05-31 06:57:43 +08:00
feat: cache downloaded status data every 10min
This commit is contained in:
@@ -28,8 +28,8 @@ func NewServer(db db.Database) *Server {
|
|||||||
db: db,
|
db: db,
|
||||||
srv: &http.Server{},
|
srv: &http.Server{},
|
||||||
language: db.GetLanguage(),
|
language: db.GetLanguage(),
|
||||||
monitorNumCache: cache.NewCache[int, int](10 * time.Minute),
|
monitorNumCache: cache.NewCache[int, int](30 * time.Minute),
|
||||||
downloadNumCache: cache.NewCache[int, int](10 * time.Minute),
|
downloadNumCache: cache.NewCache[int, int](30 * time.Minute),
|
||||||
}
|
}
|
||||||
s.core = engine.NewEngine(db, s.language)
|
s.core = engine.NewEngine(db, s.language)
|
||||||
s.setupRoutes()
|
s.setupRoutes()
|
||||||
@@ -179,6 +179,14 @@ func (s *Server) Start(addr string) (int, error) {
|
|||||||
|
|
||||||
log.Infof("----------- Polaris Server Successfully Started on Port %d------------", p)
|
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
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,60 @@ type MediaWithStatus struct {
|
|||||||
DownloadedNum int `json:"downloaded_num"`
|
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
|
//missing: episode aired missing
|
||||||
//downloaded: all monitored episode downloaded
|
//downloaded: all monitored episode downloaded
|
||||||
//monitoring: episode aired downloaded, but still has not aired episode
|
//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.MonitoredNum = mon
|
||||||
ms.DownloadedNum = dow
|
ms.DownloadedNum = dow
|
||||||
} else {
|
} else {
|
||||||
details, err := s.db.GetMediaDetails(item.ID)
|
continue
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res[i] = ms
|
res[i] = ms
|
||||||
@@ -139,13 +180,9 @@ func (s *Server) GetMovieWatchlist(c *gin.Context) (interface{}, error) {
|
|||||||
MonitoredNum: 1,
|
MonitoredNum: 1,
|
||||||
DownloadedNum: 0,
|
DownloadedNum: 0,
|
||||||
}
|
}
|
||||||
dummyEp, err := s.db.GetMovieDummyEpisode(item.ID)
|
dow, ok2 := s.downloadNumCache.Get(item.ID)
|
||||||
if err != nil {
|
if ok2 {
|
||||||
log.Errorf("get dummy episode: %v", err)
|
ms.DownloadedNum = dow
|
||||||
} else {
|
|
||||||
if dummyEp.Status == episode.StatusDownloaded {
|
|
||||||
ms.DownloadedNum++
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
res[i] = ms
|
res[i] = ms
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user