ffmpeg-playout/store/store.go

84 lines
2 KiB
Go
Raw Normal View History

2020-11-05 18:34:54 +01:00
package store
import (
"errors"
"ffmpeg-playout/playout"
"log"
"sync"
"time"
)
type Store struct {
2020-12-26 17:20:18 +01:00
Playouts map[int]*playout.Job
2020-11-05 18:34:54 +01:00
DefaultDuration time.Duration
Outputs []string
2020-12-26 17:20:18 +01:00
*playout.Config
2020-11-05 18:34:54 +01:00
sync.RWMutex
}
2020-12-27 16:52:31 +01:00
func NewStore(o []string, defaultDuration string, playoutScriptPath string, playoutScript string, tmpDir string, prometheus string) (*Store, error) {
2020-12-26 17:20:18 +01:00
playouts := make(map[int]*playout.Job)
2020-11-05 18:34:54 +01:00
var d time.Duration
var err error
if d, err = time.ParseDuration(defaultDuration); err != nil {
log.Fatal("Failed to set Default Duration: ", err)
}
2020-12-26 17:20:18 +01:00
pcfg := playout.Config{
2020-12-27 16:52:31 +01:00
PlayoutScriptPath: playoutScriptPath,
PlayoutScript: playoutScript,
ProgressDir: tmpDir,
PrometheusPushGateway: prometheus,
2020-12-26 17:20:18 +01:00
}
store := &Store{Playouts: playouts, DefaultDuration: d, Outputs: o, Config: &pcfg}
2020-11-05 18:34:54 +01:00
return store, nil
}
2020-12-26 17:20:18 +01:00
func (s *Store) AddPlayout(p *playout.Job) (string, error) {
2020-11-05 18:34:54 +01:00
outputs := s.Outputs
for _, value := range s.Playouts {
if len(outputs) != 0 &&
(value.StartAt.After(p.StartAt) && value.StartAt.Before(p.StopAt) ||
value.StopAt.After(p.StartAt) && value.StopAt.Before(p.StopAt) ||
p.StartAt.After(value.StartAt) && p.StartAt.Before(value.StopAt) ||
p.StopAt.After(value.StartAt) && p.StopAt.Before(value.StopAt)) {
inSlice, index := stringInSlice(value.Output, outputs)
if inSlice {
outputs = remove(outputs, index)
}
}
}
var output string
if len(outputs) != 0 {
output = outputs[0]
} else {
2020-12-26 17:20:18 +01:00
return "", errors.New("no output available")
2020-11-05 18:34:54 +01:00
}
p.Output = output
2020-12-26 17:20:18 +01:00
s.Playouts[p.ID] = p
return output, nil
}
func (s *Store) DeletePlayout(id int) {
s.Lock()
delete(s.Playouts, id)
s.Unlock()
2020-11-05 18:34:54 +01:00
}
//https://stackoverflow.com/a/15323988/10997297
func stringInSlice(a string, list []string) (bool, int) {
for index, b := range list {
if b == a {
return true, index
}
}
return false, 0
}
func remove(s []string, i int) []string {
s[i] = s[len(s)-1]
// We do not need to put s[i] at the end, as it will be discarded anyway
return s[:len(s)-1]
}