tmdb.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package tmdb_api
  2. import (
  3. "fmt"
  4. "strconv"
  5. "github.com/allanpk716/ChineseSubFinder/pkg"
  6. "github.com/allanpk716/ChineseSubFinder/pkg/settings"
  7. tmdb "github.com/cyruzin/golang-tmdb"
  8. "github.com/sirupsen/logrus"
  9. )
  10. type TmdbApi struct {
  11. l *logrus.Logger
  12. apiKey string
  13. tmdbClient *tmdb.Client
  14. }
  15. func NewTmdbHelper(l *logrus.Logger, apiKey string, _proxySettings ...*settings.ProxySettings) (*TmdbApi, error) {
  16. tmdbClient, err := tmdb.Init(apiKey)
  17. if err != nil {
  18. err = fmt.Errorf("error initializing tmdb client: %s", err)
  19. return nil, err
  20. }
  21. // 获取 http client 实例
  22. restyClient, err := pkg.NewHttpClient(_proxySettings...)
  23. if err != nil {
  24. err = fmt.Errorf("error initializing resty client: %s", err)
  25. return nil, err
  26. }
  27. tmdbClient.SetClientConfig(*restyClient.GetClient())
  28. tmdbClient.SetClientAutoRetry()
  29. return &TmdbApi{
  30. l: l,
  31. apiKey: apiKey,
  32. tmdbClient: tmdbClient,
  33. }, nil
  34. }
  35. func (t *TmdbApi) Alive() bool {
  36. details, err := t.tmdbClient.GetAccountDetails()
  37. if err != nil {
  38. t.l.Errorln("GetAccountDetails", err)
  39. return false
  40. }
  41. t.l.Infoln("GetAccountDetails UserName:", details.Username)
  42. return true
  43. }
  44. // GetInfo 获取视频的信息 idType: imdb_id or tmdb_id
  45. func (t *TmdbApi) GetInfo(iD string, idType string, isMovieOrSeries, isQueryEnOrCNInfo bool) (outFindByID *tmdb.FindByID, err error) {
  46. // 查询的参数
  47. options := make(map[string]string)
  48. if isQueryEnOrCNInfo == true {
  49. options["language"] = "en-US"
  50. } else {
  51. options["language"] = "zh-CN"
  52. }
  53. if idType == ImdbID {
  54. options["external_source"] = "imdb_id"
  55. outFindByID, err = t.tmdbClient.GetFindByID(iD, options)
  56. if err != nil {
  57. return nil, fmt.Errorf("error getting tmdb info by id = %s: %s", iD, err)
  58. }
  59. } else if idType == TmdbID {
  60. intVar, err := strconv.Atoi(iD)
  61. if err != nil {
  62. return nil, fmt.Errorf("error converting tmdb id = %s to int: %s", iD, err)
  63. }
  64. if isMovieOrSeries == true {
  65. movieDetails, err := t.tmdbClient.GetMovieDetails(intVar, options)
  66. if err != nil {
  67. return nil, fmt.Errorf("error getting tmdb movie details by id = %s: %s", iD, err)
  68. }
  69. outFindByID = &tmdb.FindByID{
  70. MovieResults: []struct {
  71. Adult bool `json:"adult"`
  72. BackdropPath string `json:"backdrop_path"`
  73. GenreIDs []int64 `json:"genre_ids"`
  74. ID int64 `json:"id"`
  75. OriginalLanguage string `json:"original_language"`
  76. OriginalTitle string `json:"original_title"`
  77. Overview string `json:"overview"`
  78. PosterPath string `json:"poster_path"`
  79. ReleaseDate string `json:"release_date"`
  80. Title string `json:"title"`
  81. Video bool `json:"video"`
  82. VoteAverage float32 `json:"vote_average"`
  83. VoteCount int64 `json:"vote_count"`
  84. Popularity float32 `json:"popularity"`
  85. }{
  86. {
  87. Adult: movieDetails.Adult,
  88. BackdropPath: movieDetails.BackdropPath,
  89. ID: movieDetails.ID,
  90. OriginalLanguage: movieDetails.OriginalLanguage,
  91. OriginalTitle: movieDetails.OriginalTitle,
  92. Overview: movieDetails.Overview,
  93. PosterPath: movieDetails.PosterPath,
  94. ReleaseDate: movieDetails.ReleaseDate,
  95. Title: movieDetails.Title,
  96. Video: movieDetails.Video,
  97. VoteAverage: movieDetails.VoteAverage,
  98. VoteCount: movieDetails.VoteCount,
  99. Popularity: movieDetails.Popularity,
  100. },
  101. },
  102. }
  103. } else {
  104. tvDetails, err := t.tmdbClient.GetTVDetails(intVar, options)
  105. if err != nil {
  106. return nil, fmt.Errorf("error getting tmdb tv details by id = %s: %s", iD, err)
  107. }
  108. outFindByID = &tmdb.FindByID{
  109. TvResults: []struct {
  110. OriginalName string `json:"original_name"`
  111. ID int64 `json:"id"`
  112. Name string `json:"name"`
  113. VoteCount int64 `json:"vote_count"`
  114. VoteAverage float32 `json:"vote_average"`
  115. FirstAirDate string `json:"first_air_date"`
  116. PosterPath string `json:"poster_path"`
  117. GenreIDs []int64 `json:"genre_ids"`
  118. OriginalLanguage string `json:"original_language"`
  119. BackdropPath string `json:"backdrop_path"`
  120. Overview string `json:"overview"`
  121. OriginCountry []string `json:"origin_country"`
  122. Popularity float32 `json:"popularity"`
  123. }{
  124. {
  125. OriginalName: tvDetails.OriginalName,
  126. ID: tvDetails.ID,
  127. Name: tvDetails.Name,
  128. VoteCount: tvDetails.VoteCount,
  129. VoteAverage: tvDetails.VoteAverage,
  130. FirstAirDate: tvDetails.FirstAirDate,
  131. PosterPath: tvDetails.PosterPath,
  132. OriginalLanguage: tvDetails.OriginalLanguage,
  133. BackdropPath: tvDetails.BackdropPath,
  134. Overview: tvDetails.Overview,
  135. OriginCountry: tvDetails.OriginCountry,
  136. Popularity: tvDetails.Popularity,
  137. },
  138. },
  139. }
  140. }
  141. }
  142. return outFindByID, nil
  143. }
  144. // ConvertId 目前仅仅支持 TMDB ID 转 IMDB ID
  145. func (t *TmdbApi) ConvertId(iD string, idType string, isMovieOrSeries bool) (convertIdResult *ConvertIdResult, err error) {
  146. if idType == ImdbID {
  147. return nil, fmt.Errorf("imdb id type is not supported")
  148. } else if idType == TmdbID {
  149. var intVar int
  150. intVar, err = strconv.Atoi(iD)
  151. if err != nil {
  152. return nil, fmt.Errorf("error converting tmdb id = %s to int: %s", iD, err)
  153. }
  154. options := make(map[string]string)
  155. if isMovieOrSeries == true {
  156. movieExternalIDs, err := t.tmdbClient.GetMovieExternalIDs(intVar, options)
  157. if err != nil {
  158. return nil, err
  159. }
  160. convertIdResult = &ConvertIdResult{
  161. ImdbID: movieExternalIDs.IMDbID,
  162. TmdbID: iD,
  163. }
  164. return convertIdResult, nil
  165. } else {
  166. tvExternalIDs, err := t.tmdbClient.GetTVExternalIDs(intVar, options)
  167. if err != nil {
  168. return nil, err
  169. }
  170. convertIdResult = &ConvertIdResult{
  171. ImdbID: tvExternalIDs.IMDbID,
  172. TmdbID: iD,
  173. TvdbID: fmt.Sprintf("%d", tvExternalIDs.TVDBID),
  174. }
  175. return convertIdResult, nil
  176. }
  177. } else {
  178. return nil, fmt.Errorf("id type is not supported: " + idType)
  179. }
  180. }
  181. const (
  182. ImdbID = "imdb_id"
  183. TmdbID = "tmdb_id"
  184. )
  185. type ConvertIdResult struct {
  186. ImdbID string `json:"imdb_id"`
  187. TmdbID string `json:"tmdb_id"`
  188. TvdbID string `json:"tvdb_id"`
  189. }