tmdb.go 6.7 KB

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