mirror of
				https://gitlab.com/foxixus/neomovies-api.git
				synced 2025-10-29 02:18:50 +05:00 
			
		
		
		
	All Russian players now use format: /players/{player}/{id_type}/{id}
- id_type can be kp (Kinopoisk) or imdb
- Alloha, Lumex, Vibix, HDVB support both ID types
- Added validation for id_type parameter
- Updated handlers to parse id_type from path
		
	
		
			
				
	
	
		
			339 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package models
 | ||
| 
 | ||
| // MediaInfo represents media information structure used by handlers and services
 | ||
| type MediaInfo struct {
 | ||
| 	ID            string  `json:"id"`
 | ||
| 	Title         string  `json:"title"`
 | ||
| 	OriginalTitle string  `json:"original_title,omitempty"`
 | ||
| 	Overview      string  `json:"overview"`
 | ||
| 	PosterPath    string  `json:"poster_path"`
 | ||
| 	BackdropPath  string  `json:"backdrop_path"`
 | ||
| 	ReleaseDate   string  `json:"release_date,omitempty"`
 | ||
| 	FirstAirDate  string  `json:"first_air_date,omitempty"`
 | ||
| 	VoteAverage   float64 `json:"vote_average"`
 | ||
| 	VoteCount     int     `json:"vote_count"`
 | ||
| 	MediaType     string  `json:"media_type"`
 | ||
| 	Popularity    float64 `json:"popularity"`
 | ||
| 	GenreIDs      []int   `json:"genre_ids"`
 | ||
| }
 | ||
| 
 | ||
| type Movie struct {
 | ||
| 	ID                  int                 `json:"id"`
 | ||
| 	Title               string              `json:"title"`
 | ||
| 	OriginalTitle       string              `json:"original_title"`
 | ||
| 	Overview            string              `json:"overview"`
 | ||
| 	PosterPath          string              `json:"poster_path"`
 | ||
| 	BackdropPath        string              `json:"backdrop_path"`
 | ||
| 	ReleaseDate         string              `json:"release_date"`
 | ||
| 	GenreIDs            []int               `json:"genre_ids"`
 | ||
| 	Genres              []Genre             `json:"genres"`
 | ||
| 	VoteAverage         float64             `json:"vote_average"`
 | ||
| 	VoteCount           int                 `json:"vote_count"`
 | ||
| 	Popularity          float64             `json:"popularity"`
 | ||
| 	Adult               bool                `json:"adult"`
 | ||
| 	Video               bool                `json:"video"`
 | ||
| 	OriginalLanguage    string              `json:"original_language"`
 | ||
| 	Runtime             int                 `json:"runtime,omitempty"`
 | ||
| 	Budget              int64               `json:"budget,omitempty"`
 | ||
| 	Revenue             int64               `json:"revenue,omitempty"`
 | ||
| 	Status              string              `json:"status,omitempty"`
 | ||
| 	Tagline             string              `json:"tagline,omitempty"`
 | ||
| 	Homepage            string              `json:"homepage,omitempty"`
 | ||
| 	IMDbID              string              `json:"imdb_id,omitempty"`
 | ||
| 	KinopoiskID         int                 `json:"kinopoisk_id,omitempty"`
 | ||
| 	BelongsToCollection *Collection         `json:"belongs_to_collection,omitempty"`
 | ||
| 	ProductionCompanies []ProductionCompany `json:"production_companies,omitempty"`
 | ||
| 	ProductionCountries []ProductionCountry `json:"production_countries,omitempty"`
 | ||
| 	SpokenLanguages     []SpokenLanguage    `json:"spoken_languages,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| type TVShow struct {
 | ||
| 	ID                  int                 `json:"id"`
 | ||
| 	Name                string              `json:"name"`
 | ||
| 	OriginalName        string              `json:"original_name"`
 | ||
| 	Overview            string              `json:"overview"`
 | ||
| 	PosterPath          string              `json:"poster_path"`
 | ||
| 	BackdropPath        string              `json:"backdrop_path"`
 | ||
| 	FirstAirDate        string              `json:"first_air_date"`
 | ||
| 	LastAirDate         string              `json:"last_air_date"`
 | ||
| 	GenreIDs            []int               `json:"genre_ids"`
 | ||
| 	Genres              []Genre             `json:"genres"`
 | ||
| 	VoteAverage         float64             `json:"vote_average"`
 | ||
| 	VoteCount           int                 `json:"vote_count"`
 | ||
| 	Popularity          float64             `json:"popularity"`
 | ||
| 	OriginalLanguage    string              `json:"original_language"`
 | ||
| 	OriginCountry       []string            `json:"origin_country"`
 | ||
| 	NumberOfEpisodes    int                 `json:"number_of_episodes,omitempty"`
 | ||
| 	NumberOfSeasons     int                 `json:"number_of_seasons,omitempty"`
 | ||
| 	Status              string              `json:"status,omitempty"`
 | ||
| 	Type                string              `json:"type,omitempty"`
 | ||
| 	Homepage            string              `json:"homepage,omitempty"`
 | ||
| 	InProduction        bool                `json:"in_production,omitempty"`
 | ||
| 	Languages           []string            `json:"languages,omitempty"`
 | ||
| 	Networks            []Network           `json:"networks,omitempty"`
 | ||
| 	ProductionCompanies []ProductionCompany `json:"production_companies,omitempty"`
 | ||
| 	ProductionCountries []ProductionCountry `json:"production_countries,omitempty"`
 | ||
| 	SpokenLanguages     []SpokenLanguage    `json:"spoken_languages,omitempty"`
 | ||
| 	CreatedBy           []Creator           `json:"created_by,omitempty"`
 | ||
| 	EpisodeRunTime      []int               `json:"episode_run_time,omitempty"`
 | ||
| 	Seasons             []Season            `json:"seasons,omitempty"`
 | ||
| 	IMDbID              string              `json:"imdb_id,omitempty"`
 | ||
| 	KinopoiskID         int                 `json:"kinopoisk_id,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| // MultiSearchResult для мультипоиска
 | ||
| type MultiSearchResult struct {
 | ||
| 	ID               int      `json:"id"`
 | ||
| 	MediaType        string   `json:"media_type"`      // "movie" или "tv"
 | ||
| 	Title            string   `json:"title,omitempty"` // для фильмов
 | ||
| 	Name             string   `json:"name,omitempty"`  // для сериалов
 | ||
| 	OriginalTitle    string   `json:"original_title,omitempty"`
 | ||
| 	OriginalName     string   `json:"original_name,omitempty"`
 | ||
| 	Overview         string   `json:"overview"`
 | ||
| 	PosterPath       string   `json:"poster_path"`
 | ||
| 	BackdropPath     string   `json:"backdrop_path"`
 | ||
| 	ReleaseDate      string   `json:"release_date,omitempty"`   // для фильмов
 | ||
| 	FirstAirDate     string   `json:"first_air_date,omitempty"` // для сериалов
 | ||
| 	GenreIDs         []int    `json:"genre_ids"`
 | ||
| 	VoteAverage      float64  `json:"vote_average"`
 | ||
| 	VoteCount        int      `json:"vote_count"`
 | ||
| 	Popularity       float64  `json:"popularity"`
 | ||
| 	Adult            bool     `json:"adult"`
 | ||
| 	OriginalLanguage string   `json:"original_language"`
 | ||
| 	OriginCountry    []string `json:"origin_country,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| type MultiSearchResponse struct {
 | ||
| 	Page         int                 `json:"page"`
 | ||
| 	Results      []MultiSearchResult `json:"results"`
 | ||
| 	TotalPages   int                 `json:"total_pages"`
 | ||
| 	TotalResults int                 `json:"total_results"`
 | ||
| }
 | ||
| 
 | ||
| type Genre struct {
 | ||
| 	ID   int    `json:"id"`
 | ||
| 	Name string `json:"name"`
 | ||
| }
 | ||
| 
 | ||
| type GenresResponse struct {
 | ||
| 	Genres []Genre `json:"genres"`
 | ||
| }
 | ||
| 
 | ||
| type ExternalIDs struct {
 | ||
| 	ID          int    `json:"id"`
 | ||
| 	IMDbID      string `json:"imdb_id"`
 | ||
| 	KinopoiskID int    `json:"kinopoisk_id,omitempty"`
 | ||
| 	TVDBID      int    `json:"tvdb_id,omitempty"`
 | ||
| 	WikidataID  string `json:"wikidata_id"`
 | ||
| 	FacebookID  string `json:"facebook_id"`
 | ||
| 	InstagramID string `json:"instagram_id"`
 | ||
| 	TwitterID   string `json:"twitter_id"`
 | ||
| }
 | ||
| 
 | ||
| type Collection struct {
 | ||
| 	ID           int    `json:"id"`
 | ||
| 	Name         string `json:"name"`
 | ||
| 	PosterPath   string `json:"poster_path"`
 | ||
| 	BackdropPath string `json:"backdrop_path"`
 | ||
| }
 | ||
| 
 | ||
| type ProductionCompany struct {
 | ||
| 	ID            int    `json:"id"`
 | ||
| 	LogoPath      string `json:"logo_path"`
 | ||
| 	Name          string `json:"name"`
 | ||
| 	OriginCountry string `json:"origin_country"`
 | ||
| }
 | ||
| 
 | ||
| type ProductionCountry struct {
 | ||
| 	ISO31661 string `json:"iso_3166_1"`
 | ||
| 	Name     string `json:"name"`
 | ||
| }
 | ||
| 
 | ||
| type SpokenLanguage struct {
 | ||
| 	EnglishName string `json:"english_name"`
 | ||
| 	ISO6391     string `json:"iso_639_1"`
 | ||
| 	Name        string `json:"name"`
 | ||
| }
 | ||
| 
 | ||
| type Network struct {
 | ||
| 	ID            int    `json:"id"`
 | ||
| 	LogoPath      string `json:"logo_path"`
 | ||
| 	Name          string `json:"name"`
 | ||
| 	OriginCountry string `json:"origin_country"`
 | ||
| }
 | ||
| 
 | ||
| type Creator struct {
 | ||
| 	ID          int    `json:"id"`
 | ||
| 	CreditID    string `json:"credit_id"`
 | ||
| 	Name        string `json:"name"`
 | ||
| 	Gender      int    `json:"gender"`
 | ||
| 	ProfilePath string `json:"profile_path"`
 | ||
| }
 | ||
| 
 | ||
| type Season struct {
 | ||
| 	AirDate      string `json:"air_date"`
 | ||
| 	EpisodeCount int    `json:"episode_count"`
 | ||
| 	ID           int    `json:"id"`
 | ||
| 	Name         string `json:"name"`
 | ||
| 	Overview     string `json:"overview"`
 | ||
| 	PosterPath   string `json:"poster_path"`
 | ||
| 	SeasonNumber int    `json:"season_number"`
 | ||
| }
 | ||
| 
 | ||
| type SeasonDetails struct {
 | ||
| 	AirDate      string    `json:"air_date"`
 | ||
| 	Episodes     []Episode `json:"episodes"`
 | ||
| 	Name         string    `json:"name"`
 | ||
| 	Overview     string    `json:"overview"`
 | ||
| 	ID           int       `json:"id"`
 | ||
| 	PosterPath   string    `json:"poster_path"`
 | ||
| 	SeasonNumber int       `json:"season_number"`
 | ||
| }
 | ||
| 
 | ||
| type Episode struct {
 | ||
| 	AirDate        string  `json:"air_date"`
 | ||
| 	EpisodeNumber  int     `json:"episode_number"`
 | ||
| 	ID             int     `json:"id"`
 | ||
| 	Name           string  `json:"name"`
 | ||
| 	Overview       string  `json:"overview"`
 | ||
| 	ProductionCode string  `json:"production_code"`
 | ||
| 	Runtime        int     `json:"runtime"`
 | ||
| 	SeasonNumber   int     `json:"season_number"`
 | ||
| 	ShowID         int     `json:"show_id"`
 | ||
| 	StillPath      string  `json:"still_path"`
 | ||
| 	VoteAverage    float64 `json:"vote_average"`
 | ||
| 	VoteCount      int     `json:"vote_count"`
 | ||
| }
 | ||
| 
 | ||
| type TMDBResponse struct {
 | ||
| 	Page         int     `json:"page"`
 | ||
| 	Results      []Movie `json:"results"`
 | ||
| 	TotalPages   int     `json:"total_pages"`
 | ||
| 	TotalResults int     `json:"total_results"`
 | ||
| }
 | ||
| 
 | ||
| type TMDBTVResponse struct {
 | ||
| 	Page         int      `json:"page"`
 | ||
| 	Results      []TVShow `json:"results"`
 | ||
| 	TotalPages   int      `json:"total_pages"`
 | ||
| 	TotalResults int      `json:"total_results"`
 | ||
| }
 | ||
| 
 | ||
| type SearchParams struct {
 | ||
| 	Query              string `json:"query"`
 | ||
| 	Page               int    `json:"page"`
 | ||
| 	Language           string `json:"language"`
 | ||
| 	Region             string `json:"region"`
 | ||
| 	Year               int    `json:"year"`
 | ||
| 	PrimaryReleaseYear int    `json:"primary_release_year"`
 | ||
| }
 | ||
| 
 | ||
| type APIResponse struct {
 | ||
| 	Success bool        `json:"success"`
 | ||
| 	Data    interface{} `json:"data,omitempty"`
 | ||
| 	Error   string      `json:"error,omitempty"`
 | ||
| 	Message string      `json:"message,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| // Модели для торрентов
 | ||
| type TorrentResult struct {
 | ||
| 	Title       string   `json:"title"`
 | ||
| 	Tracker     string   `json:"tracker"`
 | ||
| 	Size        string   `json:"size"`
 | ||
| 	Seeders     int      `json:"seeders"`
 | ||
| 	Peers       int      `json:"peers"`
 | ||
| 	Leechers    int      `json:"leechers"`
 | ||
| 	Quality     string   `json:"quality"`
 | ||
| 	Voice       []string `json:"voice,omitempty"`
 | ||
| 	Types       []string `json:"types,omitempty"`
 | ||
| 	Seasons     []int    `json:"seasons,omitempty"`
 | ||
| 	Category    string   `json:"category"`
 | ||
| 	MagnetLink  string   `json:"magnet"`
 | ||
| 	TorrentLink string   `json:"torrent_link,omitempty"`
 | ||
| 	Details     string   `json:"details,omitempty"`
 | ||
| 	PublishDate string   `json:"publish_date"`
 | ||
| 	AddedDate   string   `json:"added_date,omitempty"`
 | ||
| 	Source      string   `json:"source"`
 | ||
| }
 | ||
| 
 | ||
| type TorrentSearchResponse struct {
 | ||
| 	Query   string          `json:"query"`
 | ||
| 	Results []TorrentResult `json:"results"`
 | ||
| 	Total   int             `json:"total"`
 | ||
| }
 | ||
| 
 | ||
| // RedAPI специфичные структуры
 | ||
| type RedAPIResponse struct {
 | ||
| 	Results []RedAPITorrent `json:"Results"`
 | ||
| }
 | ||
| 
 | ||
| type RedAPITorrent struct {
 | ||
| 	Title        string             `json:"Title"`
 | ||
| 	Tracker      string             `json:"Tracker"`
 | ||
| 	Size         interface{}        `json:"Size"` // Может быть string или number
 | ||
| 	Seeders      int                `json:"Seeders"`
 | ||
| 	Peers        int                `json:"Peers"`
 | ||
| 	MagnetUri    string             `json:"MagnetUri"`
 | ||
| 	PublishDate  string             `json:"PublishDate"`
 | ||
| 	CategoryDesc string             `json:"CategoryDesc"`
 | ||
| 	Details      string             `json:"Details"`
 | ||
| 	Info         *RedAPITorrentInfo `json:"Info,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| type RedAPITorrentInfo struct {
 | ||
| 	Quality interface{} `json:"quality,omitempty"` // Может быть string или number
 | ||
| 	Voices  []string    `json:"voices,omitempty"`
 | ||
| 	Types   []string    `json:"types,omitempty"`
 | ||
| 	Seasons []int       `json:"seasons,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| // Alloha API структуры для получения информации о фильмах
 | ||
| type AllohaResponse struct {
 | ||
| 	Data *AllohaData `json:"data"`
 | ||
| }
 | ||
| 
 | ||
| type AllohaData struct {
 | ||
| 	Name         string `json:"name"`
 | ||
| 	OriginalName string `json:"original_name"`
 | ||
| }
 | ||
| 
 | ||
| // Опции поиска торрентов
 | ||
| type TorrentSearchOptions struct {
 | ||
| 	Season           *int
 | ||
| 	Quality          []string
 | ||
| 	MinQuality       string
 | ||
| 	MaxQuality       string
 | ||
| 	ExcludeQualities []string
 | ||
| 	HDR              *bool
 | ||
| 	HEVC             *bool
 | ||
| 	SortBy           string
 | ||
| 	SortOrder        string
 | ||
| 	GroupByQuality   bool
 | ||
| 	GroupBySeason    bool
 | ||
| 	ContentType      string
 | ||
| }
 | ||
| 
 | ||
| // Модели для плееров
 | ||
| type PlayerResponse struct {
 | ||
| 	Type   string `json:"type"`
 | ||
| 	URL    string `json:"url"`
 | ||
| 	Iframe string `json:"iframe,omitempty"`
 | ||
| }
 | ||
| 
 | ||
| // Модели для реакций
 | ||
| type Reaction struct {
 | ||
| 	ID      string `json:"id" bson:"_id,omitempty"`
 | ||
| 	UserID  string `json:"userId" bson:"userId"`
 | ||
| 	MediaID string `json:"mediaId" bson:"mediaId"`
 | ||
| 	Type    string `json:"type" bson:"type"`
 | ||
| 	Created string `json:"created" bson:"created"`
 | ||
| }
 | ||
| 
 | ||
| type ReactionCounts struct {
 | ||
| 	Fire  int `json:"fire"`
 | ||
| 	Nice  int `json:"nice"`
 | ||
| 	Think int `json:"think"`
 | ||
| 	Bore  int `json:"bore"`
 | ||
| 	Shit  int `json:"shit"`
 | ||
| }
 |