diff --git a/README.md b/README.md index b8bbf3d..bfffa9f 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ - 终止某一个流 `/api/closeStream?streamPath=xxx` - 获取engine信息 `/api/sysInfo` 返回值{Version:xxx,StartTime:xxx} - 获取系统基本情况 `/api/summary` 返回值Summary数据 +- 获取所有插件信息 `/api/plugins` 返回值Plugin数据 - 获取指定的配置信息 `/api/getconfig?name=xxx` 返回xxx插件的配置信息,如果不带参数或参数为空则返回全局配置 - 修改并保存配置信息 `/api/modifyconfig?name=xxx` 修改xxx插件的配置信息,在请求的body中传入修改后的配置json字符串 - 热更新配置信息 `/api/updateconfig?name=xxx` 热更新xxx插件的配置信息,如果不带参数或参数为空则热更新全局配置 @@ -64,7 +65,7 @@ global: # 启用flv格式缓存,用于HDL协议,以及flv格式写文件 enableflv : true # 连接远程控制台的地址 - consoleurl : wss://console.monibuca.com:8080 + consoleurl : wss://console.monibuca.com/ws/v1 # 远程控制台的秘钥 secret: "" ``` diff --git a/http.go b/http.go index 4181396..4fab1e0 100644 --- a/http.go +++ b/http.go @@ -14,17 +14,28 @@ type GlobalConfig struct { } func (conf *GlobalConfig) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - rw.Write([]byte("Monibuca API Server")) + rw.Write([]byte("Monibuca API Server\n")) + for _, api := range apiList { + rw.Write([]byte(api + "\n")) + } } func (conf *GlobalConfig) API_summary(rw http.ResponseWriter, r *http.Request) { util.ReturnJson(summary.collect, time.Second, rw, r) } +func (conf *GlobalConfig) API_plugins(rw http.ResponseWriter, r *http.Request) { + if err := json.NewEncoder(rw).Encode(Plugins); err != nil { + http.Error(rw, err.Error(), http.StatusInternalServerError) + } +} + func (conf *GlobalConfig) API_stream(rw http.ResponseWriter, r *http.Request) { if streamPath := r.URL.Query().Get("streamPath"); streamPath != "" { if s := Streams.Get(streamPath); s != nil { - json.NewEncoder(rw).Encode(s) + if err := json.NewEncoder(rw).Encode(s); err != nil { + http.Error(rw, err.Error(), http.StatusInternalServerError) + } } else { http.Error(rw, "no such stream", http.StatusNotFound) } @@ -34,10 +45,12 @@ func (conf *GlobalConfig) API_stream(rw http.ResponseWriter, r *http.Request) { } func (conf *GlobalConfig) API_sysInfo(rw http.ResponseWriter, r *http.Request) { - json.NewEncoder(rw).Encode(&struct { + if err := json.NewEncoder(rw).Encode(&struct { Version string StartTime string - }{Engine.Version, StartTime.Format("2006-01-02 15:04:05")}) + }{Engine.Version, StartTime.Format("2006-01-02 15:04:05")}); err != nil { + http.Error(rw, err.Error(), http.StatusInternalServerError) + } } func (conf *GlobalConfig) API_closeStream(w http.ResponseWriter, r *http.Request) { @@ -56,12 +69,14 @@ func (conf *GlobalConfig) API_closeStream(w http.ResponseWriter, r *http.Request func (conf *GlobalConfig) API_getConfig(w http.ResponseWriter, r *http.Request) { if configName := r.URL.Query().Get("name"); configName != "" { if c, ok := Plugins[configName]; ok { - json.NewEncoder(w).Encode(c.RawConfig) + if err := json.NewEncoder(w).Encode(c.RawConfig); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } } else { http.Error(w, "no such config", http.StatusNotFound) } - } else { - json.NewEncoder(w).Encode(Engine.RawConfig) + } else if err := json.NewEncoder(w).Encode(Engine.RawConfig); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) } } @@ -69,16 +84,20 @@ func (conf *GlobalConfig) API_getConfig(w http.ResponseWriter, r *http.Request) func (conf *GlobalConfig) API_modifyConfig(w http.ResponseWriter, r *http.Request) { if configName := r.URL.Query().Get("name"); configName != "" { if c, ok := Plugins[configName]; ok { - json.NewDecoder(r.Body).Decode(&c.Modified) - c.Save() - c.RawConfig.Assign(c.Modified) + if err := json.NewDecoder(r.Body).Decode(&c.Modified); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + } else { + c.Save() + c.RawConfig.Assign(c.Modified) + } } else { http.Error(w, "no such config", http.StatusNotFound) } - } else { - json.NewDecoder(r.Body).Decode(&Engine.Modified) + } else if err := json.NewDecoder(r.Body).Decode(&Engine.Modified); err != nil { Engine.Save() Engine.RawConfig.Assign(Engine.Modified) + } else { + http.Error(w, err.Error(), http.StatusBadRequest) } } diff --git a/main.go b/main.go index 001f344..6c1fab7 100755 --- a/main.go +++ b/main.go @@ -34,6 +34,7 @@ var ( Engine = InstallPlugin(EngineConfig) //复用安装插件逻辑,将全局配置信息注入,并启动server MergeConfigs = []string{"Publish", "Subscribe", "HTTP"} //需要合并配置的属性项,插件若没有配置则使用全局配置 EventBus = make(chan any, 10) + apiList []string //注册到引擎的API接口列表 ) // Run 启动Monibuca引擎,传入总的Context,可用于关闭所有 diff --git a/plugin.go b/plugin.go index c613775..a918498 100644 --- a/plugin.go +++ b/plugin.go @@ -48,11 +48,11 @@ type Plugin struct { context.Context `json:"-"` context.CancelFunc `json:"-"` Name string //插件名称 - Config config.Plugin //插件配置 + Config config.Plugin `json:"-"` //插件配置 Version string //插件版本 RawConfig config.Config //配置的map形式方便查询 Modified config.Config //修改过的配置项 - *zap.Logger + *zap.Logger `json:"-"` } func (opt *Plugin) logHandler(pattern string, handler func(http.ResponseWriter, *http.Request)) http.HandlerFunc { @@ -76,6 +76,7 @@ func (opt *Plugin) handleFunc(pattern string, handler func(http.ResponseWriter, if opt != Engine { pattern = "/" + strings.ToLower(opt.Name) + pattern opt.Info("http handle added to engine:" + pattern) + apiList = append(apiList, pattern) EngineConfig.HandleFunc(pattern, opt.logHandler(pattern, handler)) } } diff --git a/subscriber.go b/subscriber.go index be893f2..2ee3495 100644 --- a/subscriber.go +++ b/subscriber.go @@ -260,7 +260,9 @@ func (s *Subscriber) PlayBlock() { if vp.IFrame && s.Video.decConfChanged() { s.sendVideoDecConf() } - spesic.OnEvent(vp) + if !s.Config.IFrameOnly || vp.IFrame { + spesic.OnEvent(vp) + } s.Video.ring.MoveNext() } else { if s.Video.Track.IDRing.Value.Sequence != s.Video.First.Sequence { @@ -273,7 +275,9 @@ func (s *Subscriber) PlayBlock() { if ctx.Err() != nil { return } - spesic.OnEvent(vp) + if !s.Config.IFrameOnly || vp.IFrame { + spesic.OnEvent(vp) + } if fast := time.Duration(vp.AbsTime-s.Video.First.AbsTime)*time.Millisecond - time.Since(startTime); fast > 0 { time.Sleep(fast) } diff --git a/util/socket.go b/util/socket.go index 4f7172b..05a0ddc 100644 --- a/util/socket.go +++ b/util/socket.go @@ -68,13 +68,14 @@ func CORS(next http.HandlerFunc) http.HandlerFunc { header := w.Header() header.Set("Access-Control-Allow-Credentials", "true") header.Set("Cross-Origin-Resource-Policy", "cross-origin") + header.Set("Access-Control-Allow-Headers", "Content-Type,Access-Token") origin := r.Header["Origin"] if len(origin) == 0 { header.Set("Access-Control-Allow-Origin", "*") } else { header.Set("Access-Control-Allow-Origin", origin[0]) } - if next != nil { + if next != nil && r.Method != "OPTIONS" { next.ServeHTTP(w, r) } })