121 lines
2.3 KiB
Go
121 lines
2.3 KiB
Go
package videoparser
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os/exec"
|
|
"strconv"
|
|
)
|
|
|
|
func AppendMessage(message string) {
|
|
msger := TextMessage{
|
|
MessageBase: MessageBase{Action: "message"},
|
|
Message: message,
|
|
}
|
|
marshal, err := json.Marshal(msger)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
IndexSender.Publish(marshal)
|
|
}
|
|
|
|
func SendEvent(message string) {
|
|
msger := ReindexEvent{
|
|
MessageBase: MessageBase{Action: "reindexAction"},
|
|
Event: message,
|
|
}
|
|
marshal, err := json.Marshal(msger)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
IndexSender.Publish(marshal)
|
|
}
|
|
|
|
// ext dependency support check
|
|
func checkExtDependencySupport() *ExtDependencySupport {
|
|
var extDepsAvailable ExtDependencySupport
|
|
|
|
extDepsAvailable.FFMpeg = commandExists("ffmpeg")
|
|
extDepsAvailable.MediaInfo = commandExists("mediainfo")
|
|
|
|
return &extDepsAvailable
|
|
}
|
|
|
|
// check if a specific system command is available
|
|
func commandExists(cmd string) bool {
|
|
_, err := exec.LookPath(cmd)
|
|
return err == nil
|
|
}
|
|
|
|
// parse the thumbail picture from video file
|
|
func parseFFmpegPic(path string) (*string, error) {
|
|
app := "ffmpeg"
|
|
|
|
cmd := exec.Command(app,
|
|
"-hide_banner",
|
|
"-loglevel", "panic",
|
|
"-ss", "00:04:00",
|
|
"-i", path,
|
|
"-vframes", "1",
|
|
"-q:v", "2",
|
|
"-f", "singlejpeg",
|
|
"pipe:1")
|
|
|
|
stdout, err := cmd.Output()
|
|
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
fmt.Println(string(err.(*exec.ExitError).Stderr))
|
|
return nil, err
|
|
}
|
|
|
|
strEncPic := base64.StdEncoding.EncodeToString(stdout)
|
|
if strEncPic == "" {
|
|
return nil, nil
|
|
}
|
|
backpic64 := fmt.Sprintf("data:image/jpeg;base64,%s", strEncPic)
|
|
|
|
return &backpic64, nil
|
|
}
|
|
|
|
func getVideoAttributes(path string) *VideoAttributes {
|
|
app := "mediainfo"
|
|
|
|
arg0 := path
|
|
arg1 := "--Output=JSON"
|
|
|
|
cmd := exec.Command(app, arg1, "-f", arg0)
|
|
stdout, err := cmd.Output()
|
|
|
|
var t struct {
|
|
Media struct {
|
|
Track []struct {
|
|
Duration string
|
|
FileSize string
|
|
Width string
|
|
}
|
|
}
|
|
}
|
|
err = json.Unmarshal(stdout, &t)
|
|
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return nil
|
|
}
|
|
|
|
duration, err := strconv.ParseFloat(t.Media.Track[0].Duration, 32)
|
|
filesize, err := strconv.Atoi(t.Media.Track[0].FileSize)
|
|
width, err := strconv.Atoi(t.Media.Track[1].Width)
|
|
|
|
ret := VideoAttributes{
|
|
Duration: float32(duration),
|
|
FileSize: uint(filesize),
|
|
Width: uint(width),
|
|
}
|
|
|
|
return &ret
|
|
}
|