Files
rkKVM/cmd/kvm/main.go
2024-11-19 22:08:12 +01:00

71 lines
1.5 KiB
Go

package main
import (
"fmt"
"rkkvm/config"
"rkkvm/external/ffmpeg"
"rkkvm/external/mpp"
"rkkvm/external/process"
"rkkvm/http/route"
"rkkvm/http/rtc"
"strings"
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
)
const ConfigFile = "/etc/rkkvm/rkkvm.yml"
func main() {
if err := config.Load(ConfigFile); err != nil {
config.Init()
if err = config.Save(ConfigFile); err != nil {
log.Error(err)
}
}
cfg := config.Get()
lvl, err := log.ParseLevel(cfg.LogLevel)
if err == nil {
log.SetLevel(lvl)
} else {
log.Println("Failed to parse log level, use default level: info")
}
// FIXME: hardcoded device
if err := mpp.NewTest("/dev/video0"); err != nil {
log.Fatalf("Failed to open device: %v", err)
}
defer mpp.GetInstance().Close()
webrtc, err := rtc.InitListener(cfg.WebRtc.Host, cfg.WebRtc.VideoPort, cfg.WebRtc.AudioPort)
if err != nil {
log.Fatal(err)
}
defer webrtc.Close()
go webrtc.VideoListenerRead()
go webrtc.AudioListenerRead()
if cfg.Stream.Source == config.StreamSourceMjpeg {
ustreamer := process.Init(cfg.UStreamer.Path, strings.Split(cfg.UStreamer.Args, " "))
ustreamer.Start()
//go ustreamer.Watch()
} else if cfg.Stream.Source == config.StreamSourceH264 {
ffmpeg.InitFFmpeg()
} else {
log.Fatalf("unsupported stream source type: %v", cfg.Stream.Source)
}
r := gin.Default()
r.Use(gin.Recovery())
route.Api(r)
route.Static(r)
if cfg.NanoKVMUISupport {
route.Auth(r)
route.VM(r)
}
r.Run(fmt.Sprintf(":%d", cfg.Port))
}