diff --git a/src/internal/movies/handlers.go b/src/internal/movies/handlers.go index 8fc4dea..8f28f4d 100644 --- a/src/internal/movies/handlers.go +++ b/src/internal/movies/handlers.go @@ -5,8 +5,12 @@ import ( "net" "net/http" "net/url" + "sort" + "strconv" "github.com/odwrtw/papi" + polochon "github.com/odwrtw/polochon/lib" + "github.com/odwrtw/polochon/modules/pam" "github.com/odwrtw/trakttv" "gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/auth" @@ -17,6 +21,12 @@ import ( var ErrPolochonUnavailable = fmt.Errorf("Invalid polochon address") +type SortByTitle []*Movie + +func (a SortByTitle) Len() int { return len(a) } +func (a SortByTitle) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a SortByTitle) Less(i, j int) bool { return a[i].Title < a[j].Title } + func getPolochonMovies(user *users.User) ([]*Movie, error) { movies := []*Movie{} @@ -49,13 +59,56 @@ func getPolochonMovies(user *users.User) ([]*Movie, error) { return movies, err } for _, pmovie := range pmovies { - movies = append(movies, New(pmovie.ImdbID)) + movie := New(pmovie.ImdbID) + movie.PolochonURL, err = client.DownloadURL(&papi.Movie{ImdbID: movie.ImdbID}) + if err != nil { + return nil, err + } + movies = append(movies, movie) } return movies, nil } func FromPolochon(env *web.Env, w http.ResponseWriter, r *http.Request) error { v := auth.GetCurrentUser(r, env.Log) + params := struct { + Sort string + Order string + Start int + Limit int + }{ + Sort: "title", + Order: "asc", + Start: 0, + Limit: 50, + } + + err := r.ParseForm() + if err != nil { + return err + } + + if sort := r.FormValue("sort"); sort != "" { + params.Sort = sort + } + + if order := r.FormValue("order"); order != "" { + params.Order = order + } + if start := r.FormValue("start"); start != "" { + n, err := strconv.Atoi(start) + if err != nil { + return err + } + params.Start = n + } + if limit := r.FormValue("limit"); limit != "" { + n, err := strconv.Atoi(limit) + if err != nil { + return err + } + params.Limit = n + } user, ok := v.(*users.User) if !ok { @@ -75,16 +128,46 @@ func FromPolochon(env *web.Env, w http.ResponseWriter, r *http.Request) error { return err } + var polochonConfig config.UserPolochon + err = user.GetConfig("polochon", &polochonConfig) + if err != nil { + return err + } + + detailer, err := pam.New(&pam.Params{ + Endpoint: polochonConfig.URL, + Token: polochonConfig.Token, + }) + for _, m := range movies { + m.Detailers = []polochon.Detailer{detailer} err := m.GetDetails(env, false) if err != nil { env.Log.Error(err) } } - env.Log.Info(movies) + var smovies sort.Interface - web.SetData(r, "movies", movies) + switch params.Sort { + case "title": + smovies = SortByTitle(movies) + default: + return fmt.Errorf("invalid sort param") + } + + switch params.Order { + case "asc": + break + case "desc": + smovies = sort.Reverse(smovies) + default: + return fmt.Errorf("invalid order param") + } + + sort.Sort(smovies) + + web.SetData(r, "movies", movies[params.Start:params.Start+params.Limit]) return env.Rends(w, r, "movies/library") } diff --git a/src/internal/movies/movies.go b/src/internal/movies/movies.go index 54eebd2..f1f60bd 100644 --- a/src/internal/movies/movies.go +++ b/src/internal/movies/movies.go @@ -50,6 +50,7 @@ var ( type Movie struct { sqly.BaseModel polochon.Movie + PolochonURL string } func New(imdbID string) *Movie { diff --git a/src/templates/movies/library.tmpl b/src/templates/movies/library.tmpl index 3005c89..ee7a38b 100644 --- a/src/templates/movies/library.tmpl +++ b/src/templates/movies/library.tmpl @@ -43,7 +43,12 @@
{{ .Plot }}
diff --git a/src/templates/navbar.tmpl b/src/templates/navbar.tmpl index e7df2e9..b5ad630 100644 --- a/src/templates/navbar.tmpl +++ b/src/templates/navbar.tmpl @@ -16,7 +16,7 @@