package models import ( "time" "github.com/jmoiron/sqlx" polochon "github.com/odwrtw/polochon/lib" "github.com/sirupsen/logrus" ) const ( upsertEpisodeQuery = ` INSERT INTO episodes (show_imdb_id, show_tvdb_id, title, season, episode, tvdb_id, aired, plot, runtime, rating, imdb_id) VALUES (:show_imdb_id, :show_tvdb_id, :title, :season, :episode, :tvdb_id, :aired, :plot, :runtime, :rating, :imdb_id) ON CONFLICT (show_imdb_id, season, episode) DO UPDATE SET show_imdb_id=:show_imdb_id, show_tvdb_id=:show_tvdb_id, title=:title, season=:season, episode=:episode, tvdb_id=:tvdb_id, aired=:aired, plot=:plot, runtime=:runtime, rating=:rating, imdb_id=:imdb_id RETURNING id;` getEpisodesQuery = ` SELECT * FROM episodes WHERE show_imdb_id=$1;` getEpisodeQuery = ` SELECT * FROM episodes WHERE show_imdb_id=$1 AND season=$2 AND episode=$3;` ) // episodeDB represents the Episode in the DB type episodeDB struct { ID string `db:"id"` TvdbID int `db:"tvdb_id"` ImdbID string `db:"imdb_id"` ShowImdbID string `db:"show_imdb_id"` ShowTvdbID int `db:"show_tvdb_id"` Season int `db:"season"` Episode int `db:"episode"` Title string `db:"title"` Rating float32 `db:"rating"` Plot string `db:"plot"` Thumb string `db:"thumb"` Runtime int `db:"runtime"` Aired string `db:"aired"` ReleaseGroup string `db:"release_group"` Created time.Time `db:"created_at"` Updated time.Time `db:"updated_at"` } // NewEpisodeFromPolochon returns an episodeDB from a polochon ShowEpisode func NewEpisodeFromPolochon(e *polochon.ShowEpisode) *episodeDB { return &episodeDB{ TvdbID: e.TvdbID, ImdbID: e.EpisodeImdbID, ShowImdbID: e.ShowImdbID, ShowTvdbID: e.ShowTvdbID, Season: e.Season, Episode: e.Episode, Title: e.Title, Rating: e.Rating, Plot: e.Plot, Thumb: e.Thumb, Runtime: e.Runtime, Aired: e.Aired, ReleaseGroup: e.ReleaseGroup, } } // NewEpisodeFromDB returns a new polochon ShowEpisode from an episodeDB func NewEpisodeFromDB(eDB *episodeDB) *polochon.ShowEpisode { pEpisode := polochon.ShowEpisode{} FillEpisodeFromDB(eDB, &pEpisode) return &pEpisode } // FillEpisodeFromDB fills a ShowEpisode from an episodeDB func FillEpisodeFromDB(eDB *episodeDB, pEpisode *polochon.ShowEpisode) { pEpisode.TvdbID = eDB.TvdbID pEpisode.EpisodeImdbID = eDB.ImdbID pEpisode.ShowImdbID = eDB.ShowImdbID pEpisode.ShowTvdbID = eDB.ShowTvdbID pEpisode.Season = eDB.Season pEpisode.Episode = eDB.Episode pEpisode.Title = eDB.Title pEpisode.Rating = eDB.Rating pEpisode.Plot = eDB.Plot pEpisode.Thumb = eDB.Thumb pEpisode.Runtime = eDB.Runtime pEpisode.Aired = eDB.Aired } // GetEpisode gets an episode and fills the polochon episode func GetEpisode(db *sqlx.DB, pEpisode *polochon.ShowEpisode) error { var episodeDB episodeDB err := db.QueryRowx(getEpisodeQuery, pEpisode.ShowImdbID, pEpisode.Season, pEpisode.Episode).StructScan(&episodeDB) if err != nil { return err } FillEpisodeFromDB(&episodeDB, pEpisode) return nil } // GetEpisodes gets show's episodes and fills the polochon show func GetEpisodes(db *sqlx.DB, pShow *polochon.Show, log *logrus.Entry) error { // Get the episodes var episodesDB = []*episodeDB{} err := db.Select(&episodesDB, getEpisodesQuery, pShow.ImdbID) if err != nil { return err } if len(episodesDB) == 0 { log.Debug("got no episodes") return nil } log.Debugf("got %d episodes", len(episodesDB)) for _, episodeDB := range episodesDB { episode := NewEpisodeFromDB(episodeDB) pShow.Episodes = append(pShow.Episodes, episode) } return nil } // UpsertEpisode upserts the episode func UpsertEpisode(db *sqlx.DB, showEpisode *polochon.ShowEpisode) error { e := NewEpisodeFromPolochon(showEpisode) r, err := db.NamedQuery(upsertEpisodeQuery, e) if err != nil { return err } defer r.Close() return nil }