流式数据

流式数据SSE #

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(&param.VideoAnalyzeProgress{
			Type:     param.AnalyzerTypeError,
			Progress: 100,
			Error:    err.Error(),
		})
		return
	}
	service.AnalyzeVideosWithProgress(c.Request.Context(), filePaths, callback)
	callback(&param.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()
}