ffmpeg-playout/main.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))
}