commit
0a609876ec
@ -209,16 +209,17 @@ func (m *Movie) GetDetails(env *web.Env, user *users.User, force bool) error {
|
||||
switch err {
|
||||
case nil:
|
||||
log.Debug("movie found in database")
|
||||
if !force {
|
||||
log.Debug("returning movie from db")
|
||||
return nil
|
||||
}
|
||||
case sql.ErrNoRows:
|
||||
log.Debug("movie not found in database")
|
||||
default:
|
||||
// Unexpected error
|
||||
return err
|
||||
}
|
||||
// If force is not specified, don't go further
|
||||
if !force {
|
||||
// Will return ErrNoRows if the movie wasn't found
|
||||
return err
|
||||
}
|
||||
|
||||
// GetDetail
|
||||
err = m.Movie.GetDetails(env.Log)
|
||||
@ -271,21 +272,20 @@ func (m *Movie) GetTorrents(env *web.Env, force bool) error {
|
||||
switch err {
|
||||
case nil:
|
||||
log.Debug("torrents found in database")
|
||||
if !force {
|
||||
log.Debugf("returning %d torrents from db", len(movieTorrents))
|
||||
// Add the torrents to the movie
|
||||
for _, t := range movieTorrents {
|
||||
m.Torrents = append(m.Torrents, t.Torrent)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
case sql.ErrNoRows:
|
||||
log.Debug("torrent not found in database")
|
||||
// We'll need to GetTorrents from torrenters
|
||||
default:
|
||||
// Unexpected error
|
||||
return err
|
||||
}
|
||||
if !force {
|
||||
log.Debugf("returning %d torrents from db", len(movieTorrents))
|
||||
// Add the torrents to the movie
|
||||
for _, t := range movieTorrents {
|
||||
m.Torrents = append(m.Torrents, t.Torrent)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
err = m.Movie.GetTorrents(env.Log)
|
||||
if err != nil {
|
||||
|
@ -26,6 +26,10 @@ const (
|
||||
getEpisodesQuery = `
|
||||
SELECT *
|
||||
FROM episodes WHERE show_imdb_id=$1;`
|
||||
|
||||
getEpisodeQuery = `
|
||||
SELECT *
|
||||
FROM episodes WHERE show_imdb_id=$1 AND season=$2 AND episode=$3;`
|
||||
)
|
||||
|
||||
// Episode represents an episode
|
||||
@ -147,18 +151,19 @@ func (e *Episode) GetTorrents(env *web.Env, force bool) error {
|
||||
log.Debug("torrents found in database")
|
||||
case sql.ErrNoRows:
|
||||
log.Debug("torrent not found in database")
|
||||
// We'll need to GetTorrents from torrenters
|
||||
default:
|
||||
// Unexpected error
|
||||
return err
|
||||
}
|
||||
// If force is not specified, don't go further
|
||||
if !force {
|
||||
log.Debugf("returning %d torrents from db", len(episodeTorrents))
|
||||
// Add the torrents to the episode
|
||||
for _, t := range episodeTorrents {
|
||||
e.Torrents = append(e.Torrents, t.Torrent)
|
||||
}
|
||||
return nil
|
||||
// Will return ErrNoRows if the torrent wasn't found
|
||||
return err
|
||||
}
|
||||
|
||||
err = e.ShowEpisode.GetTorrents(env.Log)
|
||||
@ -179,3 +184,16 @@ func (e *Episode) GetTorrents(env *web.Env, force bool) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get returns an episode
|
||||
func (e *Episode) Get(env *web.Env) error {
|
||||
var episodeDB EpisodeDB
|
||||
err := env.Database.QueryRowx(getEpisodeQuery, e.ShowImdbID, e.Season, e.Episode).StructScan(&episodeDB)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
e.FillFromDB(&episodeDB)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/odwrtw/papi"
|
||||
@ -31,7 +32,7 @@ func RefreshDetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request)
|
||||
return DetailsHandler(env, w, r, true)
|
||||
}
|
||||
|
||||
// DetailsHandler handles details of a show
|
||||
// DetailsHandler handles details of an episode
|
||||
func DetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request, force bool) error {
|
||||
vars := mux.Vars(r)
|
||||
id := vars["id"]
|
||||
@ -282,3 +283,51 @@ func FromPolochon(env *web.Env, w http.ResponseWriter, r *http.Request) error {
|
||||
|
||||
return env.RenderJSON(w, shows)
|
||||
}
|
||||
|
||||
// RefreshEpisodeHandler refresh details of an episode
|
||||
func RefreshEpisodeHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
|
||||
return EpisodeDetailsHandler(env, w, r, true)
|
||||
}
|
||||
|
||||
// EpisodeDetailsHandler handles details of a show
|
||||
func EpisodeDetailsHandler(env *web.Env, w http.ResponseWriter, r *http.Request, force bool) error {
|
||||
vars := mux.Vars(r)
|
||||
id := vars["id"]
|
||||
|
||||
// No need to check errors here as the router is making sure that season
|
||||
// and episode are numbers
|
||||
season, _ := strconv.Atoi(vars["season"])
|
||||
episode, _ := strconv.Atoi(vars["episode"])
|
||||
|
||||
v := auth.GetCurrentUser(r, env.Log)
|
||||
user, ok := v.(*users.User)
|
||||
if !ok {
|
||||
return env.RenderError(w, errors.New("invalid user type"))
|
||||
}
|
||||
|
||||
s := New(id)
|
||||
e, err := s.GetEpisodeDetails(env, season, episode, force)
|
||||
if err != nil {
|
||||
return env.RenderError(w, err)
|
||||
}
|
||||
|
||||
if err := e.GetTorrents(env, force); err != nil {
|
||||
return env.RenderError(w, err)
|
||||
}
|
||||
|
||||
// Get the show from the polochon of the user
|
||||
pShow, err := getPolochonShow(user, id)
|
||||
if err != nil {
|
||||
env.Log.Warnf("error while getting polochon episode %s S%02dE%02d : %s", id, season, episode, err)
|
||||
}
|
||||
// Find if the user has a the episode in its polochon to add the
|
||||
// DownloadURL
|
||||
for _, pEpisode := range pShow.Episodes {
|
||||
if e.Season == pEpisode.Season && e.Episode == pEpisode.Episode {
|
||||
e.PolochonURL = pEpisode.PolochonURL
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return env.RenderJSON(w, e)
|
||||
}
|
||||
|
@ -190,16 +190,17 @@ func (s *Show) GetDetails(env *web.Env, user *users.User, force bool) error {
|
||||
switch err {
|
||||
case nil:
|
||||
log.Debug("show found in database")
|
||||
if !force {
|
||||
log.Debug("returning show from db")
|
||||
return nil
|
||||
}
|
||||
case sql.ErrNoRows:
|
||||
log.Debug("show not found in database")
|
||||
default:
|
||||
// Unexpected error
|
||||
return err
|
||||
}
|
||||
// If force is not specified, don't go further
|
||||
if !force {
|
||||
// Will return ErrNoRows if the show wasn't found
|
||||
return err
|
||||
}
|
||||
|
||||
// GetDetail
|
||||
err = s.Show.GetDetails(env.Log)
|
||||
@ -331,6 +332,60 @@ func (s *Show) GetEpisodes(env *web.Env, force bool) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetEpisode from database
|
||||
func (s *Show) GetEpisodeDetails(env *web.Env, seasonNb, episodeNb int, force bool) (*Episode, error) {
|
||||
log := env.Log.WithFields(logrus.Fields{
|
||||
"imdb_id": s.ImdbID,
|
||||
"season": seasonNb,
|
||||
"episode": episodeNb,
|
||||
"function": "show.GetEpisodeDetails",
|
||||
})
|
||||
log.Debugf("getting episode details")
|
||||
|
||||
e := NewEpisode()
|
||||
e.ShowImdbID = s.ImdbID
|
||||
e.Season = seasonNb
|
||||
e.Episode = episodeNb
|
||||
|
||||
if len(e.Detailers) == 0 {
|
||||
e.Detailers = env.Config.ShowDetailers
|
||||
}
|
||||
|
||||
var err error
|
||||
err = e.Get(env)
|
||||
switch err {
|
||||
case nil:
|
||||
log.Debug("episode found in database")
|
||||
case sql.ErrNoRows:
|
||||
log.Debug("episode not found in database")
|
||||
default:
|
||||
// Unexpected error
|
||||
return nil, err
|
||||
}
|
||||
// If force is not specified, don't go further
|
||||
if !force {
|
||||
// Will return ErrNoRows if the episode wasn't found
|
||||
return e, err
|
||||
}
|
||||
|
||||
// GetDetail of the episode
|
||||
err = e.ShowEpisode.GetDetails(env.Log)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Upsert the episode
|
||||
err = e.Upsert(env.Database)
|
||||
if err != nil {
|
||||
log.Debug("error while doing episode upsert func", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
log.Debug("episode inserted/updated in database")
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
// GetTorrents from the database or fetch them if needed
|
||||
func (s *Show) GetTorrents(env *web.Env, force bool) error {
|
||||
for _, e := range s.Episodes {
|
||||
|
@ -77,7 +77,7 @@ func main() {
|
||||
env.Handle("/users/edit", users.EditHandler).WithRole(users.UserRole).Methods("POST")
|
||||
|
||||
env.Handle("/movies/polochon", movies.FromPolochon).WithRole(users.UserRole).Methods("GET")
|
||||
env.Handle("/movies/{id:tt[0-9]+}/get_details", movies.GetDetailsHandler).WithRole(users.UserRole).Methods("GET")
|
||||
env.Handle("/movies/{id:tt[0-9]+}/refresh", movies.GetDetailsHandler).WithRole(users.UserRole).Methods("POST")
|
||||
env.Handle("/movies/{id:tt[0-9]+}", movies.DeleteHandler).WithRole(users.AdminRole).Methods("DELETE")
|
||||
env.Handle("/movies/explore", extmedias.Explore).WithRole(users.UserRole).Methods("GET")
|
||||
env.Handle("/movies/refresh", extmedias.Refresh).WithRole(users.UserRole).Methods("POST")
|
||||
@ -85,6 +85,7 @@ func main() {
|
||||
|
||||
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]+}/seasons/{season:[0-9]+}/episodes/{episode:[0-9]+}", shows.RefreshEpisodeHandler).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/explore", extmedias.ExploreShows).WithRole(users.UserRole).Methods("GET")
|
||||
|
@ -109,7 +109,7 @@ export function searchMovies(search) {
|
||||
export function getMovieDetails(imdbId) {
|
||||
return request(
|
||||
'MOVIE_GET_DETAILS',
|
||||
configureAxios().get(`/movies/${imdbId}/get_details`)
|
||||
configureAxios().post(`/movies/${imdbId}/refresh`)
|
||||
)
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user