101 lines
2.2 KiB
Go
101 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"ffmpeg-playout/playout"
|
|
"ffmpeg-playout/store"
|
|
"fmt"
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/fiber/v2/middleware/cors"
|
|
"github.com/ilyakaznacheev/cleanenv"
|
|
"log"
|
|
"time"
|
|
)
|
|
|
|
type Config struct {
|
|
Outputs []string `yaml:"outputs"`
|
|
Address string `yaml:"address" env:"ADDRESS" env-default:":3000"`
|
|
DefaultDuration string `yaml:"default_duration" env:"DEFAULT_DURATION" env-default:"15"`
|
|
}
|
|
|
|
type Job struct {
|
|
StartAt string `json:"startAt,omitempty"`
|
|
StopAt string `json:"stopAt,omitempty"`
|
|
Source string `json:"source"`
|
|
}
|
|
|
|
func schedulePlayout(s *store.Store) fiber.Handler {
|
|
// TODO return custom error
|
|
return func(c *fiber.Ctx) error {
|
|
var p playout.Job
|
|
job := new(Job)
|
|
var err error
|
|
if err := c.BodyParser(job); err != nil {
|
|
log.Println("got defective request: ", err)
|
|
c.SendStatus(400)
|
|
return err
|
|
}
|
|
|
|
if job.Source == "" {
|
|
c.SendStatus(400)
|
|
return errors.New("Got Empty Source. I can't play »Nothing«")
|
|
}
|
|
p.Source = job.Source
|
|
|
|
if p.StartAt, err = time.Parse(time.RFC3339, job.StartAt); err != nil {
|
|
log.Println("got strange date: ", job.StartAt, "; error:", err)
|
|
c.SendStatus(400)
|
|
return err
|
|
}
|
|
|
|
if job.StopAt != "" {
|
|
if p.StopAt, err = time.Parse(time.RFC3339, job.StopAt); err != nil {
|
|
log.Println("got strange date: ", job.StopAt, "; error:", err)
|
|
c.SendStatus(400)
|
|
return err
|
|
}
|
|
} else {
|
|
p.StopAt = p.StartAt.Add(s.DefaultDuration)
|
|
}
|
|
|
|
s.Lock()
|
|
uid, err := s.AddPlayout(&p)
|
|
s.Unlock()
|
|
if err != nil {
|
|
c.SendStatus(500)
|
|
return fmt.Errorf("can not schedule playout: %s", err)
|
|
}
|
|
c.SendString(uid.String())
|
|
|
|
go p.Playout()
|
|
|
|
// staus 409 when no schedule possible
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
var cfg Config
|
|
|
|
func main() {
|
|
// TODO configure config file path via cmd parameter
|
|
if err := cleanenv.ReadConfig("config.yml", &cfg); err != nil {
|
|
log.Fatal("No configfile: ", err)
|
|
}
|
|
|
|
s, err := store.NewStore(cfg.Outputs, cfg.DefaultDuration)
|
|
if err != nil {
|
|
log.Fatal("Failed to init Store: ", err.Error())
|
|
}
|
|
|
|
app := fiber.New()
|
|
app.Use(cors.New())
|
|
|
|
app.Get("/", func(c *fiber.Ctx) error {
|
|
return c.SendString("Hello, World!")
|
|
})
|
|
app.Post("/schedulePlayout", schedulePlayout(s))
|
|
|
|
log.Fatal(app.Listen(cfg.Address))
|
|
}
|