Files
polaris/server/storage.go
2024-07-31 14:41:57 +08:00

139 lines
3.5 KiB
Go

package server
import (
"fmt"
"polaris/db"
"polaris/ent/media"
storage1 "polaris/ent/storage"
"polaris/log"
"polaris/pkg/storage"
"polaris/pkg/utils"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
)
func (s *Server) GetAllStorage(c *gin.Context) (interface{}, error) {
data := s.db.GetAllStorage()
return data, nil
}
func (s *Server) AddStorage(c *gin.Context) (interface{}, error) {
var in db.StorageInfo
if err := c.ShouldBindJSON(&in); err != nil {
return nil, errors.Wrap(err, "bind json")
}
if in.Implementation == "webdav" {
//test webdav
wd := in.ToWebDavSetting()
st, err := storage.NewWebdavStorage(wd.URL, wd.User, wd.Password, in.TvPath, false)
if err != nil {
return nil, errors.Wrap(err, "new webdav")
}
fs, err := st.ReadDir(".")
if err != nil {
return nil, errors.Wrap(err, "test read")
}
for _, f := range fs {
log.Infof("file name: %v", f.Name())
}
}
log.Infof("received add storage input: %v", in)
err := s.db.AddStorage(&in)
return nil, err
}
func (s *Server) DeleteStorage(c *gin.Context) (interface{}, error) {
ids := c.Param("id")
id, err := strconv.Atoi(ids)
if err != nil {
return nil, fmt.Errorf("id is not int: %v", ids)
}
err = s.db.DeleteStorage(id)
return nil, err
}
func (s *Server) SuggestedSeriesFolderName(c *gin.Context) (interface{}, error) {
ids := c.Param("tmdb_id")
id, err := strconv.Atoi(ids)
if err != nil {
return nil, fmt.Errorf("id is not int: %v", ids)
}
d, err := s.MustTMDB().GetTvDetails(id, s.language)
if err != nil {
return nil, errors.Wrap(err, "get tv details")
}
name := d.Name
originalName := d.OriginalName
year := strings.Split(d.FirstAirDate, "-")[0]
if utils.ContainsChineseChar(originalName) || name == originalName {
name = originalName
} else {
name = fmt.Sprintf("%s %s", name, originalName)
}
if year != "" {
name = fmt.Sprintf("%s (%s)", name, year)
}
log.Infof("tv series of tmdb id %v suggestting name is %v", id, name)
return gin.H{"name": name}, nil
}
func (s *Server) SuggestedMovieFolderName(c *gin.Context) (interface{}, error) {
ids := c.Param("tmdb_id")
id, err := strconv.Atoi(ids)
if err != nil {
return nil, fmt.Errorf("id is not int: %v", ids)
}
d1, err := s.MustTMDB().GetMovieDetails(id, s.language)
if err != nil {
return nil, errors.Wrap(err, "get movie details")
}
name := d1.Title
originalName := d1.OriginalTitle
year := strings.Split(d1.ReleaseDate, "-")[0]
if utils.ContainsChineseChar(originalName) || name == originalName {
name = originalName
} else {
name = fmt.Sprintf("%s %s", name, originalName)
}
if year != "" {
name = fmt.Sprintf("%s (%s)", name, year)
}
log.Infof("tv series of tmdb id %v suggestting name is %v", id, name)
return gin.H{"name": name}, nil
}
func (s *Server) getStorage(storageId int, mediaType media.MediaType) (storage.Storage, error) {
st := s.db.GetStorage(storageId)
targetPath := st.TvPath
if mediaType == media.MediaTypeMovie {
targetPath = st.MoviePath
}
switch st.Implementation {
case storage1.ImplementationLocal:
storageImpl1, err := storage.NewLocalStorage(targetPath)
if err != nil {
return nil, errors.Wrap(err, "new local")
}
return storageImpl1, nil
case storage1.ImplementationWebdav:
ws := st.ToWebDavSetting()
storageImpl1, err := storage.NewWebdavStorage(ws.URL, ws.User, ws.Password, targetPath, ws.ChangeFileHash == "true")
if err != nil {
return nil, errors.Wrap(err, "new webdav")
}
return storageImpl1, nil
}
return nil, errors.New("no storage found")
}