mirror of
https://github.com/simon-ding/polaris.git
synced 2026-06-09 03:27:39 +08:00
feat: check tv ervery hour and download backdrop image
This commit is contained in:
9
db/db.go
9
db/db.go
@@ -159,6 +159,15 @@ func (c *Client) GetMediaWatchlist(mediaType media.MediaType) []*ent.Media {
|
|||||||
return list
|
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 {
|
type MediaDetails struct {
|
||||||
*ent.Media
|
*ent.Media
|
||||||
Episodes []*ent.Episode `json:"episodes"`
|
Episodes []*ent.Episode `json:"episodes"`
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import (
|
|||||||
func (s *Server) scheduler() {
|
func (s *Server) scheduler() {
|
||||||
s.mustAddCron("@every 1m", s.checkTasks)
|
s.mustAddCron("@every 1m", s.checkTasks)
|
||||||
//s.mustAddCron("@every 1h", s.checkAllFiles)
|
//s.mustAddCron("@every 1h", s.checkAllFiles)
|
||||||
|
s.mustAddCron("@every 1h", s.downloadTvSeries)
|
||||||
s.cron.Start()
|
s.cron.Start()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,15 +59,15 @@ func (s *Server) moveCompletedTask(id int) (err error) {
|
|||||||
}
|
}
|
||||||
s.db.SetHistoryStatus(r.ID, history.StatusUploading)
|
s.db.SetHistoryStatus(r.ID, history.StatusUploading)
|
||||||
|
|
||||||
defer func () {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.db.SetHistoryStatus(r.ID, history.StatusFail)
|
s.db.SetHistoryStatus(r.ID, history.StatusFail)
|
||||||
if r.EpisodeID != 0 {
|
if r.EpisodeID != 0 {
|
||||||
s.db.SetEpisodeStatus(r.EpisodeID, episode.StatusMissing)
|
s.db.SetEpisodeStatus(r.EpisodeID, episode.StatusMissing)
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
delete(s.tasks, r.ID)
|
delete(s.tasks, r.ID)
|
||||||
s.db.SetHistoryStatus(r.ID, history.StatusSuccess)
|
s.db.SetHistoryStatus(r.ID, history.StatusSuccess)
|
||||||
if r.EpisodeID != 0 {
|
if r.EpisodeID != 0 {
|
||||||
s.db.SetEpisodeStatus(r.EpisodeID, episode.StatusDownloaded)
|
s.db.SetEpisodeStatus(r.EpisodeID, episode.StatusDownloaded)
|
||||||
@@ -208,3 +209,41 @@ type Task struct {
|
|||||||
//Processing bool
|
//Processing bool
|
||||||
pkg.Torrent
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -117,6 +117,10 @@ func (s *Server) AddTv2Watchlist(c *gin.Context) (interface{}, error) {
|
|||||||
if err := s.downloadPoster(detail.PosterPath, r.ID); err != nil {
|
if err := s.downloadPoster(detail.PosterPath, r.ID); err != nil {
|
||||||
log.Errorf("download poster error: %v", err)
|
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)
|
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 {
|
if err := s.downloadPoster(detail.PosterPath, r.ID); err != nil {
|
||||||
log.Errorf("download poster error: %v", err)
|
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)
|
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 {
|
func (s *Server) downloadPoster(path string, mediaID int) error {
|
||||||
var tmdbImgBaseUrl = "https://image.tmdb.org/t/p/w500/"
|
var url = "https://image.tmdb.org/t/p/original" + path
|
||||||
url := tmdbImgBaseUrl + path
|
|
||||||
log.Infof("try to download poster: %v", url)
|
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)
|
var resp, err = http.Get(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "http get")
|
return errors.Wrap(err, "http get")
|
||||||
}
|
}
|
||||||
targetDir := fmt.Sprintf("%v/%d", db.ImgPath, mediaID)
|
targetDir := fmt.Sprintf("%v/%d", db.ImgPath, mediaID)
|
||||||
os.MkdirAll(targetDir, 0777)
|
os.MkdirAll(targetDir, 0777)
|
||||||
ext := filepath.Ext(path)
|
//ext := filepath.Ext(path)
|
||||||
targetFile := filepath.Join(targetDir, "poster"+ext)
|
targetFile := filepath.Join(targetDir, name)
|
||||||
f, err := os.Create(targetFile)
|
f, err := os.Create(targetFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "new file")
|
return errors.Wrap(err, "new file")
|
||||||
@@ -192,8 +209,9 @@ func (s *Server) downloadPoster(path string, mediaID int) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "copy http response")
|
return errors.Wrap(err, "copy http response")
|
||||||
}
|
}
|
||||||
log.Infof("poster successfully downlaoded: %v", targetFile)
|
log.Infof("image successfully downlaoded: %v", targetFile)
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) GetTvWatchlist(c *gin.Context) (interface{}, error) {
|
func (s *Server) GetTvWatchlist(c *gin.Context) (interface{}, error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user