video_list.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package v1
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "time"
  7. backend2 "github.com/allanpk716/ChineseSubFinder/pkg/types/backend"
  8. "github.com/allanpk716/ChineseSubFinder/pkg/types/common"
  9. TTaskqueue "github.com/allanpk716/ChineseSubFinder/pkg/types/task_queue"
  10. "github.com/allanpk716/ChineseSubFinder/pkg/decode"
  11. "github.com/allanpk716/ChineseSubFinder/pkg/video_scan_and_refresh_helper"
  12. "github.com/gin-gonic/gin"
  13. )
  14. func (cb *ControllerBase) RefreshVideoListStatusHandler(c *gin.Context) {
  15. var err error
  16. defer func() {
  17. // 统一的异常处理
  18. cb.ErrorProcess(c, "RefreshVideoListStatusHandler", err)
  19. }()
  20. status := "running"
  21. if cb.videoScanAndRefreshHelperIsRunning == false {
  22. status = "stopped"
  23. }
  24. c.JSON(http.StatusOK, backend2.ReplyRefreshVideoList{
  25. Status: status,
  26. ErrMessage: cb.videoScanAndRefreshHelperErrMessage})
  27. return
  28. }
  29. func (cb *ControllerBase) RefreshVideoListHandler(c *gin.Context) {
  30. var err error
  31. defer func() {
  32. // 统一的异常处理
  33. cb.ErrorProcess(c, "RefreshVideoListHandler", err)
  34. }()
  35. if cb.videoScanAndRefreshHelperLocker.Lock() == false {
  36. // 已经在执行,跳过
  37. c.JSON(http.StatusOK, backend2.ReplyRefreshVideoList{
  38. Status: "running"})
  39. return
  40. }
  41. cb.videoScanAndRefreshHelper.NeedForcedScanAndDownSub = true
  42. cb.videoScanAndRefreshHelperIsRunning = true
  43. go func() {
  44. startT := time.Now()
  45. cb.log.Infoln("------------------------------------")
  46. cb.log.Infoln("Video Scan Started By webui...")
  47. pathUrlMap := cb.GetPathUrlMap()
  48. cb.log.Infoln("---------------------------------")
  49. cb.log.Infoln("GetPathUrlMap")
  50. for s, s2 := range pathUrlMap {
  51. cb.log.Infoln("pathUrlMap", s, s2)
  52. }
  53. cb.log.Infoln("---------------------------------")
  54. defer func() {
  55. cb.videoScanAndRefreshHelperIsRunning = false
  56. cb.videoScanAndRefreshHelperLocker.Unlock()
  57. cb.log.Infoln("Video Scan Finished By webui, cost:", time.Since(startT).Minutes(), "min")
  58. cb.log.Infoln("------------------------------------")
  59. }()
  60. // 先进行扫描
  61. var err2 error
  62. var scanVideoResult *video_scan_and_refresh_helper.ScanVideoResult
  63. cb.videoScanAndRefreshHelperErrMessage = ""
  64. scanVideoResult, err2 = cb.videoScanAndRefreshHelper.ScanNormalMovieAndSeries()
  65. if err2 != nil {
  66. cb.log.Errorln("ScanNormalMovieAndSeries", err2)
  67. cb.videoScanAndRefreshHelperErrMessage = err2.Error()
  68. return
  69. }
  70. err2 = cb.videoScanAndRefreshHelper.ScanEmbyMovieAndSeries(scanVideoResult)
  71. if err2 != nil {
  72. cb.log.Errorln("ScanEmbyMovieAndSeries", err2)
  73. cb.videoScanAndRefreshHelperErrMessage = err2.Error()
  74. return
  75. }
  76. MovieInfos, SeasonInfos := cb.videoScanAndRefreshHelper.ScrabbleUpVideoList(scanVideoResult, pathUrlMap)
  77. cb.log.Debugln("---------------------------------")
  78. for i, i2 := range MovieInfos {
  79. cb.log.Debugln("MovieInfos", i, i2.VideoFPath)
  80. }
  81. cb.log.Debugln("---------------------------------")
  82. for i, seasonInfo := range SeasonInfos {
  83. cb.log.Debugln("SeasonInfos.RootDirPath", i, seasonInfo.RootDirPath)
  84. for i2, i3 := range seasonInfo.OneVideoInfos {
  85. cb.log.Debugln("SeasonInfos.SeasonInfos", i2, i3.VideoFPath)
  86. }
  87. }
  88. cb.log.Debugln("---------------------------------")
  89. // 缓存视频列表
  90. cb.cronHelper.Downloader.SetMovieAndSeasonInfo(MovieInfos, SeasonInfos)
  91. }()
  92. c.JSON(http.StatusOK, backend2.ReplyRefreshVideoList{
  93. Status: "running"})
  94. return
  95. }
  96. func (cb *ControllerBase) VideoListAddHandler(c *gin.Context) {
  97. var err error
  98. defer func() {
  99. // 统一的异常处理
  100. cb.ErrorProcess(c, "VideoListAddHandler", err)
  101. }()
  102. videoListAdd := backend2.ReqVideoListAdd{}
  103. err = c.ShouldBindJSON(&videoListAdd)
  104. if err != nil {
  105. return
  106. }
  107. videoType := common.Movie
  108. if videoListAdd.VideoType == 1 {
  109. videoType = common.Series
  110. }
  111. oneJob := TTaskqueue.NewOneJob(
  112. videoType, videoListAdd.PhysicalVideoFileFullPath, videoListAdd.TaskPriorityLevel,
  113. videoListAdd.MediaServerInsideVideoID,
  114. )
  115. if videoType == common.Series {
  116. // 如果是连续剧,需要额外的读取这一个剧集的信息
  117. epsVideoNfoInfo, err := decode.GetVideoNfoInfo4OneSeriesEpisode(videoListAdd.PhysicalVideoFileFullPath)
  118. if err != nil {
  119. return
  120. }
  121. seriesInfoDirPath := decode.GetSeriesDirRootFPath(videoListAdd.PhysicalVideoFileFullPath)
  122. if seriesInfoDirPath == "" {
  123. err = errors.New(fmt.Sprintf("decode.GetSeriesDirRootFPath == Empty, %s", videoListAdd.PhysicalVideoFileFullPath))
  124. return
  125. }
  126. oneJob.Season = epsVideoNfoInfo.Season
  127. oneJob.Episode = epsVideoNfoInfo.Episode
  128. oneJob.SeriesRootDirPath = seriesInfoDirPath
  129. }
  130. bok, err := cb.cronHelper.DownloadQueue.Add(*oneJob)
  131. if err != nil {
  132. return
  133. }
  134. if bok == false {
  135. // 任务已经存在
  136. bok, err = cb.cronHelper.DownloadQueue.Update(*oneJob)
  137. if err != nil {
  138. return
  139. }
  140. if bok == false {
  141. c.JSON(http.StatusOK, backend2.ReplyJobThings{
  142. JobID: oneJob.Id,
  143. Message: "update job status failed",
  144. })
  145. return
  146. }
  147. }
  148. c.JSON(http.StatusOK, backend2.ReplyJobThings{
  149. JobID: oneJob.Id,
  150. Message: "ok",
  151. })
  152. }
  153. func (cb *ControllerBase) VideoListHandler(c *gin.Context) {
  154. var err error
  155. defer func() {
  156. // 统一的异常处理
  157. cb.ErrorProcess(c, "VideoListHandler", err)
  158. }()
  159. outMovieInfos, outSeasonInfo := cb.cronHelper.Downloader.GetMovieInfoAndSeasonInfo()
  160. c.JSON(http.StatusOK, backend2.ReplyVideoList{
  161. MovieInfos: outMovieInfos,
  162. SeasonInfos: outSeasonInfo,
  163. })
  164. }