diff --git a/pkg/services/movie.go b/pkg/services/movie.go index 4099308..3337e5e 100644 --- a/pkg/services/movie.go +++ b/pkg/services/movie.go @@ -39,12 +39,27 @@ func (s *MovieService) GetByID(id int, language string, idType string) (*models. // Сначала пробуем как Kinopoisk ID if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil { + // Попробуем обогатить TMDB фильмом через IMDb -> TMDB find + if kpFilm.ImdbId != "" { + if tmdbID, fErr := s.tmdb.FindTMDBIdByIMDB(kpFilm.ImdbId, "movie", NormalizeLanguage(language)); fErr == nil { + if tmdbMovie, mErr := s.tmdb.GetMovie(tmdbID, NormalizeLanguage(language)); mErr == nil { + return tmdbMovie, nil + } + } + } return MapKPFilmToTMDBMovie(kpFilm), nil } // Возможно пришел TMDB ID — пробуем конвертировать TMDB -> KP if kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id); convErr == nil { if kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId); err == nil { + if kpFilm.ImdbId != "" { + if tmdbID, fErr := s.tmdb.FindTMDBIdByIMDB(kpFilm.ImdbId, "movie", NormalizeLanguage(language)); fErr == nil { + if tmdbMovie, mErr := s.tmdb.GetMovie(tmdbID, NormalizeLanguage(language)); mErr == nil { + return tmdbMovie, nil + } + } + } return MapKPFilmToTMDBMovie(kpFilm), nil } } diff --git a/pkg/services/tmdb.go b/pkg/services/tmdb.go index 8415964..b1502fd 100644 --- a/pkg/services/tmdb.go +++ b/pkg/services/tmdb.go @@ -179,6 +179,48 @@ func (s *TMDBService) GetTVShow(id int, language string) (*models.TVShow, error) return &tvShow, err } +// FindTMDBIdByIMDB finds TMDB IDs by external IMDb ID using /find/{external_id} +// media: "movie" | "tv" | "" (auto) +func (s *TMDBService) FindTMDBIdByIMDB(imdbID string, media string, language string) (int, error) { + if imdbID == "" { + return 0, fmt.Errorf("imdb id is empty") + } + if language == "" { + language = "ru-RU" + } + params := url.Values{} + params.Set("external_source", "imdb_id") + params.Set("language", language) + endpoint := fmt.Sprintf("%s/find/%s?%s", s.baseURL, url.PathEscape(imdbID), params.Encode()) + + var resp struct { + MovieResults []struct{ ID int `json:"id"` } `json:"movie_results"` + TVResults []struct{ ID int `json:"id"` } `json:"tv_results"` + } + if err := s.makeRequest(endpoint, &resp); err != nil { + return 0, err + } + + switch media { + case "movie": + if len(resp.MovieResults) > 0 { + return resp.MovieResults[0].ID, nil + } + case "tv": + if len(resp.TVResults) > 0 { + return resp.TVResults[0].ID, nil + } + default: + if len(resp.MovieResults) > 0 { + return resp.MovieResults[0].ID, nil + } + if len(resp.TVResults) > 0 { + return resp.TVResults[0].ID, nil + } + } + return 0, fmt.Errorf("tmdb id not found for imdb %s", imdbID) +} + func (s *TMDBService) GetGenres(mediaType string, language string) (*models.GenresResponse, error) { params := url.Values{}