voice.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. package controllers
  2. import (
  3. "archive/zip"
  4. "eta/eta_api/models"
  5. "eta/eta_api/services"
  6. "eta/eta_api/utils"
  7. "fmt"
  8. "github.com/kgiannakakis/mp3duration/src/mp3duration"
  9. "github.com/rdlucklib/rdluck_tools/file"
  10. "github.com/rdlucklib/rdluck_tools/http"
  11. "io/ioutil"
  12. "os"
  13. "path"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. // VoiceController 音频
  19. type VoiceController struct {
  20. BaseAuthController
  21. }
  22. // Upload
  23. // @Title 音频上传
  24. // @Description 音频上传接口
  25. // @Param file query file true "文件"
  26. // @Param ReportId query int true "报告ID"
  27. // @Success Ret=200 上传成功
  28. // @router /upload [post]
  29. func (this *VoiceController) Upload() {
  30. br := new(models.BaseResponse).Init()
  31. defer func() {
  32. this.Data["json"] = br
  33. this.ServeJSON()
  34. }()
  35. f, h, err := this.GetFile("file")
  36. if err != nil {
  37. br.Msg = "获取资源信息失败"
  38. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  39. return
  40. }
  41. reportId, err := this.GetInt("ReportId")
  42. if err != nil {
  43. br.Msg = "获取资源信息失败"
  44. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  45. return
  46. }
  47. reportInfo, err := models.GetReportByReportId(reportId)
  48. if err != nil {
  49. br.Msg = "获取报告信息失败"
  50. br.ErrMsg = "获取报告信息失败,Err:" + err.Error()
  51. return
  52. }
  53. ext := path.Ext(h.Filename)
  54. dateDir := time.Now().Format("20060102")
  55. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  56. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  57. if err != nil {
  58. br.Msg = "存储目录创建失败"
  59. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  60. return
  61. }
  62. randStr := utils.GetRandStringNoSpecialChar(28)
  63. fileName := randStr + ext
  64. fpath := uploadDir + "/" + fileName
  65. defer f.Close() //关闭上传文件
  66. err = this.SaveToFile("file", fpath)
  67. if err != nil {
  68. br.Msg = "文件上传失败"
  69. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  70. return
  71. }
  72. resourceUrl := ``
  73. //上传到阿里云 和 minio
  74. //if utils.ObjectStorageClient == "minio" {
  75. // resourceUrl, err = services.UploadAudioToMinIo(fileName, fpath)
  76. // if err != nil {
  77. // br.Msg = "文件上传失败"
  78. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  79. // return
  80. // }
  81. //} else {
  82. // resourceUrl, err = services.UploadAudioAliyun(fileName, fpath)
  83. // if err != nil {
  84. // br.Msg = "文件上传失败"
  85. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  86. // return
  87. // }
  88. //}
  89. ossClient := services.NewOssClient()
  90. if ossClient == nil {
  91. br.Msg = "上传失败"
  92. br.ErrMsg = "初始化OSS服务失败"
  93. return
  94. }
  95. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  96. if err != nil {
  97. br.Msg = "文件上传失败"
  98. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  99. return
  100. }
  101. defer func() {
  102. os.Remove(fpath)
  103. }()
  104. item := new(models.Resource)
  105. item.ResourceUrl = resourceUrl
  106. item.ResourceType = 2
  107. item.CreateTime = time.Now()
  108. newId, err := models.AddResource(item)
  109. if err != nil {
  110. br.Msg = "资源上传失败"
  111. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  112. return
  113. }
  114. var playSeconds float64
  115. playSeconds, err = mp3duration.Calculate(fpath)
  116. if playSeconds <= 0 {
  117. playSeconds, err = utils.GetVideoPlaySeconds(fpath)
  118. if err != nil {
  119. br.Msg = "获取音频时间失败"
  120. br.ErrMsg = "获取音频时间失败,Err:" + err.Error()
  121. return
  122. }
  123. }
  124. fileBody, err := ioutil.ReadFile(fpath)
  125. videoSize := len(fileBody)
  126. sizeFloat := (float64(videoSize) / float64(1024)) / float64(1024)
  127. sizeStr := utils.SubFloatToFloatStr(sizeFloat, 2)
  128. // 修改报告的音频信息
  129. {
  130. reportCreateTime, err := time.Parse(utils.FormatDateTime, reportInfo.CreateTime)
  131. if err != nil {
  132. br.Msg = "上传失败"
  133. br.ErrMsg = "上传失败,Err:" + err.Error()
  134. return
  135. }
  136. createTimeStr := reportCreateTime.Format("0102")
  137. videoName := reportInfo.Title + "(" + createTimeStr + ")"
  138. reportInfo.VideoUrl = resourceUrl
  139. reportInfo.VideoName = videoName
  140. reportInfo.VideoPlaySeconds = fmt.Sprint(playSeconds)
  141. reportInfo.VideoSize = sizeStr
  142. reportInfo.LastModifyAdminId = this.SysUser.AdminId
  143. reportInfo.LastModifyAdminName = this.SysUser.RealName
  144. reportInfo.ModifyTime = time.Now()
  145. err = reportInfo.UpdateReport([]string{"VideoUrl", "VideoName", "VideoPlaySeconds", "VideoSize", "LastModifyAdminId", "LastModifyAdminName", "ModifyTime"})
  146. if err != nil {
  147. br.Msg = "上传失败"
  148. br.ErrMsg = "修改报告的音频信息失败,Err:" + err.Error()
  149. return
  150. }
  151. }
  152. resp := new(models.ResourceResp)
  153. resp.Id = newId
  154. resp.ResourceUrl = resourceUrl
  155. br.Msg = "上传成功"
  156. br.Ret = 200
  157. br.Success = true
  158. br.Data = resp
  159. return
  160. }
  161. // VoiceCommonController 音频
  162. type VoiceCommonController struct {
  163. BaseCommonController
  164. }
  165. // Download
  166. // @Title 音频下载
  167. // @Description 音频下载接口
  168. // @Param ReportId query int true "报告ID"
  169. // @Success Ret=200 下载成功
  170. // @router /download [get]
  171. func (this *VoiceCommonController) Download() {
  172. br := new(models.BaseResponse).Init()
  173. defer func() {
  174. this.Data["json"] = br
  175. this.ServeJSON()
  176. }()
  177. reportId, err := this.GetInt("ReportId")
  178. if err != nil {
  179. br.Msg = "参数错误"
  180. br.ErrMsg = "获取,ReportId,Err:" + err.Error()
  181. return
  182. }
  183. report, err := models.GetReportById(reportId)
  184. if err != nil {
  185. br.Msg = "获取信息失败"
  186. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  187. return
  188. }
  189. savePath := time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandString(5) + ".mp3"
  190. fileBody, err := http.Get(report.VideoUrl)
  191. if err != nil {
  192. br.Msg = "获取信息失败"
  193. br.ErrMsg = "获取信息失败,Err:" + err.Error()
  194. return
  195. }
  196. err = file.SaveFile(fileBody, savePath)
  197. if err != nil {
  198. br.Msg = "保存信息失败"
  199. br.ErrMsg = "保存信息失败,Err:" + err.Error()
  200. return
  201. }
  202. fileName := report.VideoName + ".mp3"
  203. this.Ctx.Output.Download(savePath, fileName)
  204. defer func() {
  205. os.Remove(savePath)
  206. }()
  207. br.Ret = 200
  208. br.Msg = "下载成功"
  209. br.Success = true
  210. return
  211. }
  212. // ReportChapterDownload
  213. // @Title 报告章节列表音频下载
  214. // @Description 音频下载接口
  215. // @Param ChapterIds query string true "章节IDs"
  216. // @Success Ret=200 下载成功
  217. // @router /report/download [get]
  218. func (this *VoiceCommonController) ReportChapterDownload() {
  219. br := new(models.BaseResponse).Init()
  220. defer func() {
  221. this.Data["json"] = br
  222. this.ServeJSON()
  223. }()
  224. strChapterIds := this.GetString("ChapterIds")
  225. if strChapterIds == "" {
  226. br.Msg = "参数错误"
  227. return
  228. }
  229. chapterIds := make([]int, 0)
  230. chapterIdArr := strings.Split(strChapterIds, ",")
  231. for _, v := range chapterIdArr {
  232. id, e := strconv.Atoi(v)
  233. if e != nil {
  234. br.Msg = "参数有误"
  235. br.ErrMsg = "章节ID有误, Err: " + e.Error()
  236. return
  237. }
  238. chapterIds = append(chapterIds, id)
  239. }
  240. if len(chapterIds) == 0 {
  241. br.Msg = "参数有误"
  242. return
  243. }
  244. videoList, err := models.GetReportChapterVideoListByChapterIds(chapterIds)
  245. if err != nil {
  246. br.Msg = "获取音频列表失败"
  247. br.ErrMsg = "获取音频列表失败, Err: " + err.Error()
  248. return
  249. }
  250. if len(videoList) > 0 {
  251. reportId := videoList[0].ReportId
  252. reportInfo, err := models.GetReportById(reportId)
  253. if err != nil {
  254. br.Msg = "报告信息有误"
  255. br.ErrMsg = "获取报告信息失败, Err: " + err.Error()
  256. return
  257. }
  258. // 创建zip
  259. zipName := time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandString(5) + ".zip"
  260. savePath := zipName
  261. zipFile, err := os.Create(zipName)
  262. if err != nil {
  263. return
  264. }
  265. zipWriter := zip.NewWriter(zipFile)
  266. // 生成zip过程中报错关闭
  267. defer func() {
  268. if err != nil {
  269. zipWriter.Close()
  270. zipFile.Close()
  271. }
  272. os.Remove(savePath)
  273. }()
  274. // 获取音频,写入zip
  275. for i := 0; i < len(videoList); i++ {
  276. item := videoList[i]
  277. if item.VideoName == "" || item.VideoUrl == "" {
  278. continue
  279. }
  280. // 音频文件后缀
  281. ext := path.Ext(item.VideoUrl)
  282. ioWriter, err := zipWriter.Create(fmt.Sprintf("%s%s", item.VideoName, ext))
  283. if err != nil {
  284. if os.IsPermission(err) {
  285. fmt.Println("权限不足: ", err)
  286. return
  287. }
  288. return
  289. }
  290. var content []byte
  291. content, err = http.Get(item.VideoUrl)
  292. if err != nil {
  293. content = []byte("")
  294. }
  295. ioWriter.Write(content)
  296. }
  297. // 生成zip后关闭,否则下载文件会损坏
  298. zipWriter.Close()
  299. zipFile.Close()
  300. this.Ctx.Output.Download(savePath, fmt.Sprintf("%s.zip", reportInfo.Title))
  301. }
  302. br.Ret = 200
  303. br.Msg = "下载成功"
  304. br.Success = true
  305. return
  306. }