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 } } }