feat(api): enrich KP movie by resolving TMDB via IMDb /find endpoint

This commit is contained in:
Erno
2025-10-19 10:42:03 +00:00
parent 10d57af843
commit b86c9fc340
2 changed files with 57 additions and 0 deletions

View File

@@ -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
}
}

View File

@@ -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{}