mirror of
https://gitlab.com/foxixus/neomovies-api.git
synced 2025-10-27 17:38:51 +05:00
- 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.
91 lines
3.1 KiB
Go
91 lines
3.1 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
"neomovies-api/pkg/models"
|
|
)
|
|
|
|
type TVService struct {
|
|
db *mongo.Database
|
|
tmdb *TMDBService
|
|
kpService *KinopoiskService
|
|
}
|
|
|
|
func NewTVService(db *mongo.Database, tmdb *TMDBService, kpService *KinopoiskService) *TVService {
|
|
return &TVService{
|
|
db: db,
|
|
tmdb: tmdb,
|
|
kpService: kpService,
|
|
}
|
|
}
|
|
|
|
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 {
|
|
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) {
|
|
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) {
|
|
return s.tmdb.GetTVExternalIDs(id)
|
|
}
|