subSupplierHub.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package sub_supplier
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal/common"
  4. "github.com/allanpk716/ChineseSubFinder/internal/ifaces"
  5. movieHelper "github.com/allanpk716/ChineseSubFinder/internal/logic/movie_helper"
  6. seriesHelper "github.com/allanpk716/ChineseSubFinder/internal/logic/series_helper"
  7. "github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
  8. "github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
  9. "github.com/allanpk716/ChineseSubFinder/internal/pkg/settings"
  10. "github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_helper"
  11. "github.com/allanpk716/ChineseSubFinder/internal/types/backend"
  12. "github.com/allanpk716/ChineseSubFinder/internal/types/emby"
  13. "github.com/allanpk716/ChineseSubFinder/internal/types/series"
  14. "github.com/sirupsen/logrus"
  15. "gopkg.in/errgo.v2/fmt/errors"
  16. "path/filepath"
  17. )
  18. type SubSupplierHub struct {
  19. settings settings.Settings
  20. Suppliers []ifaces.ISupplier
  21. log *logrus.Logger
  22. }
  23. func NewSubSupplierHub(_settings settings.Settings, one ifaces.ISupplier, _inSupplier ...ifaces.ISupplier) *SubSupplierHub {
  24. s := SubSupplierHub{}
  25. s.settings = _settings
  26. s.log = log_helper.GetLogger()
  27. s.Suppliers = make([]ifaces.ISupplier, 0)
  28. s.Suppliers = append(s.Suppliers, one)
  29. if len(_inSupplier) > 0 {
  30. for _, supplier := range _inSupplier {
  31. s.Suppliers = append(s.Suppliers, supplier)
  32. }
  33. }
  34. return &s
  35. }
  36. // AddSubSupplier 添加一个下载器,目前目标是给 SubHD 使用
  37. func (d *SubSupplierHub) AddSubSupplier(one ifaces.ISupplier) {
  38. d.Suppliers = append(d.Suppliers, one)
  39. }
  40. // DownloadSub4Movie 某一个电影字幕下载,下载完毕后,返回下载缓存每个字幕的位置
  41. func (d SubSupplierHub) DownloadSub4Movie(videoFullPath string, index int, forcedScanAndDownloadSub bool) ([]string, error) {
  42. if forcedScanAndDownloadSub == false {
  43. // 非强制扫描的时候,需要判断这个视频根目录是否有 .ignore 文件,有也跳过
  44. if my_util.IsFile(filepath.Join(filepath.Dir(videoFullPath), common.Ignore)) == true {
  45. d.log.Infoln("Found", common.Ignore, "Skip", videoFullPath)
  46. // 跳过下载字幕
  47. return nil, nil
  48. }
  49. }
  50. // 跳过中文的电影,不是一定要跳过的
  51. skip, err := movieHelper.SkipChineseMovie(videoFullPath, *d.settings.AdvancedSettings.ProxySettings)
  52. if err != nil {
  53. d.log.Warnln("SkipChineseMovie", videoFullPath, err)
  54. }
  55. if skip == true {
  56. return nil, nil
  57. }
  58. var needDlSub = false
  59. if forcedScanAndDownloadSub == true {
  60. // 强制下载字幕
  61. needDlSub = true
  62. } else {
  63. needDlSub, err = movieHelper.MovieNeedDlSub(videoFullPath)
  64. if err != nil {
  65. return nil, errors.Newf("MovieNeedDlSub %v %v", videoFullPath, err)
  66. }
  67. }
  68. if needDlSub == true {
  69. // 需要下载字幕
  70. // 下载所有字幕
  71. subInfos := movieHelper.OneMovieDlSubInAllSite(d.Suppliers, videoFullPath, index)
  72. // 整理字幕,比如解压什么的
  73. organizeSubFiles, err := sub_helper.OrganizeDlSubFiles(filepath.Base(videoFullPath), subInfos)
  74. if err != nil {
  75. return nil, errors.Newf("OrganizeDlSubFiles %v %v", videoFullPath, err)
  76. }
  77. // 因为是下载电影,需要合并返回
  78. var outSubFileFullPathList = make([]string, 0)
  79. for s := range organizeSubFiles {
  80. outSubFileFullPathList = append(outSubFileFullPathList, organizeSubFiles[s]...)
  81. }
  82. for i, subFile := range outSubFileFullPathList {
  83. d.log.Debugln("OneMovieDlSubInAllSite", videoFullPath, i, "SubFileFPath:", subFile)
  84. }
  85. return outSubFileFullPathList, nil
  86. } else {
  87. // 无需下载字幕
  88. return nil, nil
  89. }
  90. }
  91. // DownloadSub4Series 某一部连续剧的字幕下载,下载完毕后,返回下载缓存每个字幕的位置
  92. func (d SubSupplierHub) DownloadSub4Series(seriesDirPath string, index int, forcedScanAndDownloadSub bool) (*series.SeriesInfo, map[string][]string, error) {
  93. if forcedScanAndDownloadSub == false {
  94. // 非强制扫描的时候,需要判断这个视频根目录是否有 .ignore 文件,有也跳过
  95. if my_util.IsFile(filepath.Join(seriesDirPath, common.Ignore)) == true {
  96. d.log.Infoln("Found", common.Ignore, "Skip", seriesDirPath)
  97. // 跳过下载字幕
  98. return nil, nil, nil
  99. }
  100. }
  101. // 跳过中文的连续剧,不是一定要跳过的
  102. skip, imdbInfo, err := seriesHelper.SkipChineseSeries(seriesDirPath, *d.settings.AdvancedSettings.ProxySettings)
  103. if err != nil {
  104. d.log.Warnln("SkipChineseSeries", seriesDirPath, err)
  105. }
  106. if skip == true {
  107. return nil, nil, nil
  108. }
  109. // 读取本地的视频和字幕信息
  110. seriesInfo, err := seriesHelper.ReadSeriesInfoFromDir(seriesDirPath, imdbInfo, forcedScanAndDownloadSub)
  111. if err != nil {
  112. return nil, nil, errors.Newf("ReadSeriesInfoFromDir %v %v", seriesDirPath, err)
  113. }
  114. organizeSubFiles, err := d.dlSubFromSeriesInfo(seriesDirPath, index, seriesInfo, err)
  115. if err != nil {
  116. return nil, nil, err
  117. }
  118. return seriesInfo, organizeSubFiles, nil
  119. }
  120. // DownloadSub4SeriesFromEmby 通过 Emby 查询到的信息进行字幕下载,下载完毕后,返回下载缓存每个字幕的位置
  121. func (d SubSupplierHub) DownloadSub4SeriesFromEmby(seriesDirPath string, seriesList []emby.EmbyMixInfo, index int) (*series.SeriesInfo, map[string][]string, error) {
  122. // 跳过中文的连续剧,不是一定要跳过的
  123. skip, imdbInfo, err := seriesHelper.SkipChineseSeries(seriesDirPath, *d.settings.AdvancedSettings.ProxySettings)
  124. if err != nil {
  125. d.log.Warnln("SkipChineseSeries", seriesDirPath, err)
  126. }
  127. if skip == true {
  128. return nil, nil, nil
  129. }
  130. // 读取本地的视频和字幕信息
  131. seriesInfo, err := seriesHelper.ReadSeriesInfoFromEmby(seriesDirPath, imdbInfo, seriesList)
  132. if err != nil {
  133. return nil, nil, errors.Newf("ReadSeriesInfoFromDir %v %v", seriesDirPath, err)
  134. }
  135. organizeSubFiles, err := d.dlSubFromSeriesInfo(seriesDirPath, index, seriesInfo, err)
  136. if err != nil {
  137. return nil, nil, err
  138. }
  139. return seriesInfo, organizeSubFiles, nil
  140. }
  141. // CheckSubSiteStatus 检测多个字幕提供的网站是否是有效的
  142. func (d SubSupplierHub) CheckSubSiteStatus() backend.ReplyCheckStatus {
  143. outStatus := backend.ReplyCheckStatus{
  144. SubSiteStatus: make([]backend.SiteStatus, 0),
  145. }
  146. // 测试提供字幕的网站是有效的
  147. d.log.Infoln("Check Sub Supplier Start...")
  148. for _, supplier := range d.Suppliers {
  149. bAlive, speed := supplier.CheckAlive()
  150. if bAlive == false {
  151. d.log.Warningln(supplier.GetSupplierName(), "Check Alive = false")
  152. } else {
  153. d.log.Infoln(supplier.GetSupplierName(), "Check Alive = true, Speed =", speed, "ms")
  154. }
  155. outStatus.SubSiteStatus = append(outStatus.SubSiteStatus, backend.SiteStatus{
  156. Name: supplier.GetSupplierName(),
  157. Valid: bAlive,
  158. Speed: speed,
  159. })
  160. }
  161. d.log.Infoln("Check Sub Supplier End")
  162. return outStatus
  163. }
  164. func (d SubSupplierHub) dlSubFromSeriesInfo(seriesDirPath string, index int, seriesInfo *series.SeriesInfo, err error) (map[string][]string, error) {
  165. // 下载好的字幕
  166. subInfos := seriesHelper.DownloadSubtitleInAllSiteByOneSeries(d.Suppliers, seriesInfo, index)
  167. // 整理字幕,比如解压什么的
  168. // 每一集 SxEx - 对应解压整理后的字幕列表
  169. organizeSubFiles, err := sub_helper.OrganizeDlSubFiles(filepath.Base(seriesDirPath), subInfos)
  170. if err != nil {
  171. return nil, errors.Newf("OrganizeDlSubFiles %v %v", seriesDirPath, err)
  172. }
  173. return organizeSubFiles, nil
  174. }