live-streamer/main.go

99 lines
2.1 KiB
Go
Raw Normal View History

2024-10-22 16:39:10 -04:00
package main
import (
"live-streamer/config"
2024-10-23 10:47:37 -04:00
"live-streamer/logger"
"live-streamer/server"
2024-10-22 16:39:10 -04:00
"live-streamer/streamer"
"live-streamer/utils"
"log"
"os"
2024-10-23 04:37:43 -04:00
"strings"
2024-10-22 16:39:10 -04:00
"github.com/fsnotify/fsnotify"
)
var GlobalStreamer *streamer.Streamer
2024-10-23 10:47:37 -04:00
var Logger logger.Logger
2024-10-22 16:39:10 -04:00
func main() {
2024-10-23 10:47:37 -04:00
server.NewServer(":8080", input)
server.GlobalServer.Run()
Logger = server.GlobalServer
2024-10-22 16:39:10 -04:00
if !utils.HasFFMPEG() {
log.Fatal("ffmpeg not found")
}
2024-10-23 10:47:37 -04:00
GlobalStreamer = streamer.NewStreamer(config.GlobalConfig.VideoList, Logger)
2024-10-22 16:39:10 -04:00
go startWatcher()
GlobalStreamer.Stream()
GlobalStreamer.Close()
}
2024-10-23 10:47:37 -04:00
func input(msg string) {
switch msg {
case "prev":
GlobalStreamer.Prev()
case "next":
GlobalStreamer.Next()
case "quit":
GlobalStreamer.Close()
os.Exit(0)
case "list":
list := GlobalStreamer.GetVideoListPath()
Logger.Println("\nvideo list:\n", strings.Join(list, "\n"))
case "current":
videoPath, err := GlobalStreamer.GetCurrentVideoPath()
if err != nil {
Logger.Println("current video: none")
2024-10-22 16:39:10 -04:00
}
2024-10-23 10:47:37 -04:00
Logger.Println("current video: ", videoPath)
default:
Logger.Println("unknown command")
2024-10-22 16:39:10 -04:00
}
}
func startWatcher() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatalf("failed to create watcher: %v", err)
}
defer watcher.Close()
2024-10-23 05:11:52 -04:00
for _, item := range config.GlobalConfig.InputItems {
2024-10-22 16:39:10 -04:00
if item.ItemType == "dir" {
err = watcher.Add(item.Path)
if err != nil {
log.Fatalf("failed to add dir to watcher: %v", err)
}
2024-10-23 10:47:37 -04:00
Logger.Println("watching dir:", item.Path)
2024-10-22 16:39:10 -04:00
}
}
if err != nil {
log.Fatalf("failed to start watcher: %v", err)
}
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
if event.Op&fsnotify.Create == fsnotify.Create {
if utils.IsSupportedVideo(event.Name) {
2024-10-23 10:47:37 -04:00
Logger.Println("new video added:", event.Name)
2024-10-22 16:39:10 -04:00
GlobalStreamer.Add(event.Name)
}
}
if event.Op&fsnotify.Remove == fsnotify.Remove {
2024-10-23 10:47:37 -04:00
Logger.Println("video removed:", event.Name)
2024-10-22 16:39:10 -04:00
GlobalStreamer.Remove(event.Name)
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
2024-10-23 10:47:37 -04:00
Logger.Println("watcher error:", err)
2024-10-22 16:39:10 -04:00
}
}
}