imdb.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package imdb_helper
  2. import (
  3. "crypto/tls"
  4. "github.com/StalkR/imdb"
  5. "github.com/allanpk716/ChineseSubFinder/internal/dao"
  6. "github.com/allanpk716/ChineseSubFinder/internal/models"
  7. "github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
  8. "github.com/allanpk716/ChineseSubFinder/internal/pkg/notify_center"
  9. "github.com/allanpk716/ChineseSubFinder/internal/pkg/settings"
  10. "github.com/allanpk716/ChineseSubFinder/internal/types"
  11. "net/http"
  12. "net/url"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. // GetVideoInfoFromIMDBWeb 从 IMDB 网站 ID 查询影片的信息
  18. func GetVideoInfoFromIMDBWeb(imdbInfo types.VideoIMDBInfo, _proxySettings ...*settings.ProxySettings) (*imdb.Title, error) {
  19. var cli *http.Client
  20. var proxySettings *settings.ProxySettings
  21. if len(_proxySettings) > 0 && _proxySettings[0].UseHttpProxy == true || len(_proxySettings[0].HttpProxyAddress) > 0 {
  22. proxySettings = _proxySettings[0]
  23. proxy, err := url.Parse(proxySettings.HttpProxyAddress)
  24. if err != nil {
  25. return nil, err
  26. }
  27. tr := &http.Transport{
  28. Proxy: http.ProxyURL(proxy),
  29. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  30. }
  31. cli = &http.Client{
  32. Timeout: 15 * time.Second,
  33. Transport: tr,
  34. }
  35. } else {
  36. cli = &http.Client{
  37. Timeout: 15 * time.Second,
  38. }
  39. }
  40. t, err := imdb.NewTitle(cli, imdbInfo.ImdbId)
  41. if err != nil {
  42. notify_center.Notify.Add("imdb model - imdb.NewTitle :", err.Error())
  43. return nil, err
  44. }
  45. if t.Year == 0 {
  46. // IMDB 信息获取的库(1.0.7),目前有bug,比如,tt6856242 年份为 0
  47. if imdbInfo.Year != "" {
  48. year, err := strconv.Atoi(imdbInfo.Year)
  49. if err != nil {
  50. return nil, err
  51. }
  52. t.Year = year
  53. }
  54. }
  55. return t, nil
  56. }
  57. // GetVideoIMDBInfoFromLocal 从本地获取 IMDB 信息,如果找不到则去网络获取并写入本地缓存
  58. func GetVideoIMDBInfoFromLocal(imdbInfo types.VideoIMDBInfo, _proxySettings ...*settings.ProxySettings) (*models.IMDBInfo, error) {
  59. log_helper.GetLogger().Debugln("GetVideoIMDBInfoFromLocal", 0)
  60. // 首先从数据库中查找是否存在这个 IMDB 信息,如果不存在再使用 Web 查找,且写入数据库
  61. var imdbInfos []models.IMDBInfo
  62. // 把嵌套关联的 has many 的信息都查询出来
  63. dao.GetDb().Preload("VideoSubInfos").Limit(1).Where(&models.IMDBInfo{IMDBID: imdbInfo.ImdbId}).Find(&imdbInfos)
  64. log_helper.GetLogger().Debugln("GetVideoIMDBInfoFromLocal", 1)
  65. if len(imdbInfos) <= 0 {
  66. // 没有找到,去网上获取
  67. t, err := GetVideoInfoFromIMDBWeb(imdbInfo, _proxySettings...)
  68. if err != nil {
  69. return nil, err
  70. }
  71. log_helper.GetLogger().Debugln("GetVideoIMDBInfoFromLocal", 2)
  72. // 存入数据库
  73. nowIMDBInfo := models.NewIMDBInfo(imdbInfo.ImdbId, t.Name, t.Year, t.Description, t.Languages, t.AKA)
  74. imdbInfos = make([]models.IMDBInfo, 0)
  75. imdbInfos = append(imdbInfos, *nowIMDBInfo)
  76. dao.GetDb().Create(nowIMDBInfo)
  77. log_helper.GetLogger().Debugln("GetVideoIMDBInfoFromLocal", 3)
  78. return nowIMDBInfo, nil
  79. } else {
  80. log_helper.GetLogger().Debugln("GetVideoIMDBInfoFromLocal", 4)
  81. // 找到
  82. return &imdbInfos[0], nil
  83. }
  84. }
  85. // IsChineseVideo 从 imdbID 去查询判断是否是中文视频
  86. func IsChineseVideo(imdbInfo types.VideoIMDBInfo, _proxySettings ...*settings.ProxySettings) (bool, *models.IMDBInfo, error) {
  87. const chName0 = "chinese"
  88. const chName1 = "mandarin"
  89. var proxySettings *settings.ProxySettings
  90. if len(_proxySettings) > 0 {
  91. proxySettings = _proxySettings[0]
  92. }
  93. localIMDBInfo, err := GetVideoIMDBInfoFromLocal(imdbInfo, proxySettings)
  94. if err != nil {
  95. return false, nil, err
  96. }
  97. if len(localIMDBInfo.Languages) <= 0 {
  98. return false, nil, nil
  99. }
  100. firstLangLowCase := strings.ToLower(localIMDBInfo.Languages[0])
  101. // 判断第一语言是否是中文
  102. switch firstLangLowCase {
  103. case chName0, chName1:
  104. return true, localIMDBInfo, nil
  105. default:
  106. return false, localIMDBInfo, nil
  107. }
  108. }