canape/backend/movies/handlers.go

341 lines
8.7 KiB
Go

package movies
import (
"fmt"
"log"
"net/http"
"git.quimbo.fr/odwrtw/canape/backend/auth"
"git.quimbo.fr/odwrtw/canape/backend/models"
"git.quimbo.fr/odwrtw/canape/backend/subtitles"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux"
"github.com/odwrtw/papi"
polochon "github.com/odwrtw/polochon/lib"
"github.com/sirupsen/logrus"
)
// PolochonMoviesHandler will returns movies from Polochon
func PolochonMoviesHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
// Get the user from the request
user := auth.GetCurrentUser(r, env.Log)
// Get the polochon movies of the user
movies, err := getPolochonMovies(user, env)
if err != nil {
return env.RenderError(w, err)
}
// Get details with the polochon Detailer for each polochon.Movies we have
for _, m := range movies {
// First try from the db
first := []polochon.Detailer{env.Backend.Detailer}
// Then try from the polochon detailer
detailers := env.Config.Movie.Detailers
err := m.GetAndFetch(env, first, detailers)
if err != nil {
env.Log.Error(err)
}
// Look only for torrents in db
torrenters := []polochon.Torrenter{env.Backend.Torrenter}
err = m.GetTorrents(env, torrenters)
if err != nil {
env.Log.Errorf("error while getting movie torrents : %s", err)
continue
}
}
return env.RenderJSON(w, movies)
}
// RefreshMovieHandler refreshes details for a movie
func RefreshMovieHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
id := vars["id"]
// Get the user
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient(env.Database)
if err != nil {
return env.RenderError(w, err)
}
// Get the polochon movie
pMovie, err := client.GetMovie(id)
if err != nil && err != papi.ErrResourceNotFound {
log.Println("Error getting movie ", err)
}
// Check if the movie is wishlisted
isWishlisted, err := models.IsMovieWishlisted(env.Database, user.ID, id)
if err != nil {
log.Println("Error getting wishlisted movie ", err)
}
// Create a new movie
m := New(id, client, pMovie, isWishlisted, env.Config.PublicDir, env.Config.ImgURLPrefix)
// Refresh the movie's infos
if err := m.Refresh(env, env.Config.Movie.Detailers); err != nil {
env.Log.Error(err)
}
// Refresh the movie's torrents
if err := m.RefreshTorrents(env, env.Config.Movie.Torrenters); err != nil {
env.Log.Error(err)
}
// Get everything from DB again
detailers := []polochon.Detailer{env.Backend.Detailer}
err = m.GetDetails(env, detailers)
if err != nil {
return env.RenderError(w, err)
}
return env.RenderJSON(w, m)
}
// SearchMovie will search movie
func SearchMovie(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
search := vars["search"]
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient(env.Database)
if err != nil {
return env.RenderError(w, err)
}
// Get the user's polochon movies
pMovies, err := client.GetMovies()
if err != nil {
return env.RenderError(w, err)
}
// Get the user's wishlisted movies
moviesWishlist, err := models.GetMovieWishlist(env.Database, user.ID)
if err != nil {
return env.RenderError(w, err)
}
var movies []*polochon.Movie
searchers := env.Config.Movie.Searchers
// Search for the movie with all the Searchers
for _, searcher := range searchers {
result, err := searcher.SearchMovie(search, env.Log)
if err != nil {
env.Log.Errorf("error while searching movie : %s", err)
continue
}
movies = append(movies, result...)
}
env.Log.Debugf("got %d movies doing search %q", len(movies), search)
movieList := []*Movie{}
// For each movie found, fill the details
for _, m := range movies {
pMovie, _ := pMovies.Has(m.ImdbID)
movie := New(
m.ImdbID,
client,
pMovie,
moviesWishlist.IsMovieInWishlist(m.ImdbID),
env.Config.PublicDir,
env.Config.ImgURLPrefix,
)
// First check in the DB
before := []polochon.Detailer{env.Backend.Detailer}
// Then with the default detailers
after := env.Config.Movie.Detailers
err := movie.GetAndFetch(env, before, after)
if err != nil {
env.Log.Errorf("error while getting movie details : %s", err)
continue
}
// Look only for torrents in db
torrenters := []polochon.Torrenter{env.Backend.Torrenter}
err = movie.GetTorrents(env, torrenters)
if err != nil {
env.Log.Errorf("error while getting movie torrents : %s", err)
continue
}
movieList = append(movieList, movie)
}
return env.RenderJSON(w, movieList)
}
// PolochonDeleteHandler deletes the movie from polochon
func PolochonDeleteHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
id := vars["id"]
log := env.Log.WithFields(logrus.Fields{
"imdb_id": id,
"function": "movies.DeleteHandler",
})
log.Debugf("deleting movie")
// Get the user
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient(env.Database)
if err != nil {
return env.RenderError(w, err)
}
// Delete the movie
return client.Delete(&papi.Movie{ImdbID: id})
}
// AddToWishlist adds a movie to the user's wishlist
func AddToWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
id := vars["id"]
user := auth.GetCurrentUser(r, env.Log)
if err := models.AddMovieToWishlist(env.Database, user.ID, id); err != nil {
return env.RenderError(w, err)
}
return env.RenderOK(w, "Movie added to wishlist")
}
// DeleteFromWishlist deletes a movie from the user's wishlist
func DeleteFromWishlist(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
id := vars["id"]
user := auth.GetCurrentUser(r, env.Log)
if err := models.DeleteMovieFromWishlist(env.Database, user.ID, id); err != nil {
return env.RenderError(w, err)
}
return env.RenderOK(w, "Movie deleted from wishlist")
}
// GetWishlistHandler returns the wishlisted movies of a user
func GetWishlistHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient(env.Database)
if err != nil {
return env.RenderError(w, err)
}
// Get the user's polochon movies
pMovies, err := client.GetMovies()
if err != nil {
return env.RenderError(w, err)
}
// Get the user's wishlisted movies
moviesWishlist, err := models.GetMovieWishlist(env.Database, user.ID)
if err != nil {
return env.RenderError(w, err)
}
movieList := []*Movie{}
// For each movie found, fill the details
for _, imdbID := range moviesWishlist.List() {
pMovie, _ := pMovies.Has(imdbID)
movie := New(
imdbID,
client,
pMovie,
moviesWishlist.IsMovieInWishlist(imdbID),
env.Config.PublicDir,
env.Config.ImgURLPrefix,
)
// First check in the DB
before := []polochon.Detailer{env.Backend.Detailer}
// Then with the default detailers
after := env.Config.Movie.Detailers
err := movie.GetAndFetch(env, before, after)
if err != nil {
env.Log.Errorf("error while getting movie details : %s", err)
continue
}
// Look only for torrents in db
torrenters := []polochon.Torrenter{env.Backend.Torrenter}
err = movie.GetTorrents(env, torrenters)
if err != nil {
env.Log.Errorf("error while getting movie torrents : %s", err)
continue
}
movieList = append(movieList, movie)
}
return env.RenderJSON(w, movieList)
}
// RefreshMovieSubtitlesHandler refreshes details for a movie
func RefreshMovieSubtitlesHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
id := vars["id"]
// Get the user
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient(env.Database)
if err != nil {
return env.RenderError(w, err)
}
movie := &papi.Movie{ImdbID: id}
refreshSubs, err := client.UpdateSubtitles(movie)
if err != nil {
return env.RenderError(w, err)
}
subs := []subtitles.Subtitle{}
for _, lang := range refreshSubs {
subtitleURL, _ := client.SubtitleURL(movie, lang)
subs = append(subs, subtitles.Subtitle{
Language: lang,
URL: subtitleURL,
VVTFile: fmt.Sprintf("/movies/%s/subtitles/%s", id, lang),
})
}
return env.RenderJSON(w, subs)
}
// DownloadVVTSubtitle returns a vvt subtitle for the movie
func DownloadVVTSubtitle(env *web.Env, w http.ResponseWriter, r *http.Request) error {
vars := mux.Vars(r)
id := vars["id"]
lang := vars["lang"]
// Get the user
user := auth.GetCurrentUser(r, env.Log)
// Create a new papi client
client, err := user.NewPapiClient(env.Database)
if err != nil {
return env.RenderError(w, err)
}
url, err := client.SubtitleURL(&papi.Movie{ImdbID: id}, lang)
if err != nil {
return env.RenderError(w, err)
}
return subtitles.ConvertSubtitle(url, w)
}