imdb.go 3.4 KB

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