mix_media_info.go 3.8 KB

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