You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
synctv/server/handlers/vendors/vendorEmby/list.go

92 lines
2.0 KiB
Go

package vendorEmby
import (
"errors"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
json "github.com/json-iterator/go"
"github.com/synctv-org/synctv/internal/op"
"github.com/synctv-org/synctv/internal/vendor"
"github.com/synctv-org/synctv/server/model"
"github.com/synctv-org/synctv/utils"
"github.com/synctv-org/vendors/api/emby"
)
type ListReq struct {
Path string `json:"path"`
}
func (r *ListReq) Validate() error {
i, err := strconv.Atoi(r.Path)
if err != nil {
return err
}
if i < 0 {
return errors.New("path is invalid")
}
return nil
}
func (r *ListReq) Decode(ctx *gin.Context) error {
return json.NewDecoder(ctx.Request.Body).Decode(r)
}
func List(ctx *gin.Context) {
user := ctx.MustGet("user").(*op.User)
req := ListReq{}
if err := model.Decode(ctx, &req); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
aucd, err := user.EmbyCache().Get(ctx)
if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return
}
page, size, err := utils.GetPageAndMax(ctx)
if err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
cli := vendor.LoadEmbyClient(ctx.Query("backend"))
data, err := cli.FsList(ctx, &emby.FsListReq{
Host: aucd.Host,
Path: req.Path,
Token: aucd.ApiKey,
Limit: uint64(size),
StartIndex: uint64((page - 1) * size),
})
if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return
}
var resp model.VendorFSListResp
for _, p := range data.Paths {
var n = p.Name
if p.Path == "1" {
n = ""
}
resp.Paths = append(resp.Paths, &model.Path{
Name: n,
Path: p.Path,
})
}
for _, i := range data.Items {
resp.Items = append(resp.Items, &model.Item{
Name: i.Name,
Path: i.Id,
IsDir: i.IsFolder,
})
}
resp.Total = data.Total
ctx.JSON(http.StatusOK, model.NewApiDataResp(resp))
}