Files

135 lines
4.6 KiB
Go
Raw Permalink Normal View History

2025-08-07 13:47:42 +00:00
package services
import (
fix: Remove TMDB fallback and add ID conversion for strict id_type handling ПРОБЛЕМА: - При id_type='kp' код делал fallback на TMDB если фильм не найден - Если передан TMDB ID с id_type='kp', возвращались данные из TMDB - Нарушалась явная логика выбора источника РЕШЕНИЕ: 1. Убран автоматический fallback на TMDB при id_type='kp' 2. Добавлена конвертация ID: - Если id_type='kp' и фильм не найден напрямую - Пробуем конвертировать TMDB ID → KP ID через TmdbIdToKPId - Запрашиваем данные по сконвертированному KP ID 3. Если конвертация не удалась → возвращаем ошибку ЛОГИКА: - id_type='kp' + ID=550 (TMDB): 1. Поиск KP фильма с id=550 → не найдено 2. Конвертация 550 (TMDB) → получаем KP ID (например 326) 3. Поиск KP фильма с id=326 → успех 4. Возврат данных из Kinopoisk ✅ - id_type='kp' + несуществующий ID: 1. Поиск KP фильма → не найдено 2. Конвертация → не удалась 3. Возврат ошибки (НЕ fallback на TMDB) ✅ ИЗМЕНЕНИЯ: - pkg/services/movie.go: добавлена конвертация и удален fallback - pkg/services/tv.go: добавлена конвертация и удален fallback - Добавлен import fmt для форматирования ошибок РЕЗУЛЬТАТ: ✅ Строгое соблюдение id_type параметра ✅ Умная конвертация между TMDB и KP ID ✅ Нет неожиданного fallback на другой источник
2025-10-18 23:55:42 +00:00
"fmt"
2025-08-07 13:47:42 +00:00
"go.mongodb.org/mongo-driver/mongo"
"neomovies-api/pkg/models"
)
type TVService struct {
db *mongo.Database
tmdb *TMDBService
kpService *KinopoiskService
2025-08-07 13:47:42 +00:00
}
func NewTVService(db *mongo.Database, tmdb *TMDBService, kpService *KinopoiskService) *TVService {
2025-08-07 13:47:42 +00:00
return &TVService{
db: db,
tmdb: tmdb,
kpService: kpService,
2025-08-07 13:47:42 +00:00
}
}
func (s *TVService) Search(query string, page int, language string, year int) (*models.TMDBTVResponse, error) {
return s.tmdb.SearchTVShows(query, page, language, year)
}
func (s *TVService) GetByID(id int, language string, idType string) (*models.TVShow, error) {
// Строго уважаем явный 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 {
// Попробуем обогатить TMDB сериал через IMDb -> TMDB find
if kpFilm.ImdbId != "" {
if tmdbID, fErr := s.tmdb.FindTMDBIdByIMDB(kpFilm.ImdbId, "tv", NormalizeLanguage(language)); fErr == nil {
if tmdbTV, mErr := s.tmdb.GetTVShow(tmdbID, NormalizeLanguage(language)); mErr == nil {
return tmdbTV, 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 {
if kpFilm.ImdbId != "" {
if tmdbID, fErr := s.tmdb.FindTMDBIdByIMDB(kpFilm.ImdbId, "tv", NormalizeLanguage(language)); fErr == nil {
if tmdbTV, mErr := s.tmdb.GetTVShow(tmdbID, NormalizeLanguage(language)); mErr == nil {
return tmdbTV, 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)
2025-08-07 13:47:42 +00:00
}
func (s *TVService) GetPopular(page int, language string) (*models.TMDBTVResponse, error) {
return s.tmdb.GetPopularTVShows(page, language)
}
func (s *TVService) GetTopRated(page int, language string) (*models.TMDBTVResponse, error) {
return s.tmdb.GetTopRatedTVShows(page, language)
}
func (s *TVService) GetOnTheAir(page int, language string) (*models.TMDBTVResponse, error) {
return s.tmdb.GetOnTheAirTVShows(page, language)
}
func (s *TVService) GetAiringToday(page int, language string) (*models.TMDBTVResponse, error) {
return s.tmdb.GetAiringTodayTVShows(page, language)
}
func (s *TVService) GetRecommendations(id, page int, language string) (*models.TMDBTVResponse, error) {
return s.tmdb.GetTVRecommendations(id, page, language)
}
func (s *TVService) GetSimilar(id, page int, language string) (*models.TMDBTVResponse, error) {
return s.tmdb.GetSimilarTVShows(id, page, language)
}
func (s *TVService) GetExternalIDs(id int) (*models.ExternalIDs, error) {
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
}