package cmd import ( "context" "fmt" "net/http" "path/filepath" "ycmediakit/internal/app/ffmpeg" "ycmediakit/internal/pkg/config" "ycmediakit/internal/pkg/global" "ycmediakit/internal/pkg/server/ffmpegServer" "ycmediakit/internal/pkg/server/systemServer" "ycmediakit/internal/pkg/util" "ycmediakit/middleware" "github.com/gin-gonic/gin" "go.uber.org/zap" ) var ( rCfg *config.RunConfig aCfg *config.AppConfig log *zap.Logger ctx context.Context engine *gin.Engine ) var ( payloadServer *systemServer.PayloadServer toHlsServer *ffmpegServer.ToHlsServer ) func init() { initAttr() initServer() initEngine() } func initAttr() { rCfg = global.RunConfig aCfg = global.AppConfig log = global.Logger } func initServer() { payloadServer = global.PayloadServer toHlsServer = global.ToHlsServer } func initEngine() { if !rCfg.Debug { gin.SetMode(gin.ReleaseMode) } engine = gin.New() engine.Use(middleware.Cors()) engine.Use(middleware.GinLogger(log), middleware.GinRecovery(log, true)) engine.Use(middleware.HttpInterceptor()) initFfmpegServices() } func initFfmpegServices() { fCfg := &aCfg.Ffmpeg ffmpegGroup := engine.Group("/ffmpeg") if payloadServer.Cfg.Enable { ffmpegGroup.Use(middleware.ProbePayloadInterceptor(payloadServer)) } ffmpeg.BindRouters(ffmpegGroup) toHlsCfg := &fCfg.ToHls hlsPath := filepath.Join(util.GetWorkPath(), toHlsCfg.HlsRoot) _, _ = util.CheckDir(hlsPath) hlsGroup := engine.Group("/" + toHlsCfg.HlsRoot) if toHlsServer.Cfg.Keepalive.Enable { hlsGroup.Use(middleware.KeepAliveToHlsInterceptor(toHlsServer.Supervisor)) ffmpegGroup.Use(middleware.ProbePayloadInterceptor(payloadServer)) } hlsGroup.StaticFS("/", http.Dir(hlsPath)) } func Run(ctx_ context.Context) { ctx = ctx_ port := aCfg.Server.Port runMsg := "Listening and serving HTTP on :" + port fmt.Printf(runMsg + "\n") log.Info(runMsg) if err := engine.Run(":" + port); err != nil { log.Error(err.Error()) return } }