166 lines
3.1 KiB
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)
|
|
}
|