mirror of
https://gitlab.com/foxixus/neomovies-api.git
synced 2025-10-27 17:38:51 +05:00
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:
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user