From 33572b0cff1f8f3296fb4482969bb997125aa48b Mon Sep 17 00:00:00 2001 From: Erno Date: Sun, 19 Oct 2025 12:48:11 +0000 Subject: [PATCH] fix(api): add TMDB ID enrichment for KP content via IMDB ID lookup - Add TMDBID field to ExternalIDs model - Enhance GetExternalIDs in MovieService and TVService to fetch TMDB ID via FindTMDBIdByIMDB - Add EnrichKPWithTMDBID function to enrich unified content with TMDB IDs - Update unified handlers to automatically enrich KP content with TMDB IDs - Enrich search results with TMDB IDs by fetching full film data for each result This ensures that when using source=kp, the response includes TMDB IDs in externalIds when available through IMDB ID mapping, while preserving all original KP data. --- pkg/handlers/unified.go | 25 +++++++++++++++++++++++++ pkg/models/movie.go | 1 + pkg/services/kp_mapper.go | 34 ++++++++++++++++++++++++++++++++++ pkg/services/movie.go | 8 ++++++++ pkg/services/tv.go | 31 ++++++++++++++++++++++++++++++- 5 files changed, 98 insertions(+), 1 deletion(-) diff --git a/pkg/handlers/unified.go b/pkg/handlers/unified.go index 8d391c2..853552f 100644 --- a/pkg/handlers/unified.go +++ b/pkg/handlers/unified.go @@ -61,6 +61,10 @@ func (h *UnifiedHandler) GetMovie(w http.ResponseWriter, r *http.Request) { return } data = services.MapKPToUnified(kpFilm) + // Обогащаем TMDB ID если есть IMDB ID + if h.tmdb != nil { + services.EnrichKPWithTMDBID(data, h.tmdb) + } } else { // tmdb movie, err := h.tmdb.GetMovie(id, language) @@ -99,6 +103,10 @@ func (h *UnifiedHandler) GetTV(w http.ResponseWriter, r *http.Request) { return } data = services.MapKPToUnified(kpFilm) + // Обогащаем TMDB ID если есть IMDB ID + if h.tmdb != nil { + services.EnrichKPWithTMDBID(data, h.tmdb) + } } else { tv, err := h.tmdb.GetTVShow(id, language) if err != nil { @@ -139,6 +147,23 @@ func (h *UnifiedHandler) Search(w http.ResponseWriter, r *http.Request) { return } items := services.MapKPSearchToUnifiedItems(kpSearch) + // Обогащаем результаты поиска TMDB ID через получение полной информации о фильмах + if h.tmdb != nil { + for i := range items { + if kpID, err := strconv.Atoi(items[i].ID); err == nil { + if kpFilm, err := h.kp.GetFilmByKinopoiskId(kpID); err == nil && kpFilm.ImdbId != "" { + items[i].ExternalIDs.IMDb = kpFilm.ImdbId + mediaType := "movie" + if items[i].Type == "tv" { + mediaType = "tv" + } + if tmdbID, err := h.tmdb.FindTMDBIdByIMDB(kpFilm.ImdbId, mediaType, "ru-RU"); err == nil { + items[i].ExternalIDs.TMDB = &tmdbID + } + } + } + } + } resp := models.UnifiedSearchResponse{ Success: true, Data: items, diff --git a/pkg/models/movie.go b/pkg/models/movie.go index 3ead6bc..6097c68 100644 --- a/pkg/models/movie.go +++ b/pkg/models/movie.go @@ -123,6 +123,7 @@ type ExternalIDs struct { ID int `json:"id"` IMDbID string `json:"imdb_id"` KinopoiskID int `json:"kinopoisk_id,omitempty"` + TMDBID int `json:"tmdb_id,omitempty"` TVDBID int `json:"tvdb_id,omitempty"` WikidataID string `json:"wikidata_id"` FacebookID string `json:"facebook_id"` diff --git a/pkg/services/kp_mapper.go b/pkg/services/kp_mapper.go index 982ad3f..0c7e0b8 100644 --- a/pkg/services/kp_mapper.go +++ b/pkg/services/kp_mapper.go @@ -388,3 +388,37 @@ func FormatKPDate(year int) string { } return fmt.Sprintf("%d-01-01", year) } + +// EnrichKPWithTMDBID обогащает KP контент TMDB ID через IMDB ID +func EnrichKPWithTMDBID(content *models.UnifiedContent, tmdbService *TMDBService) { + if content == nil || content.IMDbID == "" || content.ExternalIDs.TMDB != nil { + return + } + + mediaType := "movie" + if content.Type == "tv" { + mediaType = "tv" + } + + if tmdbID, err := tmdbService.FindTMDBIdByIMDB(content.IMDbID, mediaType, "ru-RU"); err == nil { + content.ExternalIDs.TMDB = &tmdbID + } +} + +// EnrichKPSearchItemsWithTMDBID обогащает массив поисковых элементов TMDB ID +func EnrichKPSearchItemsWithTMDBID(items []models.UnifiedSearchItem, tmdbService *TMDBService) { + for i := range items { + if items[i].ExternalIDs.IMDb == "" || items[i].ExternalIDs.TMDB != nil { + continue + } + + mediaType := "movie" + if items[i].Type == "tv" { + mediaType = "tv" + } + + if tmdbID, err := tmdbService.FindTMDBIdByIMDB(items[i].ExternalIDs.IMDb, mediaType, "ru-RU"); err == nil { + items[i].ExternalIDs.TMDB = &tmdbID + } + } +} diff --git a/pkg/services/movie.go b/pkg/services/movie.go index 3337e5e..ed1a1ee 100644 --- a/pkg/services/movie.go +++ b/pkg/services/movie.go @@ -122,6 +122,14 @@ func (s *MovieService) GetExternalIDs(id int) (*models.ExternalIDs, error) { if err == nil && kpFilm != nil { externalIDs := MapKPExternalIDsToTMDB(kpFilm) externalIDs.ID = id + + // Пытаемся получить TMDB ID через IMDB ID + if kpFilm.ImdbId != "" && s.tmdb != nil { + if tmdbID, tmdbErr := s.tmdb.FindTMDBIdByIMDB(kpFilm.ImdbId, "movie", "ru-RU"); tmdbErr == nil { + externalIDs.TMDBID = tmdbID + } + } + return externalIDs, nil } } diff --git a/pkg/services/tv.go b/pkg/services/tv.go index a4d70b0..769d0e4 100644 --- a/pkg/services/tv.go +++ b/pkg/services/tv.go @@ -86,5 +86,34 @@ func (s *TVService) GetSimilar(id, page int, language string) (*models.TMDBTVRes } func (s *TVService) GetExternalIDs(id int) (*models.ExternalIDs, error) { - return s.tmdb.GetTVExternalIDs(id) + if s.kpService != nil { + kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) + if err == nil && kpFilm != nil { + externalIDs := MapKPExternalIDsToTMDB(kpFilm) + externalIDs.ID = id + + // Пытаемся получить TMDB ID через IMDB ID + if kpFilm.ImdbId != "" && s.tmdb != nil { + if tmdbID, tmdbErr := s.tmdb.FindTMDBIdByIMDB(kpFilm.ImdbId, "tv", "ru-RU"); tmdbErr == nil { + externalIDs.TMDBID = tmdbID + } + } + + return externalIDs, nil + } + } + + tmdbIDs, err := s.tmdb.GetTVExternalIDs(id) + if err != nil { + return nil, err + } + + if s.kpService != nil && tmdbIDs.IMDbID != "" { + kpFilm, err := s.kpService.GetFilmByImdbId(tmdbIDs.IMDbID) + if err == nil && kpFilm != nil { + tmdbIDs.KinopoiskID = kpFilm.KinopoiskId + } + } + + return tmdbIDs, nil }