subtitle_best.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package subtitle_best
  2. import (
  3. "github.com/ChineseSubFinder/ChineseSubFinder/pkg"
  4. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/logic/file_downloader"
  5. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/mix_media_info"
  6. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/settings"
  7. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/types/common"
  8. common2 "github.com/ChineseSubFinder/ChineseSubFinder/pkg/types/common"
  9. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/types/series"
  10. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/types/supplier"
  11. "github.com/pkg/errors"
  12. "github.com/sirupsen/logrus"
  13. "time"
  14. )
  15. type Supplier struct {
  16. log *logrus.Logger
  17. fileDownloader *file_downloader.FileDownloader
  18. topic int
  19. isAlive bool
  20. api *Api
  21. dailyDownloadCount int
  22. dailyDownloadLimit int
  23. }
  24. func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
  25. sup := Supplier{}
  26. sup.api = NewApi(headerToken, settings.Get().SubtitleSources.SubtitleBestSettings.ApiKey)
  27. sup.log = fileDownloader.Log
  28. sup.fileDownloader = fileDownloader
  29. sup.isAlive = true // 默认是可以使用的,如果 check 后,再调整状态
  30. sup.dailyDownloadCount = 0
  31. sup.dailyDownloadLimit = 0
  32. if settings.Get().AdvancedSettings.Topic != common2.DownloadSubsPerSite {
  33. settings.Get().AdvancedSettings.Topic = common2.DownloadSubsPerSite
  34. }
  35. return &sup
  36. }
  37. func (s *Supplier) CheckAlive() (bool, int64) {
  38. // 如果没有设置这个 API 接口,那么就任务是不可用的
  39. if settings.Get().SubtitleSources.SubtitleBestSettings.ApiKey == "" {
  40. s.isAlive = false
  41. return false, 0
  42. }
  43. // 计算当前时间
  44. startT := time.Now()
  45. client, err := pkg.NewHttpClient()
  46. if err != nil {
  47. s.log.Errorln(s.GetSupplierName(), "CheckAlive", "Error", err)
  48. return false, 0
  49. }
  50. _, limitInfo, err := s.api.QueryMovieSubtitle(client, "tt00000")
  51. if err != nil {
  52. s.log.Errorln(s.GetSupplierName(), "CheckAlive.QueryMovieSubtitle", "Error", err)
  53. return false, 0
  54. }
  55. s.updateLimitInfo(limitInfo)
  56. s.isAlive = true
  57. return true, time.Since(startT).Milliseconds()
  58. }
  59. func (s *Supplier) IsAlive() bool {
  60. return s.isAlive
  61. }
  62. func (s *Supplier) OverDailyDownloadLimit() bool {
  63. // 如果没有设置这个 API 接口,那么就任务是不可用的
  64. if settings.Get().SubtitleSources.SubtitleBestSettings.ApiKey == "" {
  65. return true
  66. }
  67. if s.dailyDownloadCount >= s.dailyDownloadLimit {
  68. return true
  69. }
  70. // 没有超出限制
  71. return false
  72. }
  73. func (s *Supplier) GetLogger() *logrus.Logger {
  74. return s.log
  75. }
  76. func (s *Supplier) GetSupplierName() string {
  77. return common.SubSiteSubtitleBest
  78. }
  79. func (s *Supplier) GetSubListFromFile4Movie(filePath string) ([]supplier.SubInfo, error) {
  80. outSubInfos := make([]supplier.SubInfo, 0)
  81. if settings.Get().SubtitleSources.SubtitleBestSettings.Enabled == false {
  82. return outSubInfos, nil
  83. }
  84. if settings.Get().SubtitleSources.SubtitleBestSettings.ApiKey == "" {
  85. return nil, errors.New("Token is empty")
  86. }
  87. return s.getSubListFromFile(filePath, true, 0, 0)
  88. }
  89. func (s *Supplier) GetSubListFromFile4Series(seriesInfo *series.SeriesInfo) ([]supplier.SubInfo, error) {
  90. outSubInfos := make([]supplier.SubInfo, 0)
  91. if settings.Get().SubtitleSources.SubtitleBestSettings.Enabled == false {
  92. return outSubInfos, nil
  93. }
  94. if settings.Get().SubtitleSources.SubtitleBestSettings.ApiKey == "" {
  95. return nil, errors.New("Token is empty")
  96. }
  97. return s.downloadSub4Series(seriesInfo)
  98. }
  99. func (s *Supplier) GetSubListFromFile4Anime(seriesInfo *series.SeriesInfo) ([]supplier.SubInfo, error) {
  100. outSubInfos := make([]supplier.SubInfo, 0)
  101. if settings.Get().SubtitleSources.SubtitleBestSettings.Enabled == false {
  102. return outSubInfos, nil
  103. }
  104. if settings.Get().SubtitleSources.SubtitleBestSettings.ApiKey == "" {
  105. return nil, errors.New("Token is empty")
  106. }
  107. return s.downloadSub4Series(seriesInfo)
  108. }
  109. // 更新当前的下载次数
  110. func (s *Supplier) updateLimitInfo(limitInfo *LimitInfo) {
  111. s.dailyDownloadCount = limitInfo.DailyCount()
  112. s.dailyDownloadLimit = limitInfo.DailyLimit()
  113. }
  114. func (s *Supplier) downloadSub4Series(seriesInfo *series.SeriesInfo) ([]supplier.SubInfo, error) {
  115. var allSupplierSubInfo = make([]supplier.SubInfo, 0)
  116. index := 0
  117. // 这里拿到的 seriesInfo ,里面包含了,需要下载字幕的 Eps 信息
  118. for _, episodeInfo := range seriesInfo.NeedDlEpsKeyList {
  119. index++
  120. one, err := s.getSubListFromFile(episodeInfo.FileFullPath, false, episodeInfo.Season, episodeInfo.Episode)
  121. if err != nil {
  122. s.log.Errorln(s.GetSupplierName(), "getSubListFromFile", episodeInfo.FileFullPath, err)
  123. continue
  124. }
  125. if one == nil {
  126. // 没有搜索到字幕
  127. s.log.Infoln(s.GetSupplierName(), "Not Find Sub can be download",
  128. episodeInfo.Title, episodeInfo.Season, episodeInfo.Episode)
  129. continue
  130. }
  131. // 需要赋值给字幕结构
  132. for i := range one {
  133. one[i].Season = episodeInfo.Season
  134. one[i].Episode = episodeInfo.Episode
  135. }
  136. allSupplierSubInfo = append(allSupplierSubInfo, one...)
  137. }
  138. // 返回前,需要把每一个 Eps 的 Season Episode 信息填充到每个 SubInfo 中
  139. return allSupplierSubInfo, nil
  140. }
  141. func (s *Supplier) getSubListFromFile(videoFPath string, isMovie bool, season, episode int) ([]supplier.SubInfo, error) {
  142. defer func() {
  143. s.log.Debugln(s.GetSupplierName(), videoFPath, "End...")
  144. }()
  145. s.log.Debugln(s.GetSupplierName(), videoFPath, "Start...")
  146. outSubInfoList := make([]supplier.SubInfo, 0)
  147. mediaInfo, err := mix_media_info.GetMixMediaInfo(s.fileDownloader.MediaInfoDealers, videoFPath, isMovie)
  148. if err != nil {
  149. s.log.Errorln(s.GetSupplierName(), videoFPath, "GetMixMediaInfo", err)
  150. return nil, err
  151. }
  152. client, err := pkg.NewHttpClient()
  153. if err != nil {
  154. s.log.Errorln(s.GetSupplierName(), "NewHttpClient", "Error", err)
  155. return nil, err
  156. }
  157. var subtitle *SubtitleResponse
  158. var limitInfo *LimitInfo
  159. if isMovie == true {
  160. subtitle, limitInfo, err = s.api.QueryMovieSubtitle(client, mediaInfo.ImdbId)
  161. } else {
  162. subtitle, limitInfo, err = s.api.QueryTVEpsSubtitle(client, mediaInfo.ImdbId, season, episode)
  163. }
  164. if err != nil {
  165. return nil, err
  166. }
  167. s.updateLimitInfo(limitInfo)
  168. if len(subtitle.Subtitles) <= 0 {
  169. return nil, nil
  170. }
  171. for index, subInfo := range subtitle.Subtitles {
  172. // 获取具体的下载地址
  173. var downloadUrl *GetUrlResponse
  174. downloadUrl, limitInfo, err = s.api.GetDownloadUrl(client, subInfo.SubSha256, mediaInfo.ImdbId,
  175. subInfo.IsMovie, subInfo.Season, subInfo.Episode,
  176. "", subInfo.Language, subInfo.Token)
  177. if err != nil {
  178. return nil, err
  179. }
  180. s.updateLimitInfo(limitInfo)
  181. // 下载地址为空
  182. if len(downloadUrl.DownloadLink) < 1 {
  183. continue
  184. }
  185. // 这里需要注意的是 SubtitleBest 的下载地址是时效性的,所以不能以下载地址进行唯一性存储
  186. dSubInfo, err := s.fileDownloader.GetSubtitleBest(s.GetSupplierName(), int64(index), subInfo.Season, subInfo.Episode,
  187. subInfo.Title, subInfo.Ext, subInfo.SubSha256, downloadUrl.DownloadLink)
  188. if err != nil {
  189. s.log.Error("FileDownloader.Get", err)
  190. continue
  191. }
  192. outSubInfoList = append(outSubInfoList, *dSubInfo)
  193. // 如果够了那么多个字幕就返回
  194. if len(outSubInfoList) >= settings.Get().AdvancedSettings.Topic {
  195. return outSubInfoList, nil
  196. }
  197. }
  198. return outSubInfoList, nil
  199. }
  200. const (
  201. headerToken = "5akwmGAbuFWqgaZf9QwT"
  202. )