video_list.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package v1
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal/pkg/sort_things"
  4. "github.com/allanpk716/ChineseSubFinder/internal/pkg/video_scan_and_refresh_helper"
  5. "github.com/allanpk716/ChineseSubFinder/internal/types/backend"
  6. "github.com/allanpk716/ChineseSubFinder/internal/types/task_queue"
  7. "github.com/gin-gonic/gin"
  8. "net/http"
  9. "path/filepath"
  10. "strings"
  11. )
  12. func (cb *ControllerBase) RefreshVideoListStatusHandler(c *gin.Context) {
  13. var err error
  14. defer func() {
  15. // 统一的异常处理
  16. cb.ErrorProcess(c, "RefreshVideoListStatusHandler", err)
  17. }()
  18. status := "running"
  19. if cb.videoScanAndRefreshHelperIsRunning == false {
  20. status = "stopped"
  21. }
  22. c.JSON(http.StatusOK, backend.ReplyRefreshVideoList{
  23. Status: status,
  24. ErrMessage: cb.videoScanAndRefreshHelperErrMessage})
  25. return
  26. }
  27. func (cb *ControllerBase) RefreshVideoListHandler(c *gin.Context) {
  28. var err error
  29. defer func() {
  30. // 统一的异常处理
  31. cb.ErrorProcess(c, "RefreshVideoListHandler", err)
  32. }()
  33. if cb.videoScanAndRefreshHelperLocker.Lock() == false {
  34. // 已经在执行,跳过
  35. c.JSON(http.StatusOK, backend.ReplyRefreshVideoList{
  36. Status: "running"})
  37. return
  38. }
  39. cb.videoScanAndRefreshHelper.NeedForcedScanAndDownSub = true
  40. cb.videoScanAndRefreshHelperIsRunning = true
  41. go func() {
  42. defer func() {
  43. cb.videoScanAndRefreshHelperIsRunning = false
  44. cb.videoScanAndRefreshHelperLocker.Unlock()
  45. cb.log.Infoln("Video Scan End By webui")
  46. cb.log.Infoln("------------------------------------")
  47. }()
  48. cb.log.Infoln("------------------------------------")
  49. cb.log.Infoln("Video Scan Started By webui...")
  50. // 先进行扫描
  51. var err2 error
  52. var scanVideoResult *video_scan_and_refresh_helper.ScanVideoResult
  53. cb.videoScanAndRefreshHelperErrMessage = ""
  54. scanVideoResult, err2 = cb.videoScanAndRefreshHelper.ScanNormalMovieAndSeries()
  55. if err2 != nil {
  56. cb.log.Errorln("ScanNormalMovieAndSeries", err2)
  57. cb.videoScanAndRefreshHelperErrMessage = err2.Error()
  58. return
  59. }
  60. err2 = cb.videoScanAndRefreshHelper.ScanEmbyMovieAndSeries(scanVideoResult)
  61. if err2 != nil {
  62. cb.log.Errorln("ScanEmbyMovieAndSeries", err2)
  63. cb.videoScanAndRefreshHelperErrMessage = err2.Error()
  64. return
  65. }
  66. pathUrlMap := cb.StaticFileSystemBackEnd.GetPathUrlMap()
  67. // 排序得到匹配上的路径,最长的那个
  68. sortMoviePaths := sort_things.SortStringSliceByLength(cb.cronHelper.Settings.CommonSettings.MoviePaths)
  69. sortSeriesPaths := sort_things.SortStringSliceByLength(cb.cronHelper.Settings.CommonSettings.SeriesPaths)
  70. if cb.cronHelper.Settings.EmbySettings.Enable == true {
  71. // Emby 情况
  72. if scanVideoResult.Emby == nil {
  73. return
  74. }
  75. } else {
  76. // Normal 情况
  77. if scanVideoResult.Normal == nil {
  78. return
  79. }
  80. replaceIndexMap := make(map[int]int)
  81. for _, orgPrePath := range sortMoviePaths {
  82. for i, oneMovieFPath := range scanVideoResult.Normal.MovieFileFullPathList {
  83. _, found := replaceIndexMap[i]
  84. if found == true {
  85. // 替换过了,跳过
  86. continue
  87. }
  88. if strings.HasPrefix(oneMovieFPath, orgPrePath.Path) == true {
  89. desUrl, found := pathUrlMap[orgPrePath.Path]
  90. if found == false {
  91. // 没有找到对应的 URL
  92. continue
  93. }
  94. // 匹配上了前缀就替换这个,并记录
  95. movieFUrl := strings.ReplaceAll(oneMovieFPath, orgPrePath.Path, desUrl)
  96. oneMovieInfo := backend.MovieInfo{
  97. Name: filepath.Base(movieFUrl),
  98. DirRootUrl: filepath.Dir(movieFUrl),
  99. VideoUrl: movieFUrl,
  100. }
  101. replaceIndexMap[i] = i
  102. cb.MovieInfo = append(cb.MovieInfo, oneMovieInfo)
  103. }
  104. }
  105. }
  106. }
  107. println("haha")
  108. // 这里会把得到的 Normal 和 Emby 的结果都放入 cb.scanVideoResult
  109. // 根据 用户的情况,选择行返回是 Emby Or Normal 的结果
  110. // 并且如果是 Emby 那么会在页面上出现一个刷新字幕列表的按钮(这个需要 Emby 中video 的 ID)
  111. }()
  112. c.JSON(http.StatusOK, backend.ReplyRefreshVideoList{
  113. Status: "running"})
  114. return
  115. }
  116. func (cb ControllerBase) MovieListHandler(c *gin.Context) {
  117. var err error
  118. defer func() {
  119. // 统一的异常处理
  120. cb.ErrorProcess(c, "MovieListHandler", err)
  121. }()
  122. bok, allJobs, err := cb.cronHelper.DownloadQueue.GetAllJobs()
  123. if err != nil {
  124. return
  125. }
  126. if bok == false {
  127. c.JSON(http.StatusOK, backend.ReplyAllJobs{
  128. AllJobs: make([]task_queue.OneJob, 0),
  129. })
  130. return
  131. }
  132. c.JSON(http.StatusOK, backend.ReplyAllJobs{
  133. AllJobs: allJobs,
  134. })
  135. }
  136. func (cb ControllerBase) SeriesListHandler(c *gin.Context) {
  137. var err error
  138. defer func() {
  139. // 统一的异常处理
  140. cb.ErrorProcess(c, "SeriesListHandler", err)
  141. }()
  142. bok, allJobs, err := cb.cronHelper.DownloadQueue.GetAllJobs()
  143. if err != nil {
  144. return
  145. }
  146. if bok == false {
  147. c.JSON(http.StatusOK, backend.ReplyAllJobs{
  148. AllJobs: make([]task_queue.OneJob, 0),
  149. })
  150. return
  151. }
  152. c.JSON(http.StatusOK, backend.ReplyAllJobs{
  153. AllJobs: allJobs,
  154. })
  155. }