diff --git a/db/db.go b/db/db.go index 4388622..d82cc8b 100644 --- a/db/db.go +++ b/db/db.go @@ -159,6 +159,15 @@ func (c *Client) GetMediaWatchlist(mediaType media.MediaType) []*ent.Media { return list } +func (c *Client) GetEpisode(seriesId, seasonNum, episodeNum int) (*ent.Episode, error) { + return c.ent.Episode.Query().Where(episode.MediaID(seriesId), episode.SeasonNumber(seasonNum), + episode.EpisodeNumber(episodeNum)).First(context.TODO()) +} + +func (c *Client) UpdateEpiode(episodeId int, name, overview string) error { + return c.ent.Episode.Update().Where(episode.ID(episodeId)).SetTitle(name).SetOverview(overview).Exec(context.TODO()) +} + type MediaDetails struct { *ent.Media Episodes []*ent.Episode `json:"episodes"` diff --git a/server/scheduler.go b/server/scheduler.go index 501e629..05a08a7 100644 --- a/server/scheduler.go +++ b/server/scheduler.go @@ -20,6 +20,7 @@ import ( func (s *Server) scheduler() { s.mustAddCron("@every 1m", s.checkTasks) //s.mustAddCron("@every 1h", s.checkAllFiles) + s.mustAddCron("@every 1h", s.downloadTvSeries) s.cron.Start() } @@ -58,15 +59,15 @@ func (s *Server) moveCompletedTask(id int) (err error) { } s.db.SetHistoryStatus(r.ID, history.StatusUploading) - defer func () { + defer func() { if err != nil { s.db.SetHistoryStatus(r.ID, history.StatusFail) if r.EpisodeID != 0 { s.db.SetEpisodeStatus(r.EpisodeID, episode.StatusMissing) } - + } else { - delete(s.tasks, r.ID) + delete(s.tasks, r.ID) s.db.SetHistoryStatus(r.ID, history.StatusSuccess) if r.EpisodeID != 0 { s.db.SetEpisodeStatus(r.EpisodeID, episode.StatusDownloaded) @@ -208,3 +209,41 @@ type Task struct { //Processing bool pkg.Torrent } + +func (s *Server) downloadTvSeries() { + log.Infof("begin check all tv series resources") + allSeries := s.db.GetMediaWatchlist(media.MediaTypeTv) + for _, series := range allSeries { + detail, err := s.MustTMDB().GetTvDetails(series.TmdbID, s.language) + if err != nil { + log.Errorf("get tv details error: %v", err) + continue + } + + lastEpisode, err := s.db.GetEpisode(series.ID, detail.LastEpisodeToAir.SeasonNumber, detail.LastEpisodeToAir.EpisodeNumber) + if err != nil { + log.Errorf("get last episode error: %v", err) + continue + } + if lastEpisode.Title != detail.LastEpisodeToAir.Name { + s.db.UpdateEpiode(lastEpisode.ID, detail.LastEpisodeToAir.Name, detail.LastEpisodeToAir.Overview) + } + if lastEpisode.Status == episode.StatusMissing { + name, err := s.searchAndDownload(series.ID, lastEpisode.SeasonNumber, lastEpisode.EpisodeNumber) + if err != nil { + log.Infof("cannot find resource to download for %s: %v", lastEpisode.Title, err) + } else { + log.Infof("begin download torrent resource: %v",name) + } + } + + nextEpisode, err := s.db.GetEpisode(series.ID, detail.NextEpisodeToAir.SeasonNumber, detail.NextEpisodeToAir.EpisodeNumber) + if err == nil { + if nextEpisode.Title != detail.NextEpisodeToAir.Name { + s.db.UpdateEpiode(nextEpisode.ID, detail.NextEpisodeToAir.Name, detail.NextEpisodeToAir.Overview) + log.Errorf("updated next episode name to %v", detail.NextEpisodeToAir.Name) + } + } + + } +} diff --git a/server/watchlist.go b/server/watchlist.go index 7ea30d0..0bd3449 100644 --- a/server/watchlist.go +++ b/server/watchlist.go @@ -117,6 +117,10 @@ func (s *Server) AddTv2Watchlist(c *gin.Context) (interface{}, error) { if err := s.downloadPoster(detail.PosterPath, r.ID); err != nil { log.Errorf("download poster error: %v", err) } + if err := s.downloadBackdrop(detail.BackdropPath, r.ID,); err != nil { + log.Errorf("download poster error: %v", err) + } + }() log.Infof("add tv %s to watchlist success", detail.Name) @@ -164,6 +168,9 @@ func (s *Server) AddMovie2Watchlist(c *gin.Context) (interface{}, error) { if err := s.downloadPoster(detail.PosterPath, r.ID); err != nil { log.Errorf("download poster error: %v", err) } + if err := s.downloadBackdrop(detail.BackdropPath, r.ID); err != nil { + log.Errorf("download backdrop error: %v", err) + } }() log.Infof("add movie %s to watchlist success", detail.Title) @@ -171,18 +178,28 @@ func (s *Server) AddMovie2Watchlist(c *gin.Context) (interface{}, error) { } +func (s *Server) downloadBackdrop(path string, mediaID int) error { + url := "https://image.tmdb.org/t/p/original" + path + return s.downloadImage(url, mediaID, "backdrop.ipg") +} + func (s *Server) downloadPoster(path string, mediaID int) error { - var tmdbImgBaseUrl = "https://image.tmdb.org/t/p/w500/" - url := tmdbImgBaseUrl + path - log.Infof("try to download poster: %v", url) + var url = "https://image.tmdb.org/t/p/original" + path + + return s.downloadImage(url, mediaID, "poster.ipg") +} + +func (s *Server) downloadImage(url string, mediaID int, name string) error { + + log.Infof("try to download image: %v", url) var resp, err = http.Get(url) if err != nil { return errors.Wrap(err, "http get") } targetDir := fmt.Sprintf("%v/%d", db.ImgPath, mediaID) os.MkdirAll(targetDir, 0777) - ext := filepath.Ext(path) - targetFile := filepath.Join(targetDir, "poster"+ext) + //ext := filepath.Ext(path) + targetFile := filepath.Join(targetDir, name) f, err := os.Create(targetFile) if err != nil { return errors.Wrap(err, "new file") @@ -192,8 +209,9 @@ func (s *Server) downloadPoster(path string, mediaID int) error { if err != nil { return errors.Wrap(err, "copy http response") } - log.Infof("poster successfully downlaoded: %v", targetFile) + log.Infof("image successfully downlaoded: %v", targetFile) return nil + } func (s *Server) GetTvWatchlist(c *gin.Context) (interface{}, error) {