zhangqian
2024-06-12 c40d07e760598c0aae4353f7a1e2d6b01747e83f
controllers/audio.go
@@ -2,8 +2,11 @@
import (
   "errors"
   "fmt"
   "github.com/gin-gonic/gin"
   "gorm.io/gorm"
   "io"
   "os"
   "path"
   "speechAnalysis/constvar"
   "speechAnalysis/extend/code"
@@ -181,6 +184,7 @@
      SetBeginTime(params.BeginTime).
      SetEndTime(params.EndTime).
      SetIsFollowed(params.IsFollowed).
      SetAudioStatusList(params.StatusList).
      Find()
   if err != nil {
@@ -241,6 +245,54 @@
   util.ResponseFormat(c, code.UpdateSuccess, audio)
}
// AudioDownload
// @Tags      音频
// @Summary   音频下载
// @Produce   application/json
// @Param     object  query request.ProcessAudio true  "参数"
// @Success   200 {object} util.Response{data=models.Audio} "成功"
// @Router    /api-sa/v1/audio/download [get]
func (slf AudioCtl) AudioDownload(c *gin.Context) {
   var params request.ProcessAudio
   if err := c.ShouldBindQuery(&params); err != nil {
      util.ResponseFormat(c, code.RequestParamError, err.Error())
      return
   }
   audio, err := models.NewAudioSearch().SetID(params.ID).First()
   if err != nil {
      util.ResponseFormat(c, code.InternalError, "查询失败")
      return
   }
   if audio.FilePath == "" {
      util.ResponseFormat(c, code.InternalError, "查询失败")
      return
   }
   file, err := os.Open(audio.FilePath)
   if err != nil {
      util.ResponseFormat(c, code.InternalError, "文件打开失败")
      return
   }
   defer file.Close()
   fileInfo, err := file.Stat()
   if err != nil {
      util.ResponseFormat(c, code.InternalError, "获取文件信息失败")
      return
   }
   c.Header("Content-Disposition", "inline; filename="+audio.Name) // 在浏览器中直接打开
   c.Header("Content-Length", fmt.Sprint(fileInfo.Size()))
   c.Header("Content-Type", "audio/mpeg") // 设置音频文件类型
   if _, err := io.Copy(c.Writer, file); err != nil {
      util.ResponseFormat(c, code.InternalError, "文件传输失败")
      return
   }
}
// BatchProcess
// @Tags      音频
// @Summary   批量处理音频
@@ -291,11 +343,29 @@
      return
   }
   err := service.DeleteAudio(params.ID)
   audio, err := models.NewAudioSearch().SetID(params.ID).First()
   if err != nil {
      util.ResponseFormat(c, code.RequestParamError, "音频不存在")
      return
   }
   if audio.AudioStatus == constvar.AudioStatusProcessing || audio.AudioStatus == constvar.AudioStatusFinish {
      util.ResponseFormat(c, code.RequestParamError, "音频正在处理或者处理完成,不可删除")
      return
   }
   err = service.DeleteAudio(params.ID)
   if err != nil {
      util.ResponseFormat(c, code.InternalError, err.Error())
      return
   }
   go func() {
      err = os.Remove(audio.FilePath)
      if err != nil {
         logx.Warnf("remove file err:%v, file:%v", err, audio.FilePath)
      }
   }()
   util.ResponseFormat(c, code.DeleteSuccess, "成功")
}
@@ -314,12 +384,34 @@
      return
   }
   err := service.BatchDeleteAudio(params.IDs)
   audioList, err := models.NewAudioSearch().SetIDs(params.IDs).FindNotTotal()
   if err != nil {
      util.ResponseFormat(c, code.InternalError, "内部错误")
      return
   }
   for _, audio := range audioList {
      if audio.AudioStatus == constvar.AudioStatusProcessing || audio.AudioStatus == constvar.AudioStatusFinish {
         util.ResponseFormat(c, code.RequestParamError, "音频正在处理或者处理完成,不可删除")
         return
      }
   }
   err = service.BatchDeleteAudio(params.IDs)
   if err != nil {
      util.ResponseFormat(c, code.InternalError, err.Error())
      return
   }
   go func() {
      for _, audio := range audioList {
         err = os.Remove(audio.FilePath)
         if err != nil {
            logx.Warnf("remove file err:%v, file:%v", err, audio.FilePath)
         }
      }
   }()
   util.ResponseFormat(c, code.DeleteSuccess, "成功")
}