Add polochon's shows to the party

This commit is contained in:
Lucas BEE 2017-01-24 16:21:02 +00:00
parent 879bc2a412
commit 803dbe5355
4 changed files with 145 additions and 13 deletions

View File

@ -32,6 +32,7 @@ const (
type Episode struct { type Episode struct {
sqly.BaseModel sqly.BaseModel
polochon.ShowEpisode polochon.ShowEpisode
PolochonURL string `json:"polochon_url"`
} }
// EpisodeDB represents the Episode in the DB // EpisodeDB represents the Episode in the DB

View File

@ -3,15 +3,24 @@ package shows
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"net"
"net/http" "net/http"
"net/url"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/odwrtw/papi"
polochon "github.com/odwrtw/polochon/lib" polochon "github.com/odwrtw/polochon/lib"
"github.com/odwrtw/polochon/modules/pam"
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/auth" "gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/auth"
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/config"
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/users" "gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/users"
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/web" "gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/web"
) )
// ErrPolochonUnavailable is an error returned if the polochon server is not available
var ErrPolochonUnavailable = fmt.Errorf("Invalid polochon address")
// GetDetailsHandler retrieves details of a show // GetDetailsHandler retrieves details of a show
func GetDetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { func GetDetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
return DetailsHandler(env, w, r, false) return DetailsHandler(env, w, r, false)
@ -40,6 +49,20 @@ func DetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request, force
if err := s.GetEpisodes(env, force); err != nil { if err := s.GetEpisodes(env, force); err != nil {
return env.RenderError(w, err) return env.RenderError(w, err)
} }
// Get the show from the polochon of the user
pShow, err := getPolochonShow(user, s.ImdbID)
if err != nil {
env.Log.Warnf("error while getting polochon show %s : %s", s.ImdbID, err)
}
// For each of the user's polochon episodes, add a direct link to it
for _, pEpisode := range pShow.Episodes {
for _, e := range s.Episodes {
if e.Season != pEpisode.Season || e.Episode != pEpisode.Episode {
continue
}
e.PolochonURL = pEpisode.PolochonURL
}
}
return env.RenderJSON(w, s) return env.RenderJSON(w, s)
} }
@ -154,3 +177,108 @@ func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) er
return env.RenderJSON(w, shows) return env.RenderJSON(w, shows)
} }
// getPolochonShows returns all the Shows from the polochon of a user
func getPolochonShows(user *users.User) ([]*Show, error) {
shows := []*Show{}
var polochonConfig config.UserPolochon
err := user.GetConfig("polochon", &polochonConfig)
if err != nil {
return shows, err
}
client, err := papi.New(polochonConfig.URL)
if err != nil {
return shows, err
}
if polochonConfig.Token != "" {
client.SetToken(polochonConfig.Token)
}
pshows, err := client.GetShows()
if err != nil {
// Catch network error for accessing specified polochon address
if uerr, ok := err.(*url.Error); ok {
if nerr, ok := uerr.Err.(*net.OpError); ok {
if nerr.Op == "dial" {
return shows, ErrPolochonUnavailable
}
}
}
return shows, err
}
for _, pshow := range pshows {
show := New(pshow.ImdbID)
for _, season := range pshow.Seasons {
for _, episode := range season.Episodes {
e := NewEpisode()
e.Season = episode.Season
e.Episode = episode.Episode
e.ShowImdbID = episode.ShowImdbID
e.PolochonURL, _ = client.DownloadURL(
&papi.Episode{
ShowImdbID: show.ImdbID,
Episode: e.Episode,
Season: e.Season,
},
)
show.Episodes = append(show.Episodes, e)
}
}
shows = append(shows, show)
}
return shows, nil
}
// getPolochonShow returns a Show with its epidodes from the polochon of a user
func getPolochonShow(user *users.User, imdbID string) (Show, error) {
shows, err := getPolochonShows(user)
if err != nil {
return Show{}, err
}
for _, s := range shows {
if s.ImdbID == imdbID {
return *s, nil
}
}
return Show{}, nil
}
// FromPolochon will returns shows from Polochon
func FromPolochon(env *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, env.Log)
user, ok := v.(*users.User)
if !ok {
return env.RenderError(w, errors.New("invalid user type"))
}
shows, err := getPolochonShows(user)
if err != nil {
return env.RenderError(w, err)
}
var polochonConfig config.UserPolochon
err = user.GetConfig("polochon", &polochonConfig)
if err != nil {
return env.RenderError(w, err)
}
detailer, err := pam.New(&pam.Params{
Endpoint: polochonConfig.URL,
Token: polochonConfig.Token,
})
for _, s := range shows {
s.Detailers = []polochon.Detailer{detailer}
err := s.GetDetails(env, user, false)
if err != nil {
env.Log.Error(err)
}
}
return env.RenderJSON(w, shows)
}

View File

@ -108,7 +108,7 @@ type ShowDB struct {
// NewShowDB returns a Show ready to be put in DB from a // NewShowDB returns a Show ready to be put in DB from a
// Show // Show
func NewShowDB(s *Show) ShowDB { func NewShowDB(s *Show) ShowDB {
return ShowDB{ sDB := ShowDB{
ID: s.ID, ID: s.ID,
ImdbID: s.ImdbID, ImdbID: s.ImdbID,
Title: s.Title, Title: s.Title,
@ -116,10 +116,13 @@ func NewShowDB(s *Show) ShowDB {
Plot: s.Plot, Plot: s.Plot,
TvdbID: s.TvdbID, TvdbID: s.TvdbID,
Year: s.Year, Year: s.Year,
FirstAired: *s.FirstAired,
Created: s.Created, Created: s.Created,
Updated: s.Updated, Updated: s.Updated,
} }
if s.FirstAired != nil {
sDB.FirstAired = *s.FirstAired
}
return sDB
} }
// FillFromDB returns a Show from a ShowDB extracted from the DB // FillFromDB returns a Show from a ShowDB extracted from the DB
@ -231,7 +234,7 @@ func (s *Show) GetDetails(env *web.Env, user *users.User, force bool) error {
// GetPosterURL returns the image URL or the default image if the poster is not yet downloaded // GetPosterURL returns the image URL or the default image if the poster is not yet downloaded
func (s *Show) GetPosterURL(env *web.Env) string { func (s *Show) GetPosterURL(env *web.Env) string {
// Check if the movie image exists // Check if the show image exists
if _, err := os.Stat(s.imgFile(env, "poster")); os.IsNotExist(err) { if _, err := os.Stat(s.imgFile(env, "poster")); os.IsNotExist(err) {
// TODO image in the config ? // TODO image in the config ?
return "img/noimage.png" return "img/noimage.png"

View File

@ -83,7 +83,7 @@ func main() {
env.Handle("/movies/refresh", extmedias.Refresh).WithRole(users.UserRole).Methods("POST") env.Handle("/movies/refresh", extmedias.Refresh).WithRole(users.UserRole).Methods("POST")
env.Handle("/movies/search", movies.SearchMovie).WithRole(users.UserRole).Methods("POST") env.Handle("/movies/search", movies.SearchMovie).WithRole(users.UserRole).Methods("POST")
// env.Handle("/shows/polochon", shows.FromPolochon).WithRole(users.UserRole) env.Handle("/shows/polochon", shows.FromPolochon).WithRole(users.UserRole).Methods("GET")
env.Handle("/shows/{id:tt[0-9]+}", shows.GetDetailsHandler).WithRole(users.UserRole).Methods("GET") env.Handle("/shows/{id:tt[0-9]+}", shows.GetDetailsHandler).WithRole(users.UserRole).Methods("GET")
env.Handle("/shows/{id:tt[0-9]+}/refresh", shows.RefreshDetailsHandler).WithRole(users.UserRole).Methods("POST") env.Handle("/shows/{id:tt[0-9]+}/refresh", shows.RefreshDetailsHandler).WithRole(users.UserRole).Methods("POST")
env.Handle("/shows/refresh", extmedias.RefreshShows).WithRole(users.UserRole).Methods("POST") env.Handle("/shows/refresh", extmedias.RefreshShows).WithRole(users.UserRole).Methods("POST")