ffmpeg-playout/playout/playout.go

74 lines
1.6 KiB
Go

package playout
import (
"fmt"
"log"
"os/exec"
"path"
"time"
)
type Job struct {
ID int
Version string
StartAt time.Time
StopAt time.Time
Source string
Output string
ControlChannel chan string
}
type Config struct {
PlayoutScriptPath string
PlayoutScript string
ProgressDir string
}
func (p *Job) Playout(cfg *Config) {
// TODO delete playout Job from store after finishing/aborting playout
for {
log.Println(p.StartAt)
log.Println(time.Until(p.StartAt))
select {
case ctrlMsg := <-p.ControlChannel:
fmt.Println(ctrlMsg)
continue
case <-time.After(time.Until(p.StartAt)):
log.Println("Start Playout")
progressPath := path.Join(cfg.ProgressDir, string(p.ID))
playoutScript := path.Join(cfg.PlayoutScriptPath, cfg.PlayoutScript)
cmd := exec.Command(playoutScript, //nolint:gosec
fmt.Sprintf("-i %v", p.Source),
fmt.Sprintf("-o %v", p.Output),
fmt.Sprintf("-p %v", progressPath),
)
cmd.Dir = cfg.PlayoutScriptPath
err := cmd.Start()
if err != nil {
log.Printf("Failed to start Playout %v: %v", p.ID, err)
}
pid := cmd.Process.Pid
log.Printf("PID for %v: %v", p.ID, pid)
ProcessManagement:
for {
select {
case ctrlMsg := <-p.ControlChannel:
log.Println(ctrlMsg)
continue
case <-time.After(time.Until(p.StopAt)):
cmd.Process.Kill()
break ProcessManagement
}
}
err = cmd.Wait()
if err != nil {
log.Println(err)
}
log.Println(cmd.ProcessState.ExitCode())
log.Printf("Finish %v", p.ID)
break
}
}
}