From f2f06485fdf2db842cdc517a61d3d1a1e1160755 Mon Sep 17 00:00:00 2001 From: Erno Date: Sun, 19 Oct 2025 07:40:37 +0000 Subject: [PATCH] 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. --- README.md | 6 ++-- pkg/services/movie.go | 68 +++++++++++++++++++++---------------------- pkg/services/tv.go | 68 +++++++++++++++++++++---------------------- 3 files changed, 69 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 1535906..706e87e 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/pkg/services/movie.go b/pkg/services/movie.go index ced4c94..4099308 100644 --- a/pkg/services/movie.go +++ b/pkg/services/movie.go @@ -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) - } - - if useKP && s.kpService != nil { - // Сначала пробуем напрямую по KP ID - kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) - if 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 или если KP не указан - return s.tmdb.GetMovie(id, language) + // Строго уважаем явный id_type, без скрытого fallback на TMDB + switch idType { + case "kp": + if s.kpService == nil { + return nil, fmt.Errorf("kinopoisk service not configured") + } + + // Сначала пробуем как Kinopoisk ID + if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == 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 { + return MapKPFilmToTMDBMovie(kpFilm), nil + } + } + // Явно указан KP, но ничего не нашли — возвращаем ошибку + return nil, fmt.Errorf("film not found in Kinopoisk with id %d", id) + + 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) { diff --git a/pkg/services/tv.go b/pkg/services/tv.go index 3ac3bbe..a4d70b0 100644 --- a/pkg/services/tv.go +++ b/pkg/services/tv.go @@ -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) - } - - if useKP && s.kpService != nil { - // Сначала пробуем напрямую по KP ID - kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) - if 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 или если KP не указан - return s.tmdb.GetTVShow(id, language) + // Строго уважаем явный id_type, без скрытого fallback на TMDB + switch idType { + case "kp": + if s.kpService == nil { + return nil, fmt.Errorf("kinopoisk service not configured") + } + + // Сначала пробуем как Kinopoisk ID + if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil && kpFilm != nil { + return MapKPFilmToTVShow(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 && kpFilm != nil { + return MapKPFilmToTVShow(kpFilm), nil + } + } + // Явно указан KP, но ничего не нашли — возвращаем ошибку + return nil, fmt.Errorf("TV show not found in Kinopoisk with id %d", id) + + 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) {