Files
msw-open-music/pkg/api/handle_get_file_info.go

166 lines
3.1 KiB
Go

package api
import (
"encoding/json"
"io"
"log"
"net/http"
"net/url"
"os"
"os/exec"
"strconv"
)
type GetFileRequest struct {
ID int64 `json:"id"`
}
func (api *API) HandleGetFileInfo(w http.ResponseWriter, r *http.Request) {
getFileRequest := &GetFileRequest{
ID: -1,
}
err := json.NewDecoder(r.Body).Decode(getFileRequest)
if err != nil {
api.HandleError(w, r, err)
return
}
// check empty
if getFileRequest.ID < 0 {
api.HandleErrorString(w, r, `"id" can't be none or negative`)
return
}
log.Println("[api] Get file info", getFileRequest.ID)
file, err := api.Db.GetFile(getFileRequest.ID)
if err != nil {
api.HandleError(w, r, err)
return
}
err = json.NewEncoder(w).Encode(file)
if err != nil {
api.HandleError(w, r, err)
return
}
}
func (api *API) HandleGetFileFfprobeInfo(w http.ResponseWriter, r *http.Request) {
getFileRequest := &GetFileRequest {
ID: -1,
}
err := json.NewDecoder(r.Body).Decode(getFileRequest)
if err != nil {
api.HandleError(w, r, err)
return
}
// check empty
if getFileRequest.ID < 0 {
api.HandleErrorString(w, r, `"id" can't be none or negative`)
return
}
log.Println("[api] Get file Ffprobe info", getFileRequest.ID)
file, err := api.Db.GetFile(getFileRequest.ID)
if err != nil {
api.HandleError(w, r, err)
return
}
path, err := file.Path()
if err != nil {
api.HandleError(w, r, err)
return
}
cmd := exec.Command("ffprobe", "-i", path, "-hide_banner")
cmd.Stderr = w
err = cmd.Run()
if err != nil {
api.HandleError(w, r, err)
return
}
}
// /api/v1/get_file?id=123
// get raw file with io.Copy method
func (api *API) HandleGetFile(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
ids := q["id"]
_id, err := strconv.Atoi(ids[0])
if err != nil {
api.HandleError(w, r, err)
return
}
id := int64(_id)
// check empty
if id < 0 {
api.HandleErrorString(w, r, `"id" can't be none or negative`)
return
}
file, err := api.Db.GetFile(id)
if err != nil {
api.HandleError(w, r, err)
return
}
path, err := file.Path()
if err != nil {
api.HandleError(w, r, err)
return
}
log.Println("[api] Get pipe raw file", path)
src, err := os.Open(path)
if err != nil {
api.HandleError(w, r, err)
return
}
defer src.Close()
io.Copy(w, src)
}
// /get_file_direct?id=1
// get raw file with http.ServeFile method
func (api *API) HandleGetFileDirect(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
ids := q["id"]
if len(ids) == 0 {
api.HandleErrorString(w, r, `parameter "id" can't be empty`)
return
}
id, err := strconv.Atoi(ids[0])
if err != nil {
api.HandleErrorString(w, r, `parameter "id" should be an integer`)
return
}
file, err := api.Db.GetFile(int64(id))
if err != nil {
api.HandleError(w, r, err)
return
}
path, err := file.Path()
if err != nil {
api.HandleError(w, r, err)
return
}
// set header for filename
filename := file.Filename
// encode filename to URL
filename = url.PathEscape(filename)
w.Header().Set("Content-Disposition", "inline; filename*=UTF-8''"+filename)
log.Println("[api] Get direct raw file", path)
http.ServeFile(w, r, path)
}