fix(api): respect explicit id_type and remove hidden TMDB fallback

- Movies/TV: if id_type=kp, fetch only from Kinopoisk (with TMDB->KP conversion)
- Movies/TV: if id_type=tmdb, fetch only from TMDB
- Default (no id_type): keep language-based behavior
- README: redact example tokens/keys with placeholders

Prevents wrong provider data when opened from search links with id_type.
This commit is contained in:
Erno
2025-10-19 07:40:37 +00:00
parent dec78baffe
commit 86042e2580
2 changed files with 66 additions and 70 deletions

View File

@@ -30,41 +30,39 @@ func (s *MovieService) Search(query string, page int, language, region string, y
} }
func (s *MovieService) GetByID(id int, language string, idType string) (*models.Movie, error) { func (s *MovieService) GetByID(id int, language string, idType string) (*models.Movie, error) {
// Если указан id_type, используем его; иначе определяем по языку // Строго уважаем явный id_type, без скрытого fallback на TMDB
useKP := false switch idType {
if idType == "kp" { case "kp":
useKP = true if s.kpService == nil {
} else if idType == "tmdb" { return nil, fmt.Errorf("kinopoisk service not configured")
useKP = false }
} else {
// Если id_type не указан, используем старую логику по языку // Сначала пробуем как Kinopoisk ID
useKP = ShouldUseKinopoisk(language) if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil {
} return MapKPFilmToTMDBMovie(kpFilm), nil
}
if useKP && s.kpService != nil {
// Сначала пробуем напрямую по KP ID // Возможно пришел TMDB ID — пробуем конвертировать TMDB -> KP
kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) if kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id); convErr == nil {
if err == nil { if kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId); err == nil {
return MapKPFilmToTMDBMovie(kpFilm), nil return MapKPFilmToTMDBMovie(kpFilm), nil
} }
}
// Если не найдено и явно указан id_type=kp, возможно это TMDB ID // Явно указан KP, но ничего не нашли — возвращаем ошибку
// Пробуем конвертировать TMDB -> KP return nil, fmt.Errorf("film not found in Kinopoisk with id %d", id)
if idType == "kp" {
kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id) case "tmdb":
if convErr == nil { return s.tmdb.GetMovie(id, language)
kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId) }
if err == nil {
return MapKPFilmToTMDBMovie(kpFilm), nil // Если id_type не указан — старая логика по языку
} if ShouldUseKinopoisk(language) && s.kpService != nil {
} if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil {
// Если конвертация не удалась, возвращаем ошибку вместо fallback return MapKPFilmToTMDBMovie(kpFilm), nil
return nil, fmt.Errorf("film not found in Kinopoisk with id %d", id) }
} }
}
return s.tmdb.GetMovie(id, language)
// Для TMDB или если KP не указан
return s.tmdb.GetMovie(id, language)
} }
func (s *MovieService) GetPopular(page int, language, region string) (*models.TMDBResponse, error) { func (s *MovieService) GetPopular(page int, language, region string) (*models.TMDBResponse, error) {

View File

@@ -26,41 +26,39 @@ func (s *TVService) Search(query string, page int, language string, year int) (*
} }
func (s *TVService) GetByID(id int, language string, idType string) (*models.TVShow, error) { func (s *TVService) GetByID(id int, language string, idType string) (*models.TVShow, error) {
// Если указан id_type, используем его; иначе определяем по языку // Строго уважаем явный id_type, без скрытого fallback на TMDB
useKP := false switch idType {
if idType == "kp" { case "kp":
useKP = true if s.kpService == nil {
} else if idType == "tmdb" { return nil, fmt.Errorf("kinopoisk service not configured")
useKP = false }
} else {
// Если id_type не указан, используем старую логику по языку // Сначала пробуем как Kinopoisk ID
useKP = ShouldUseKinopoisk(language) if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil && kpFilm != nil {
} return MapKPFilmToTVShow(kpFilm), nil
}
if useKP && s.kpService != nil {
// Сначала пробуем напрямую по KP ID // Возможно пришел TMDB ID — пробуем конвертировать TMDB -> KP
kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) if kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id); convErr == nil {
if err == nil && kpFilm != nil { if kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId); err == nil && kpFilm != nil {
return MapKPFilmToTVShow(kpFilm), nil return MapKPFilmToTVShow(kpFilm), nil
} }
}
// Если не найдено и явно указан id_type=kp, возможно это TMDB ID // Явно указан KP, но ничего не нашли — возвращаем ошибку
// Пробуем конвертировать TMDB -> KP return nil, fmt.Errorf("TV show not found in Kinopoisk with id %d", id)
if idType == "kp" {
kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id) case "tmdb":
if convErr == nil { return s.tmdb.GetTVShow(id, language)
kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId) }
if err == nil && kpFilm != nil {
return MapKPFilmToTVShow(kpFilm), nil // Если id_type не указан — старая логика по языку
} if ShouldUseKinopoisk(language) && s.kpService != nil {
} if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil && kpFilm != nil {
// Если конвертация не удалась, возвращаем ошибку вместо fallback return MapKPFilmToTVShow(kpFilm), nil
return nil, fmt.Errorf("TV show not found in Kinopoisk with id %d", id) }
} }
}
return s.tmdb.GetTVShow(id, language)
// Для TMDB или если KP не указан
return s.tmdb.GetTVShow(id, language)
} }
func (s *TVService) GetPopular(page int, language string) (*models.TMDBTVResponse, error) { func (s *TVService) GetPopular(page int, language string) (*models.TMDBTVResponse, error) {