Add: get alternative avatar from directory
This commit is contained in:
@@ -1,11 +1,17 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"msw-open-music/pkg/database"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (api *API) HandelGetFileAvatar(w http.ResponseWriter, r *http.Request) {
|
func (api *API) HandelGetFileAvatar(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -33,14 +39,70 @@ func (api *API) HandelGetFileAvatar(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Println("[api] Get avatar of file", path)
|
log.Println("[api] Get avatar of file", path)
|
||||||
|
buff := make([]byte, 0)
|
||||||
|
cache := bytes.NewBuffer(buff)
|
||||||
cmd := exec.Command("ffmpeg", "-i", path, "-c:v", "libwebp_anim", "-update", "1", "-f", "image2pipe", "-")
|
cmd := exec.Command("ffmpeg", "-i", path, "-c:v", "libwebp_anim", "-update", "1", "-f", "image2pipe", "-")
|
||||||
|
cmd.Stdout = cache
|
||||||
|
|
||||||
|
err = cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
api.HandleGetAlternativeFileAvatar(w, r, file)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "image/webp")
|
||||||
|
io.Copy(w, cache)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (api *API) HandleGetAlternativeFileAvatar(w http.ResponseWriter, r *http.Request, f *database.File) {
|
||||||
|
var err error
|
||||||
|
dir, err := f.Dir()
|
||||||
|
if err != nil {
|
||||||
|
api.HandleError(w, r, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Println("[api] Get alternative avatar in dir", dir)
|
||||||
|
files, err := os.ReadDir(dir)
|
||||||
|
if err != nil {
|
||||||
|
api.HandleError(w, r, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
avatar, err := findAvatarFile(files)
|
||||||
|
avatarPath := path.Join(dir, avatar)
|
||||||
|
if err != nil {
|
||||||
|
api.HandleError(w, r, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cmd := exec.Command("ffmpeg", "-i", avatarPath, "-c:v", "libwebp_anim", "-f", "image2pipe", "-")
|
||||||
cmd.Stdout = w
|
cmd.Stdout = w
|
||||||
w.Header().Set("Content-Type", "image/webp")
|
w.Header().Set("Content-Type", "image/webp")
|
||||||
|
|
||||||
err = cmd.Run()
|
err = cmd.Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
|
||||||
api.HandleError(w, r, err)
|
api.HandleError(w, r, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func findAvatarFile(files []os.DirEntry) (string, error) {
|
||||||
|
for _, file := range files {
|
||||||
|
if isAvatarType(file.Name()) {
|
||||||
|
return file.Name(), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", errors.New("Cannot find avatar file")
|
||||||
|
}
|
||||||
|
|
||||||
|
var avatarFileTypes = []string{
|
||||||
|
".jpg",
|
||||||
|
".png",
|
||||||
|
}
|
||||||
|
|
||||||
|
func isAvatarType(filename string) bool {
|
||||||
|
for _, t := range avatarFileTypes {
|
||||||
|
if strings.HasSuffix(strings.ToLower(filename), t) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,13 +6,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type File struct {
|
type File struct {
|
||||||
Db *Database `json:"-"`
|
Db *Database `json:"-"`
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
Folder_id int64 `json:"folder_id"`
|
Folder_id int64 `json:"folder_id"`
|
||||||
Foldername string `json:"foldername"`
|
Foldername string `json:"foldername"`
|
||||||
Realname string `json:"-"`
|
Realname string `json:"-"`
|
||||||
Filename string `json:"filename"`
|
Filename string `json:"filename"`
|
||||||
Filesize int64 `json:"filesize"`
|
Filesize int64 `json:"filesize"`
|
||||||
|
folderCache *Folder
|
||||||
}
|
}
|
||||||
|
|
||||||
type Folder struct {
|
type Folder struct {
|
||||||
@@ -75,9 +76,23 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (f *File) Path() (string, error) {
|
func (f *File) Path() (string, error) {
|
||||||
folder, err := f.Db.GetFolder(f.Folder_id)
|
var err error
|
||||||
|
if f.folderCache == nil {
|
||||||
|
f.folderCache, err = f.Db.GetFolder(f.Folder_id)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return filepath.Join(folder.Folder, f.Realname), nil
|
return filepath.Join(f.folderCache.Folder, f.Realname), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *File) Dir() (string, error) {
|
||||||
|
var err error
|
||||||
|
if f.folderCache == nil {
|
||||||
|
f.folderCache, err = f.Db.GetFolder(f.Folder_id)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return f.folderCache.Folder, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user