138 lines
3.9 KiB
Go
138 lines
3.9 KiB
Go
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
|
|
}
|