diff --git a/db/db.go b/db/db.go index 9f20470..d58c15d 100644 --- a/db/db.go +++ b/db/db.go @@ -232,6 +232,15 @@ func (c *client) GetMediaWatchlist(mediaType media.MediaType) []*ent.Media { return list } +func (c *client) GetAllEpisodes() (ent.Episodes, error) { + ep, err := c.ent.Episode.Query().All(context.TODO()) + return ep, err +} + +func (c *client) DeleteEpisode(id int) error { + _, err := c.ent.Episode.Delete().Where(episode.ID(id)).Exec(context.TODO()) + return err +} 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()) diff --git a/db/interface.go b/db/interface.go index e7607be..a3033b6 100644 --- a/db/interface.go +++ b/db/interface.go @@ -59,7 +59,6 @@ type Settings interface { GetAcceptedSubtitleFormats() ([]string, error) SetAcceptedSubtitleFormats(key string, v []string) error GetTmdbApiKey() string - } type MediaApis interface { @@ -75,6 +74,8 @@ type MediaApis interface { } type EpisodeApis interface { + GetAllEpisodes() (ent.Episodes, error) + DeleteEpisode(id int) error GetEpisode(seriesId, seasonNum, episodeNum int) (*ent.Episode, error) GetEpisodeByID(epID int) (*ent.Episode, error) UpdateEpiode(episodeId int, name, overview string) error @@ -89,7 +90,6 @@ type EpisodeApis interface { UpdateEpisodeTargetFile(id int, filename string) error GetSeasonEpisodes(mediaId, seasonNum int) ([]*ent.Episode, error) CleanAllDanglingEpisodes() error - } type IndexerApis interface { @@ -97,7 +97,6 @@ type IndexerApis interface { DeleteIndexer(id int) GetIndexer(id int) (*ent.Indexers, error) GetAllIndexers() []*ent.Indexers - } type HistoryApis interface { @@ -108,5 +107,5 @@ type HistoryApis interface { GetHistories() ent.Histories DeleteHistory(id int) error GetDownloadHistory(mediaID int) ([]*ent.History, error) - GetMovieDummyEpisode(movieId int) (*ent.Episode, error) -} \ No newline at end of file + GetMovieDummyEpisode(movieId int) (*ent.Episode, error) +} diff --git a/engine/housekeeping.go b/engine/housekeeping.go index 21dfbb1..20098a9 100644 --- a/engine/housekeeping.go +++ b/engine/housekeeping.go @@ -1,6 +1,9 @@ package engine -import "polaris/log" +import ( + "polaris/ent/media" + "polaris/log" +) func (c *Engine) housekeeping() error { log.Infof("start housekeeping tasks...") @@ -17,6 +20,31 @@ func (c *Engine) housekeeping() error { func (c *Engine) checkDbScraps() error { //TODO: remove episodes that are not associated with any series + + tvs := c.db.GetMediaWatchlist(media.MediaTypeTv) + movies := c.db.GetMediaWatchlist(media.MediaTypeMovie) + + validMediaIDs := make(map[int]bool, len(tvs)+len(movies)) + for _, tv := range tvs { + validMediaIDs[tv.ID] = true + } + for _, movie := range movies { + validMediaIDs[movie.ID] = true + } + + allEpisodes, err := c.db.GetAllEpisodes() + if err != nil { + return err + } + for _, ep := range allEpisodes { + if _, ok := validMediaIDs[ep.MediaID]; !ok { + log.Infof("remove scrap episode record: %v S%vE%v", ep.MediaID, ep.SeasonNumber, ep.EpisodeNumber) + if err := c.db.DeleteEpisode(ep.ID); err != nil { + log.Errorf("delete scrap episode record error: %v", err) + } + } + } + return nil }