mix_media_info.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package mix_media_info
  2. import (
  3. "errors"
  4. "github.com/allanpk716/ChineseSubFinder/pkg/media_info_dealers"
  5. "github.com/allanpk716/ChineseSubFinder/pkg"
  6. "github.com/allanpk716/ChineseSubFinder/pkg/decode"
  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/sirupsen/logrus"
  13. )
  14. func GetMixMediaInfo(log *logrus.Logger,
  15. dealers *media_info_dealers.Dealers,
  16. videoFPath string, isMovie bool, _proxySettings *settings.ProxySettings) (*models.MediaInfo, error) {
  17. imdbInfo, err := imdb_helper.GetIMDBInfoFromVideoFile(log, videoFPath, isMovie, _proxySettings)
  18. if err != nil {
  19. return nil, err
  20. }
  21. source := "imdb"
  22. videoType := "movie"
  23. if isMovie == false {
  24. videoType = "series"
  25. }
  26. // TMDB ID 是否存在
  27. if imdbInfo.TmdbId == "" {
  28. // 需要去 web 查询
  29. source = "imdb"
  30. return GetMediaInfoAndSave(dealers, imdbInfo, imdbInfo.IMDBID, source, videoType)
  31. } else {
  32. // 已经存在,从本地拿去信息
  33. // 首先从数据库中查找是否存在这个 IMDB 信息,如果不存在再使用 Web 查找,且写入数据库
  34. var mediaInfos []models.MediaInfo
  35. // 把嵌套关联的 has many 的信息都查询出来
  36. dao.GetDb().Limit(1).Where(&models.MediaInfo{TmdbId: imdbInfo.TmdbId}).Find(&mediaInfos)
  37. if len(mediaInfos) > 0 {
  38. // 找到
  39. return &mediaInfos[0], nil
  40. } else {
  41. // 没有找到本地缓存的 TMDB ID 信息,需要去 web 查询
  42. source = "imdb"
  43. return GetMediaInfoAndSave(dealers, imdbInfo, imdbInfo.IMDBID, source, videoType)
  44. }
  45. }
  46. }
  47. // GetMediaInfoAndSave 通过 IMDB ID 查询媒体信息,并保存到数据库,IMDB 和 MediaInfo 都会进行保存 // source,options=imdb|tmdb videoType,options=movie|series
  48. func GetMediaInfoAndSave(dealers *media_info_dealers.Dealers, imdbInfo *models.IMDBInfo, id, source, videoType string) (*models.MediaInfo, error) {
  49. mediaInfo, err := dealers.GetMediaInfo(id, source, videoType)
  50. if err != nil {
  51. return nil, err
  52. }
  53. if mediaInfo == nil {
  54. // 超过 9次 30s 等待都没有查询到,返回错误
  55. return nil, errors.New("can't get media info from subtitle.best api")
  56. }
  57. // 更新 ID
  58. imdbInfo.TmdbId = mediaInfo.TmdbId
  59. err = dao.GetDb().Transaction(func(tx *gorm.DB) error {
  60. // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  61. if err := tx.Save(imdbInfo).Error; err != nil {
  62. // 返回任何错误都会回滚事务
  63. return err
  64. }
  65. if err := tx.Save(mediaInfo).Error; err != nil {
  66. // 返回任何错误都会回滚事务
  67. return err
  68. }
  69. // 返回 nil 提交事务
  70. return nil
  71. })
  72. if err != nil {
  73. return nil, err
  74. }
  75. return mediaInfo, nil
  76. }
  77. // KeyWordSelect keyWordType cn, 中文, en,英文,org,原始名称
  78. func KeyWordSelect(mediaInfo *models.MediaInfo, videoFPath string, isMovie bool, keyWordType string) (string, error) {
  79. keyWord := ""
  80. if keyWordType == "cn" {
  81. keyWord = mediaInfo.TitleCn
  82. if keyWord == "" {
  83. return "", errors.New("TitleCn is empty")
  84. }
  85. } else if keyWordType == "en" {
  86. keyWord = mediaInfo.TitleEn
  87. if keyWord == "" {
  88. return "", errors.New("TitleEn is empty")
  89. }
  90. } else if keyWordType == "org" {
  91. keyWord = mediaInfo.OriginalTitle
  92. if keyWord == "" {
  93. return "", errors.New("OriginalTitle is empty")
  94. }
  95. } else {
  96. return "", errors.New("keyWordType is not cn, en, org")
  97. }
  98. if isMovie == false {
  99. // 连续剧需要额外补充 S01E01 这样的信息
  100. epsVideoNfoInfo, err := decode.GetVideoNfoInfo4OneSeriesEpisode(videoFPath)
  101. if err != nil {
  102. return "", err
  103. }
  104. keyWord += " " + pkg.GetEpisodeKeyName(epsVideoNfoInfo.Season, epsVideoNfoInfo.Episode, true)
  105. }
  106. return keyWord, nil
  107. }