The HTML5 videos can only ready subtitles in the VVT format, let's convert the srt files on the fly to make the browser happy
362 lines
9.1 KiB
Go
362 lines
9.1 KiB
Go
package movies
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/gorilla/mux"
|
|
"github.com/odwrtw/papi"
|
|
polochon "github.com/odwrtw/polochon/lib"
|
|
|
|
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/auth"
|
|
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/backend"
|
|
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/config"
|
|
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/subtitles"
|
|
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/users"
|
|
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/web"
|
|
)
|
|
|
|
// PolochonMoviesHandler will returns movies from Polochon
|
|
func PolochonMoviesHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
|
|
// Get the user from the request
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return env.RenderError(w, fmt.Errorf("invalid user type"))
|
|
}
|
|
|
|
// Get the polochon movies of the user
|
|
movies, err := getPolochonMovies(user, env)
|
|
if err != nil {
|
|
return env.RenderError(w, err)
|
|
}
|
|
|
|
// Create a new polochon Detailer to get infos about the movies we just got
|
|
var polochonConfig config.UserPolochon
|
|
err = user.GetConfig("polochon", &polochonConfig)
|
|
if err != nil {
|
|
return 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.MovieDetailers
|
|
err := m.GetAndFetch(env, first, detailers)
|
|
if err != nil {
|
|
env.Log.Error(err)
|
|
}
|
|
}
|
|
|
|
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
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return fmt.Errorf("invalid user type")
|
|
}
|
|
|
|
// Create a new papi client
|
|
client, err := user.NewPapiClient()
|
|
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 := backend.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.MovieDetailers); err != nil {
|
|
env.Log.Error(err)
|
|
}
|
|
|
|
// Refresh the movie's torrents
|
|
if err := m.RefreshTorrents(env, env.Config.MovieTorrenters); err != nil {
|
|
env.Log.Error(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"]
|
|
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return env.RenderError(w, errors.New("invalid user"))
|
|
}
|
|
|
|
// Create a new papi client
|
|
client, err := user.NewPapiClient()
|
|
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 := backend.GetMovieWishlist(env.Database, user.ID)
|
|
if err != nil {
|
|
return env.RenderError(w, err)
|
|
}
|
|
|
|
var movies []*polochon.Movie
|
|
searchers := env.Config.MovieSearchers
|
|
// 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.MovieDetailers
|
|
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
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return env.RenderError(w, errors.New("invalid user type"))
|
|
}
|
|
|
|
// Create a new papi client
|
|
client, err := user.NewPapiClient()
|
|
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"]
|
|
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return env.RenderError(w, errors.New("invalid user type"))
|
|
}
|
|
|
|
if err := backend.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"]
|
|
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return env.RenderError(w, errors.New("invalid user type"))
|
|
}
|
|
|
|
if err := backend.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 {
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return env.RenderError(w, errors.New("invalid user type"))
|
|
}
|
|
|
|
// Create a new papi client
|
|
client, err := user.NewPapiClient()
|
|
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 := backend.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.MovieDetailers
|
|
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
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return fmt.Errorf("invalid user type")
|
|
}
|
|
|
|
// Create a new papi client
|
|
client, err := user.NewPapiClient()
|
|
if err != nil {
|
|
return env.RenderError(w, err)
|
|
}
|
|
|
|
err = client.UpdateSubtitles(&papi.Movie{ImdbID: id})
|
|
if err != nil {
|
|
return env.RenderError(w, err)
|
|
}
|
|
|
|
return env.RenderOK(w, "Subtitles refreshed")
|
|
}
|
|
|
|
// 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
|
|
v := auth.GetCurrentUser(r, env.Log)
|
|
user, ok := v.(*users.User)
|
|
if !ok {
|
|
return fmt.Errorf("invalid user type")
|
|
}
|
|
|
|
// Create a new papi client
|
|
client, err := user.NewPapiClient()
|
|
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)
|
|
}
|