视频保存

This commit is contained in:
duoaohui
2026-05-19 11:30:25 +08:00
parent 6c8572577e
commit b088865d40
3 changed files with 102 additions and 4 deletions

View File

@@ -7,6 +7,7 @@ import (
"github.com/echochat/backend/app/admin/service"
"github.com/echochat/backend/app/dto"
meetingService "github.com/echochat/backend/app/meeting/service"
"github.com/echochat/backend/pkg/logs"
"github.com/echochat/backend/pkg/utils"
"github.com/gin-gonic/gin"
@@ -76,11 +77,43 @@ func (ctl *MeetingManageController) GetMeetingStats(c *gin.Context) {
utils.ResponseOK(c, resp)
}
// ForceStopRecording POST /api/v1/admin/meetings/recordings/:id/force-stop
//
// 兼底场景host 离线/失联未点停止host 端点击停止后 ffmpeg 异常但 webhook 失效;
// 任何长时间停留在 recording 状态的录制都可由此接口收尾。
//
// 行为:
// - 终态ready/failed/uploading幂等返回 200
// - recording 状态:走 media-server stop + MinIO 上传 + DB 状态机
func (ctl *MeetingManageController) ForceStopRecording(c *gin.Context) {
ctx := c.Request.Context()
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
if err != nil || id <= 0 {
utils.ResponseBadRequest(c, "录制 ID 非法")
return
}
if err := ctl.svc.ForceStopRecording(ctx, id); err != nil {
ctl.handleError(c, err, "强制结束录制失败")
return
}
utils.ResponseOK(c, gin.H{"recording_id": id, "stopped": true})
}
// handleError 统一业务错误映射
func (ctl *MeetingManageController) handleError(c *gin.Context, err error, fallbackMsg string) {
switch {
case errors.Is(err, service.ErrMeetingNotFound):
case errors.Is(err, service.ErrMeetingNotFound),
errors.Is(err, meetingService.ErrMeetingNotFound),
errors.Is(err, meetingService.ErrRecordingNotFound):
utils.ResponseNotFound(c, err.Error())
case errors.Is(err, meetingService.ErrRecordingNotStoppable):
utils.ResponseBadRequest(c, err.Error())
case errors.Is(err, meetingService.ErrMediaServiceUnavailable):
logs.Warn(c.Request.Context(), "controller.meeting_manage_controller.handleError",
"媒体服务不可用", zap.Error(err))
utils.ResponseError(c, "媒体服务暂时不可用,请稍后重试")
default:
logs.Warn(c.Request.Context(), "controller.meeting_manage_controller.handleError",
fallbackMsg, zap.Error(err))