78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
|
package store
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"ffmpeg-playout/playout"
|
||
|
"fmt"
|
||
|
"github.com/google/uuid"
|
||
|
"log"
|
||
|
"sync"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type Store struct {
|
||
|
Playouts map[uuid.UUID]*playout.Job
|
||
|
DefaultDuration time.Duration
|
||
|
Outputs []string
|
||
|
sync.RWMutex
|
||
|
}
|
||
|
|
||
|
func NewStore(o []string, defaultDuration string) (*Store, error) {
|
||
|
playouts := make(map[uuid.UUID]*playout.Job)
|
||
|
|
||
|
var d time.Duration
|
||
|
var err error
|
||
|
if d, err = time.ParseDuration(defaultDuration); err != nil {
|
||
|
log.Fatal("Failed to set Default Duration: ", err)
|
||
|
}
|
||
|
|
||
|
store := &Store{Playouts: playouts, DefaultDuration: d, Outputs: o}
|
||
|
|
||
|
return store, nil
|
||
|
}
|
||
|
|
||
|
func (s *Store) AddPlayout(p *playout.Job) (uuid.UUID, error) {
|
||
|
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 {
|
||
|
return uuid.Nil, errors.New("no output available")
|
||
|
}
|
||
|
uid, err := uuid.NewUUID()
|
||
|
if err != nil {
|
||
|
return uuid.Nil, fmt.Errorf("couldn't generate uuid: %s", err.Error())
|
||
|
}
|
||
|
p.Output = output
|
||
|
s.Playouts[uid] = p
|
||
|
return uid, nil
|
||
|
}
|
||
|
|
||
|
//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]
|
||
|
}
|