| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 | 
							- package tmdb_api
 
- import (
 
- 	"fmt"
 
- 	"strconv"
 
- 	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/settings"
 
- 	"github.com/ChineseSubFinder/ChineseSubFinder/pkg"
 
- 	tmdb "github.com/cyruzin/golang-tmdb"
 
- 	"github.com/sirupsen/logrus"
 
- )
 
- type TmdbApi struct {
 
- 	l          *logrus.Logger
 
- 	apiKey     string
 
- 	tmdbClient *tmdb.Client
 
- }
 
- func NewTmdbHelper(l *logrus.Logger, apiKey string, useAlternateBaseURL bool) (*TmdbApi, error) {
 
- 	tmdbClient, err := tmdb.Init(apiKey)
 
- 	if err != nil {
 
- 		err = fmt.Errorf("error initializing tmdb client: %s", err)
 
- 		return nil, err
 
- 	}
 
- 	if useAlternateBaseURL == true {
 
- 		tmdbClient.SetAlternateBaseURL()
 
- 	}
 
- 	t := TmdbApi{
 
- 		l:          l,
 
- 		apiKey:     apiKey,
 
- 		tmdbClient: tmdbClient,
 
- 	}
 
- 	t.setClientConfig()
 
- 	return &t, nil
 
- }
 
- func (t *TmdbApi) Alive() bool {
 
- 	options := make(map[string]string)
 
- 	options["language"] = "en-US"
 
- 	searchMulti, err := t.tmdbClient.GetSearchMulti("Dexter", options)
 
- 	if err != nil {
 
- 		t.l.Errorln("GetSearchMulti", err)
 
- 		return false
 
- 	}
 
- 	t.l.Infoln("Tmdb Api is Alive", searchMulti.TotalResults)
 
- 	return true
 
- }
 
- // GetInfo 获取视频的信息 idType: imdb_id or tmdb_id
 
- func (t *TmdbApi) GetInfo(iD string, idType string, isMovieOrSeries, isQueryEnOrCNInfo bool) (outFindByID *tmdb.FindByID, err error) {
 
- 	// 查询的参数
 
- 	options := make(map[string]string)
 
- 	if isQueryEnOrCNInfo == true {
 
- 		options["language"] = "en-US"
 
- 	} else {
 
- 		options["language"] = "zh-CN"
 
- 	}
 
- 	if idType == ImdbID {
 
- 		options["external_source"] = "imdb_id"
 
- 		outFindByID, err = t.tmdbClient.GetFindByID(iD, options)
 
- 		if err != nil {
 
- 			return nil, fmt.Errorf("error getting tmdb info by id = %s: %s", iD, err)
 
- 		}
 
- 	} else if idType == TmdbID {
 
- 		intVar, err := strconv.Atoi(iD)
 
- 		if err != nil {
 
- 			return nil, fmt.Errorf("error converting tmdb id = %s to int: %s", iD, err)
 
- 		}
 
- 		if isMovieOrSeries == true {
 
- 			movieDetails, err := t.tmdbClient.GetMovieDetails(intVar, options)
 
- 			if err != nil {
 
- 				return nil, fmt.Errorf("error getting tmdb movie details by id = %s: %s", iD, err)
 
- 			}
 
- 			outFindByID = &tmdb.FindByID{
 
- 				MovieResults: []struct {
 
- 					Adult            bool    `json:"adult"`
 
- 					BackdropPath     string  `json:"backdrop_path"`
 
- 					GenreIDs         []int64 `json:"genre_ids"`
 
- 					ID               int64   `json:"id"`
 
- 					OriginalLanguage string  `json:"original_language"`
 
- 					OriginalTitle    string  `json:"original_title"`
 
- 					Overview         string  `json:"overview"`
 
- 					PosterPath       string  `json:"poster_path"`
 
- 					ReleaseDate      string  `json:"release_date"`
 
- 					Title            string  `json:"title"`
 
- 					Video            bool    `json:"video"`
 
- 					VoteAverage      float32 `json:"vote_average"`
 
- 					VoteCount        int64   `json:"vote_count"`
 
- 					Popularity       float32 `json:"popularity"`
 
- 				}{
 
- 					{
 
- 						Adult:            movieDetails.Adult,
 
- 						BackdropPath:     movieDetails.BackdropPath,
 
- 						ID:               movieDetails.ID,
 
- 						OriginalLanguage: movieDetails.OriginalLanguage,
 
- 						OriginalTitle:    movieDetails.OriginalTitle,
 
- 						Overview:         movieDetails.Overview,
 
- 						PosterPath:       movieDetails.PosterPath,
 
- 						ReleaseDate:      movieDetails.ReleaseDate,
 
- 						Title:            movieDetails.Title,
 
- 						Video:            movieDetails.Video,
 
- 						VoteAverage:      movieDetails.VoteAverage,
 
- 						VoteCount:        movieDetails.VoteCount,
 
- 						Popularity:       movieDetails.Popularity,
 
- 					},
 
- 				},
 
- 			}
 
- 		} else {
 
- 			tvDetails, err := t.tmdbClient.GetTVDetails(intVar, options)
 
- 			if err != nil {
 
- 				return nil, fmt.Errorf("error getting tmdb tv details by id = %s: %s", iD, err)
 
- 			}
 
- 			outFindByID = &tmdb.FindByID{
 
- 				TvResults: []struct {
 
- 					OriginalName     string   `json:"original_name"`
 
- 					ID               int64    `json:"id"`
 
- 					Name             string   `json:"name"`
 
- 					VoteCount        int64    `json:"vote_count"`
 
- 					VoteAverage      float32  `json:"vote_average"`
 
- 					FirstAirDate     string   `json:"first_air_date"`
 
- 					PosterPath       string   `json:"poster_path"`
 
- 					GenreIDs         []int64  `json:"genre_ids"`
 
- 					OriginalLanguage string   `json:"original_language"`
 
- 					BackdropPath     string   `json:"backdrop_path"`
 
- 					Overview         string   `json:"overview"`
 
- 					OriginCountry    []string `json:"origin_country"`
 
- 					Popularity       float32  `json:"popularity"`
 
- 				}{
 
- 					{
 
- 						OriginalName:     tvDetails.OriginalName,
 
- 						ID:               tvDetails.ID,
 
- 						Name:             tvDetails.Name,
 
- 						VoteCount:        tvDetails.VoteCount,
 
- 						VoteAverage:      tvDetails.VoteAverage,
 
- 						FirstAirDate:     tvDetails.FirstAirDate,
 
- 						PosterPath:       tvDetails.PosterPath,
 
- 						OriginalLanguage: tvDetails.OriginalLanguage,
 
- 						BackdropPath:     tvDetails.BackdropPath,
 
- 						Overview:         tvDetails.Overview,
 
- 						OriginCountry:    tvDetails.OriginCountry,
 
- 						Popularity:       tvDetails.Popularity,
 
- 					},
 
- 				},
 
- 			}
 
- 		}
 
- 	}
 
- 	return outFindByID, nil
 
- }
 
- // ConvertId 目前仅仅支持 TMDB ID 转 IMDB ID
 
- func (t *TmdbApi) ConvertId(iD string, idType string, isMovieOrSeries bool) (convertIdResult *ConvertIdResult, err error) {
 
- 	if idType == ImdbID {
 
- 		return nil, fmt.Errorf("imdb id type is not supported")
 
- 	} else if idType == TmdbID {
 
- 		var intVar int
 
- 		intVar, err = strconv.Atoi(iD)
 
- 		if err != nil {
 
- 			return nil, fmt.Errorf("error converting tmdb id = %s to int: %s", iD, err)
 
- 		}
 
- 		options := make(map[string]string)
 
- 		if isMovieOrSeries == true {
 
- 			movieExternalIDs, err := t.tmdbClient.GetMovieExternalIDs(intVar, options)
 
- 			if err != nil {
 
- 				return nil, err
 
- 			}
 
- 			convertIdResult = &ConvertIdResult{
 
- 				ImdbID: movieExternalIDs.IMDbID,
 
- 				TmdbID: iD,
 
- 			}
 
- 			return convertIdResult, nil
 
- 		} else {
 
- 			tvExternalIDs, err := t.tmdbClient.GetTVExternalIDs(intVar, options)
 
- 			if err != nil {
 
- 				return nil, err
 
- 			}
 
- 			convertIdResult = &ConvertIdResult{
 
- 				ImdbID: tvExternalIDs.IMDbID,
 
- 				TmdbID: iD,
 
- 				TvdbID: fmt.Sprintf("%d", tvExternalIDs.TVDBID),
 
- 			}
 
- 			return convertIdResult, nil
 
- 		}
 
- 	} else {
 
- 		return nil, fmt.Errorf("id type is not supported: " + idType)
 
- 	}
 
- }
 
- func (t *TmdbApi) setClientConfig() {
 
- 	// 获取 http client 实例
 
- 	restyClient, err := pkg.NewHttpClient()
 
- 	if err != nil {
 
- 		err = fmt.Errorf("error initializing resty client: %s", err)
 
- 		return
 
- 	}
 
- 	t.tmdbClient.SetClientConfig(*restyClient.GetClient())
 
- 	t.tmdbClient.SetClientAutoRetry()
 
- }
 
- const (
 
- 	ImdbID = "imdb_id"
 
- 	TmdbID = "tmdb_id"
 
- )
 
- type ConvertIdResult struct {
 
- 	ImdbID string `json:"imdb_id"`
 
- 	TmdbID string `json:"tmdb_id"`
 
- 	TvdbID string `json:"tvdb_id"`
 
- }
 
- type Req struct {
 
- 	ProxySettings       settings.ProxySettings `json:"proxy_settings"  binding:"required"`
 
- 	ApiKey              string                 `json:"api_key"`
 
- 	UseAlternateBaseURL bool                   `json:"use_alternate_base_url"`
 
- }
 
 
  |