tmdb.go 6.5 KB

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