func (v *VideoApi) VideosInfo(c *gin.Context, p *param.VideosParam) {
setSSEHeaders(c)
callback := func(progress *param.VideoAnalyzeProgress) {
d, err := json.Marshal(progress)
if err != nil {
common.Log.Errorf("Marshal progress error: %v", err)
return
}
_, err = fmt.Fprintf(c.Writer, "data: %s\n\n", d)
if err != nil {
common.Log.Infof("sse sending json err: %v", err)
return
}
c.Writer.Flush() //这里推送
}
filePaths, err := service.AnalyzeVideosFromParamWithProgress(p)
if err != nil {
common.Log.Errorf("AnalyzeVideo: %v", err)
callback(¶m.VideoAnalyzeProgress{
Type: param.AnalyzerTypeError,
Progress: 100,
Error: err.Error(),
})
return
}
service.AnalyzeVideosWithProgress(c.Request.Context(), filePaths, callback)
callback(¶m.VideoAnalyzeProgress{
Type: param.AnalyzerTypeSuccess,
Progress: 100,
Count: len(filePaths),
})
}
func setSSEHeaders(c *gin.Context) {
c.Writer.Header().Set("Content-Type", "text/event-stream")
c.Writer.Header().Set("Cache-Control", "no-cache")
c.Writer.Header().Set("Connection", "keep-alive")
c.Writer.Flush()
}