imdb.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package imdb_helper
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "github.com/StalkR/imdb"
  7. "github.com/allanpk716/ChineseSubFinder/internal/dao"
  8. "github.com/allanpk716/ChineseSubFinder/internal/models"
  9. "github.com/allanpk716/ChineseSubFinder/internal/pkg/decode"
  10. "github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
  11. "github.com/allanpk716/ChineseSubFinder/internal/pkg/notify_center"
  12. "github.com/allanpk716/ChineseSubFinder/internal/pkg/settings"
  13. "github.com/allanpk716/ChineseSubFinder/internal/types"
  14. "github.com/allanpk716/ChineseSubFinder/internal/types/common"
  15. "github.com/sirupsen/logrus"
  16. )
  17. // GetVideoInfoFromIMDBWeb 从 IMDB 网站 ID 查询影片的信息
  18. func GetVideoInfoFromIMDBWeb(imdbInfo types.VideoNfoInfo, _proxySettings ...*settings.ProxySettings) (*imdb.Title, error) {
  19. client, err := my_util.NewHttpClient(_proxySettings...)
  20. if err != nil {
  21. return nil, err
  22. }
  23. t, err := imdb.NewTitle(client.GetClient(), imdbInfo.ImdbId)
  24. if err != nil {
  25. notify_center.Notify.Add("imdb model - imdb.NewTitle :", err.Error())
  26. return nil, err
  27. }
  28. if t.Year == 0 {
  29. // IMDB 信息获取的库(1.0.7),目前有bug,比如,tt6856242 年份为 0
  30. if imdbInfo.Year != "" {
  31. year, err := strconv.Atoi(imdbInfo.Year)
  32. if err != nil {
  33. return nil, err
  34. }
  35. t.Year = year
  36. }
  37. }
  38. return t, nil
  39. }
  40. // GetVideoIMDBInfoFromLocal 从本地获取 IMDB 信息,注意,如果需要跳过,那么返回 Error == common.SkipCreateInDB
  41. func GetVideoIMDBInfoFromLocal(log *logrus.Logger, imdbInfo types.VideoNfoInfo, skipCreate ...bool) (*models.IMDBInfo, error) {
  42. /*
  43. 这里需要注意一个细节,之前理想情况下是从 Web 获取完整的 IMDB Info 回来,放入本地存储
  44. 获取的时候如果本地有就拿本地的,没有则从 Web 获取,然后写入本地存储
  45. 但是实际的使用中发现,其实只有在判断视频是否是中文的时候才有必要去获取 Web 上完整的 IMDB Info 信息
  46. 如果一开始就需要从 Web 上获取,那么这个过程非常的缓慢,很耽误时间,所以还是切换为两层逻辑
  47. 1. 第一次,优先获取本地的 IMDB Info,写入数据库缓存
  48. 2. 如果需要判断视频是否是中文的时候,再去获取 Web 上完整的 IMDB Info 信息,更新写入本地存储
  49. 3. 因为现在默认是不跳过中文视频扫描的,所以如果开启后,则会再判断的时候访问外网获取,然后写入本地,过程会比较慢
  50. 4. 同时,再发送字幕和 IMDB Info 到服务器的时候,也需要判断是否 IMDB Info 信息是否齐全,否则就需要从外网获取齐全后再上传
  51. */
  52. log.Debugln("GetVideoIMDBInfoFromLocal", 0)
  53. // 首先从数据库中查找是否存在这个 IMDB 信息,如果不存在再使用 Web 查找,且写入数据库
  54. var imdbInfos []models.IMDBInfo
  55. // 把嵌套关联的 has many 的信息都查询出来
  56. dao.GetDb().
  57. Preload("VideoSubInfos").
  58. Limit(1).Where(&models.IMDBInfo{IMDBID: imdbInfo.ImdbId}).Find(&imdbInfos)
  59. log.Debugln("GetVideoIMDBInfoFromLocal", 1)
  60. if len(imdbInfos) <= 0 {
  61. if len(skipCreate) > 0 && skipCreate[0] == true {
  62. log.Debugln(fmt.Sprintf("skip insert, imdbInfo.ImdbId = %v", imdbInfo.ImdbId))
  63. return nil, common.SkipCreateInDB
  64. }
  65. // 没有找到,新增,存储本地,但是信息肯定是不完整的,需要在判断是否是中文的时候再次去外网获取补全信息
  66. log.Debugln("GetVideoIMDBInfoFromLocal", 2)
  67. // 存入数据库
  68. nowIMDBInfo := models.NewIMDBInfo(imdbInfo.ImdbId, "", 0, "", []string{}, []string{})
  69. dao.GetDb().Create(nowIMDBInfo)
  70. log.Debugln("GetVideoIMDBInfoFromLocal", 3)
  71. return nowIMDBInfo, nil
  72. } else {
  73. log.Debugln("GetVideoIMDBInfoFromLocal", 4)
  74. // 找到
  75. return &imdbInfos[0], nil
  76. }
  77. }
  78. // IsChineseVideo 从 imdbID 去查询判断是否是中文视频
  79. func IsChineseVideo(log *logrus.Logger, imdbInfo types.VideoNfoInfo, _proxySettings ...*settings.ProxySettings) (bool, *models.IMDBInfo, error) {
  80. const chName0 = "chinese"
  81. const chName1 = "mandarin"
  82. log.Debugln("IsChineseVideo", 0)
  83. localIMDBInfo, err := GetVideoIMDBInfoFromLocal(log, imdbInfo)
  84. if err != nil {
  85. return false, nil, err
  86. }
  87. if len(localIMDBInfo.Description) <= 0 {
  88. // 需要去外网获去补全信息,然后更新本地的信息
  89. log.Debugln("IsChineseVideo", 1)
  90. t, err := GetVideoInfoFromIMDBWeb(imdbInfo, _proxySettings...)
  91. if err != nil {
  92. log.Errorln("IsChineseVideo.getVideoInfoFromIMDBWeb,", imdbInfo.Title, err)
  93. return false, nil, err
  94. }
  95. log.Debugln("IsChineseVideo", 2)
  96. localIMDBInfo.Year = t.Year
  97. localIMDBInfo.Name = t.Name
  98. localIMDBInfo.Year = t.Year
  99. localIMDBInfo.AKA = t.AKA
  100. localIMDBInfo.Description = t.Description
  101. localIMDBInfo.Languages = t.Languages
  102. log.Debugln("IsChineseVideo", 3)
  103. dao.GetDb().Save(localIMDBInfo)
  104. log.Debugln("IsChineseVideo", 4)
  105. }
  106. if len(localIMDBInfo.Languages) < 1 {
  107. return false, localIMDBInfo, nil
  108. }
  109. firstLangLowCase := strings.ToLower(localIMDBInfo.Languages[0])
  110. log.Debugln("IsChineseVideo", 5)
  111. // 判断第一语言是否是中文
  112. switch firstLangLowCase {
  113. case chName0, chName1:
  114. return true, localIMDBInfo, nil
  115. default:
  116. return false, localIMDBInfo, nil
  117. }
  118. }
  119. // GetIMDBInfo 先从本地拿缓存,如果没有就从 Web 获取
  120. func GetIMDBInfo(log *logrus.Logger, videoFPath string, isMovie bool, _proxySettings ...*settings.ProxySettings) (*models.IMDBInfo, error) {
  121. var err error
  122. var imdbInfo4Video types.VideoNfoInfo
  123. if isMovie == true {
  124. imdbInfo4Video, err = decode.GetVideoNfoInfo4Movie(videoFPath)
  125. } else {
  126. imdbInfo4Video, err = decode.GetSeriesSeasonVideoNfoInfoFromEpisode(videoFPath)
  127. }
  128. if err != nil {
  129. // 如果找不到当前电影的 IMDB Info 本地文件,那么就跳过
  130. log.Warningln("getSubListFromFile", videoFPath, err)
  131. return nil, err
  132. }
  133. imdbInfo, err := GetVideoIMDBInfoFromLocal(log, imdbInfo4Video)
  134. if err != nil {
  135. log.Warningln("GetVideoIMDBInfoFromLocal", videoFPath, err)
  136. return nil, err
  137. }
  138. if len(imdbInfo.Description) <= 0 {
  139. // 需要去外网获去补全信息,然后更新本地的信息
  140. t, err := GetVideoInfoFromIMDBWeb(imdbInfo4Video, _proxySettings...)
  141. if err != nil {
  142. log.Errorln("GetVideoInfoFromIMDBWeb,", imdbInfo4Video.Title, err)
  143. return nil, err
  144. }
  145. imdbInfo.Year = t.Year
  146. imdbInfo.AKA = t.AKA
  147. imdbInfo.Description = t.Description
  148. imdbInfo.Languages = t.Languages
  149. dao.GetDb().Save(imdbInfo)
  150. }
  151. return imdbInfo, nil
  152. }