mix_media_info.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package mix_media_info
  2. import (
  3. "errors"
  4. "time"
  5. "github.com/allanpk716/ChineseSubFinder/pkg/decode"
  6. "github.com/allanpk716/ChineseSubFinder/pkg/my_util"
  7. "gorm.io/gorm"
  8. "github.com/allanpk716/ChineseSubFinder/internal/dao"
  9. "github.com/allanpk716/ChineseSubFinder/internal/models"
  10. "github.com/allanpk716/ChineseSubFinder/pkg/imdb_helper"
  11. "github.com/allanpk716/ChineseSubFinder/pkg/settings"
  12. "github.com/allanpk716/ChineseSubFinder/pkg/subtitle_best_api"
  13. "github.com/sirupsen/logrus"
  14. )
  15. func GetMixMediaInfo(log *logrus.Logger,
  16. SubtitleBestApi *subtitle_best_api.SubtitleBestApi,
  17. videoFPath string, isMovie bool, _proxySettings *settings.ProxySettings) (*models.MediaInfo, error) {
  18. imdbInfo, err := imdb_helper.GetIMDBInfoFromVideoFile(log, videoFPath, isMovie, _proxySettings)
  19. if err != nil {
  20. return nil, err
  21. }
  22. source := "imdb"
  23. videoType := "movie"
  24. if isMovie == false {
  25. videoType = "series"
  26. }
  27. // TMDB ID 是否存在
  28. if imdbInfo.TmdbId == "" {
  29. // 需要去 web 查询
  30. source = "imdb"
  31. return GetMediaInfoAndSave(log, SubtitleBestApi, imdbInfo, imdbInfo.IMDBID, source, videoType)
  32. } else {
  33. // 已经存在,从本地拿去信息
  34. // 首先从数据库中查找是否存在这个 IMDB 信息,如果不存在再使用 Web 查找,且写入数据库
  35. var mediaInfos []models.MediaInfo
  36. // 把嵌套关联的 has many 的信息都查询出来
  37. dao.GetDb().Limit(1).Where(&models.MediaInfo{TmdbId: imdbInfo.TmdbId}).Find(&mediaInfos)
  38. if len(mediaInfos) > 0 {
  39. // 找到
  40. return &mediaInfos[0], nil
  41. } else {
  42. // 没有找到本地缓存的 TMDB ID 信息,需要去 web 查询
  43. source = "imdb"
  44. return GetMediaInfoAndSave(log, SubtitleBestApi, imdbInfo, imdbInfo.IMDBID, source, videoType)
  45. }
  46. }
  47. }
  48. func getMediaInfoEx(log *logrus.Logger, SubtitleBestApi *subtitle_best_api.SubtitleBestApi, id, source, videoType string) (*models.MediaInfo, error) {
  49. var mediaInfo *models.MediaInfo
  50. queryCount := 0
  51. for {
  52. queryCount++
  53. mediaInfoReply, err := SubtitleBestApi.GetMediaInfo(id, source, videoType)
  54. if err != nil {
  55. return nil, err
  56. }
  57. if mediaInfoReply.Status == 2 {
  58. // 说明进入了查询队列,可以等 20s 以上再次查询
  59. log.Infoln("query queue, sleep 20s")
  60. time.Sleep(20 * time.Second)
  61. } else if mediaInfoReply.Status == 1 {
  62. imdbId := ""
  63. if source == "imdb" {
  64. imdbId = id
  65. } else if source == "tmdb" {
  66. imdbId = ""
  67. }
  68. // 说明查询成功
  69. mediaInfo = &models.MediaInfo{
  70. TmdbId: mediaInfoReply.TMDBId,
  71. ImdbId: imdbId,
  72. OriginalTitle: mediaInfoReply.OriginalTitle,
  73. OriginalLanguage: mediaInfoReply.OriginalLanguage,
  74. TitleEn: mediaInfoReply.TitleEN,
  75. TitleCn: mediaInfoReply.TitleCN,
  76. Year: mediaInfoReply.Year,
  77. }
  78. } else {
  79. // 说明查询失败
  80. return nil, errors.New("SubtitleBestApi.GetMediaInfo failed, Message: " + mediaInfoReply.Message)
  81. }
  82. if queryCount > 9 {
  83. break
  84. }
  85. }
  86. return mediaInfo, nil
  87. }
  88. // GetMediaInfoAndSave 通过 IMDB ID 查询媒体信息,并保存到数据库,IMDB 和 MediaInfo 都会进行保存 // source,options=imdb|tmdb videoType,options=movie|series
  89. func GetMediaInfoAndSave(log *logrus.Logger, SubtitleBestApi *subtitle_best_api.SubtitleBestApi, imdbInfo *models.IMDBInfo, id, source, videoType string) (*models.MediaInfo, error) {
  90. mediaInfo, err := getMediaInfoEx(log, SubtitleBestApi, id, source, videoType)
  91. if err != nil {
  92. return nil, err
  93. }
  94. if mediaInfo == nil {
  95. // 超过 5次 20s 等待都没有查询到,返回错误
  96. return nil, errors.New("can't get media info from subtitle.best api")
  97. }
  98. // 更新 ID
  99. imdbInfo.TmdbId = mediaInfo.TmdbId
  100. err = dao.GetDb().Transaction(func(tx *gorm.DB) error {
  101. // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  102. if err := tx.Save(imdbInfo).Error; err != nil {
  103. // 返回任何错误都会回滚事务
  104. return err
  105. }
  106. if err := tx.Save(mediaInfo).Error; err != nil {
  107. // 返回任何错误都会回滚事务
  108. return err
  109. }
  110. // 返回 nil 提交事务
  111. return nil
  112. })
  113. if err != nil {
  114. return nil, err
  115. }
  116. return mediaInfo, nil
  117. }
  118. // KeyWordSelect keyWordType cn, 中文, en,英文,org,原始名称
  119. func KeyWordSelect(mediaInfo *models.MediaInfo, videoFPath string, isMovie bool, keyWordType string) (string, error) {
  120. keyWord := ""
  121. if keyWordType == "cn" {
  122. keyWord = mediaInfo.TitleCn
  123. if keyWord == "" {
  124. return "", errors.New("TitleCn is empty")
  125. }
  126. } else if keyWordType == "en" {
  127. keyWord = mediaInfo.TitleEn
  128. if keyWord == "" {
  129. return "", errors.New("TitleEn is empty")
  130. }
  131. } else if keyWordType == "org" {
  132. keyWord = mediaInfo.OriginalTitle
  133. if keyWord == "" {
  134. return "", errors.New("OriginalTitle is empty")
  135. }
  136. } else {
  137. return "", errors.New("keyWordType is not cn, en, org")
  138. }
  139. if isMovie == false {
  140. // 连续剧需要额外补充 S01E01 这样的信息
  141. epsVideoNfoInfo, err := decode.GetVideoNfoInfo4OneSeriesEpisode(videoFPath)
  142. if err != nil {
  143. return "", err
  144. }
  145. keyWord += " " + my_util.GetEpisodeKeyName(epsVideoNfoInfo.Season, epsVideoNfoInfo.Episode, true)
  146. }
  147. return keyWord, nil
  148. }