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 f5a754ddf7
commit f2f06485fd
3 changed files with 69 additions and 73 deletions

View File

@@ -57,7 +57,7 @@ TMDB_ACCESS_TOKEN=your_tmdb_access_token
JWT_SECRET=your_jwt_secret_key
# Kinopoisk API
KPAPI_KEY=920aaf6a-9f64-46f7-bda7-209fb1069440
KPAPI_KEY=your_kp_api_key
KPAPI_BASE_URL=https://kinopoiskapiunofficial.tech/api
# Сервис
@@ -74,8 +74,8 @@ GMAIL_APP_PASSWORD=your_gmail_app_password
LUMEX_URL=https://p.lumex.space
ALLOHA_TOKEN=your_alloha_token
VIBIX_HOST=https://vibix.org
VIBIX_TOKEN=18745|NzecUXT4gikPUtFkSEFlDLPmr9kWnQACTo1N0Ixq9240bcf1
HDVB_TOKEN=b9ae5f8c4832244060916af4aa9d1939
VIBIX_TOKEN=your_vibix_token
HDVB_TOKEN=your_hdvb_token
# Торренты (RedAPI)
REDAPI_BASE_URL=http://redapi.cfhttp.top

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