models

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 10, 2026 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

Package models defines the request parameter types and response types for the Kodik API.

Request parameter types

Each API endpoint has a corresponding Params type:

All Params types expose a ToMap method that serialises non-zero fields into a map[string]string used as URL query parameters. Zero-value fields are omitted automatically, so you only set what you need:

params := &models.SearchParams{
    Title: "Naruto",
    Limit: 10,
}
// Only "title" and "limit" are sent; everything else is omitted.

Shared filter fields

Most filtering options (genres, ratings, personnel, status, etc.) are shared across all endpoints. They are defined in MediaFilters, which is embedded in every Params type, so fields are accessed directly:

params := &models.ListParams{}
params.Genres = "anime"
params.KinopoiskRating = "7.0-10"
params.Sort = "updated_at"
params.Order = "desc"

The ContentFilters struct (embedded in SearchParams and ListParams) adds episode/season flags and region-blocking controls on top of MediaFilters:

params := &models.SearchParams{
    Title:            "Attack on Titan",
    WithMaterialData: true,
    WithSeasons:      true,
}

Pointer booleans

Fields of type *bool (e.g. [MediaFilters.Lgbt], [ContentFilters.Camrip]) use a pointer so that false and "not set" are distinct. A nil pointer means the parameter is not sent; a non-nil pointer always sends the value:

f := false
params.Camrip = &f   // sends camrip=false
params.Camrip = nil  // parameter is omitted entirely

Response types

The core content types are Material (a film, serial, or anime entry) and MaterialData (extended metadata from external sources such as Kinopoisk, IMDb, and Shikimori).

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type ContentFilters

type ContentFilters struct {
	Camrip           *bool  `json:"camrip,omitempty"`             // Filter by camrip status
	WithSeasons      bool   `json:"with_seasons,omitempty"`       // Include season data in response
	Season           int    `json:"season,omitempty"`             // Filter by specific season number
	WithEpisodes     bool   `json:"with_episodes,omitempty"`      // Include episode data in response
	WithEpisodesData bool   `json:"with_episodes_data,omitempty"` // Include detailed episode data
	Episode          int    `json:"episode,omitempty"`            // Filter by specific episode number
	WithPageLinks    bool   `json:"with_page_links,omitempty"`    // Return page links instead of player links
	NotBlockedIn     string `json:"not_blocked_in,omitempty"`     // Comma-separated country codes; return only unblocked content
	NotBlockedForMe  *bool  `json:"not_blocked_for_me,omitempty"` // Auto-detect requester's country to filter blocked content
	WithMaterialData bool   `json:"with_material_data,omitempty"` // Include extended material metadata

	MediaFilters
}

ContentFilters extends MediaFilters with parameters specific to content-listing endpoints (/search and /list). These fields control how individual episodes, seasons, and links are returned, and allow blocking content by region.

type CountriesParams

type CountriesParams struct {
	MediaFilters
}

CountriesParams contains parameters for the /countries endpoint.

func (CountriesParams) ToMap

func (cp CountriesParams) ToMap() map[string]string

ToMap serializes CountriesParams into a flat string map suitable for query parameters.

type CountriesResponse

type CountriesResponse struct {
	Time    string    `json:"time"`    // Время выполнения запроса (например, "5ms")
	Total   int       `json:"total"`   // Общее количество стран
	Results []Country `json:"results"` // Список стран с количеством материалов для каждой
}

CountriesResponse представляет структуру ответа от эндпоинта /countries API Kodik.

type Country

type Country struct {
	Title string `json:"title"`
	Count int    `json:"count"`
}

Country описывает отдельную страну в ответе API. Поле Title содержит название страны, а Count — количество материалов, связанных с ней.

type Genre

type Genre struct {
	Title string `json:"title"`
	Count int    `json:"count"`
}

Genre описывает отдельный жанр. Поле Title содержит название жанра, а Count — количество материалов, связанных с ним.

type GenresParams

type GenresParams struct {
	// GenresType selects the genre source: "kinopoisk" (default), "shikimori", "mydramalist", or "all".
	GenresType string `json:"genres_type,omitempty"`

	MediaFilters
}

GenresParams contains parameters for the /genres endpoint.

func (GenresParams) ToMap

func (gp GenresParams) ToMap() map[string]string

ToMap serializes GenresParams into a flat string map suitable for query parameters.

type GenresResponse

type GenresResponse struct {
	Time    string  `json:"time"`    // Время выполнения запроса (например, "5ms")
	Total   int     `json:"total"`   // Общее количество жанров
	Results []Genre `json:"results"` // Список жанров с количеством материалов для каждого
}

GenresResponse представляет структуру ответа от эндпоинта /genres API Kodik.

type ListParams

type ListParams struct {
	Limit int    `json:"limit,omitempty"` // Results per request (1–100)
	Order string `json:"order,omitempty"` // Sort direction: "asc" or "desc"

	ContentFilters
}

ListParams contains parameters for the /list endpoint.

func (ListParams) ToMap

func (lp ListParams) ToMap() map[string]string

ToMap serializes ListParams into a flat string map suitable for query parameters.

type ListResponse

type ListResponse struct {
	Time     string     `json:"time"`
	Total    int        `json:"total"`
	PrevPage *string    `json:"prev_page"` // Может быть null
	NextPage *string    `json:"next_page"` // Может быть null
	Results  []Material `json:"results"`
}

ListResponse описывает ответ от эндпоинта /list API Kodik.

type Material

type Material struct {
	ID               string      `json:"id"`
	Title            string      `json:"title"`
	TitleOrig        string      `json:"title_orig"`
	OtherTitle       string      `json:"other_title"`
	Link             string      `json:"link"`
	Year             int         `json:"year"`
	KinopoiskID      string      `json:"kinopoisk_id"`
	ImdbID           string      `json:"imdb_id"`
	MdlID            string      `json:"mdl_id"`
	WorldartLink     string      `json:"worldart_link"`
	ShikimoriID      string      `json:"shikimori_id"`
	Type             string      `json:"type"`
	Quality          string      `json:"quality"`
	Camrip           bool        `json:"camrip"`
	Lgbt             bool        `json:"lgbt"`
	Translation      Translation `json:"translation"`
	CreatedAt        time.Time   `json:"created_at"`
	UpdatedAt        time.Time   `json:"updated_at"`
	BlockedCountries []string    `json:"blocked_countries"`

	// Данные, специфичные для сериалов (для фильмов могут отсутствовать)
	Seasons        interface{} `json:"seasons,omitempty"`
	LastSeason     int         `json:"last_season,omitempty"`
	LastEpisode    int         `json:"last_episode,omitempty"`
	EpisodesCount  int         `json:"episodes_count,omitempty"`
	BlockedSeasons interface{} `json:"blocked_seasons,omitempty"`
	Screenshots    []string    `json:"screenshots,omitempty"`

	// Дополнительная информация из внешних источников (KinoPoisk, Shikimori, MyDramaList)
	MaterialData *MaterialData `json:"material_data,omitempty"`
}

Material описывает основные данные материала (фильма, сериала и т.д.).

type MaterialData

type MaterialData struct {
	// Основная информация
	Title         *string  `json:"title,omitempty"`
	AnimeTitle    *string  `json:"anime_title,omitempty"`
	TitleEn       *string  `json:"title_en,omitempty"`
	OtherTitles   []string `json:"other_titles,omitempty"`
	OtherTitlesEn []string `json:"other_titles_en,omitempty"`
	OtherTitlesJp []string `json:"other_titles_jp,omitempty"`

	// Аниме-специфичная информация
	AnimeLicenseName *string  `json:"anime_license_name,omitempty"`
	AnimeLicensedBy  []string `json:"anime_licensed_by,omitempty"`
	AnimeKind        *string  `json:"anime_kind,omitempty"`

	// MyDramaList теги
	MydramalistTags []string `json:"mydramalist_tags,omitempty"`

	// Статусы
	AllStatus   *string `json:"all_status,omitempty"`
	AnimeStatus *string `json:"anime_status,omitempty"`
	DramaStatus *string `json:"drama_status,omitempty"`

	// Основные данные
	Year             *int    `json:"year,omitempty"`
	Tagline          *string `json:"tagline,omitempty"`
	Description      *string `json:"description,omitempty"`
	AnimeDescription *string `json:"anime_description,omitempty"`

	// Постеры
	PosterUrl      *string  `json:"poster_url,omitempty"`
	AnimePosterUrl *string  `json:"anime_poster_url,omitempty"`
	DramaPosterUrl *string  `json:"drama_poster_url,omitempty"`
	Screenshots    []string `json:"screenshots,omitempty"`

	// Продолжительность и география
	Duration  *int     `json:"duration,omitempty"`
	Countries []string `json:"countries,omitempty"`

	// Жанры
	AllGenres    []string `json:"all_genres,omitempty"`
	Genres       []string `json:"genres,omitempty"`
	AnimeGenres  []string `json:"anime_genres,omitempty"`
	DramaGenres  []string `json:"drama_genres,omitempty"`
	AnimeStudios []string `json:"anime_studios,omitempty"`

	// Рейтинги
	KinopoiskRating   *float64 `json:"kinopoisk_rating,omitempty"`
	KinopoiskVotes    *int     `json:"kinopoisk_votes,omitempty"`
	ImdbRating        *float64 `json:"imdb_rating,omitempty"`
	ImdbVotes         *int     `json:"imdb_votes,omitempty"`
	ShikimoriRating   *float64 `json:"shikimori_rating,omitempty"`
	ShikimoriVotes    *int     `json:"shikimori_votes,omitempty"`
	MydramalistRating *float64 `json:"mydramalist_rating,omitempty"`
	MydramalistVotes  *int     `json:"mydramalist_votes,omitempty"`

	// Даты
	PremiereRu    *string `json:"premiere_ru,omitempty"`
	PremiereWorld *string `json:"premiere_world,omitempty"`
	AiredAt       *string `json:"aired_at,omitempty"`
	ReleasedAt    *string `json:"released_at,omitempty"`
	NextEpisodeAt *string `json:"next_episode_at,omitempty"`

	// Возрастные ограничения
	RatingMpaa *string `json:"rating_mpaa,omitempty"`
	MinimalAge *int    `json:"minimal_age,omitempty"`

	// Эпизоды
	EpisodesTotal *int `json:"episodes_total,omitempty"`
	EpisodesAired *int `json:"episodes_aired,omitempty"`

	// Участники производства
	Actors    []string `json:"actors,omitempty"`
	Directors []string `json:"directors,omitempty"`
	Producers []string `json:"producers,omitempty"`
	Writers   []string `json:"writers,omitempty"`
	Composers []string `json:"composers,omitempty"`
	Editors   []string `json:"editors,omitempty"`
	Designers []string `json:"designers,omitempty"`
	Operators []string `json:"operators,omitempty"`
}

MaterialData описывает дополнительную информацию о материале из различных источников.

type MediaFilters

type MediaFilters struct {
	Types             string `json:"types,omitempty"`              // Comma-separated material types (e.g. "anime-serial,foreign-movie")
	Year              string `json:"year,omitempty"`               // Exact year or range (e.g. "2020", "2010-2020")
	TranslationID     int    `json:"translation_id,omitempty"`     // Filter by voice-over ID
	BlockTranslations string `json:"block_translations,omitempty"` // Comma-separated voice-over IDs to exclude
	TranslationType   string `json:"translation_type,omitempty"`   // "voice" or "subtitles"
	HasField          string `json:"has_field,omitempty"`          // Filter by presence of a field (e.g. "kinopoisk_id")
	Lgbt              *bool  `json:"lgbt,omitempty"`               // Filter by LGBT content
	Sort              string `json:"sort,omitempty"`               // Sort field (endpoint-specific, e.g. "title", "count", "updated_at")

	Countries string `json:"countries,omitempty"` // Comma-separated country filter
	Genres    string `json:"genres,omitempty"`    // Comma-separated genre filter

	AnimeGenres string `json:"anime_genres,omitempty"` // Anime-specific genre filter
	DramaGenres string `json:"drama_genres,omitempty"` // Drama-specific genre filter
	AllGenres   string `json:"all_genres,omitempty"`   // Filter across all genre sources

	Duration          string `json:"duration,omitempty"`           // Minutes, exact or range (e.g. "90", "80-120")
	KinopoiskRating   string `json:"kinopoisk_rating,omitempty"`   // Rating or range (e.g. "7.0", "6.5-8.2")
	ImdbRating        string `json:"imdb_rating,omitempty"`        // IMDb rating or range
	ShikimoriRating   string `json:"shikimori_rating,omitempty"`   // Shikimori rating or range
	MydramalistRating string `json:"mydramalist_rating,omitempty"` // MyDramaList rating or range

	Actors    string `json:"actors,omitempty"`    // Comma-separated actor names
	Directors string `json:"directors,omitempty"` // Comma-separated director names
	Producers string `json:"producers,omitempty"` // Comma-separated producer names
	Writers   string `json:"writers,omitempty"`   // Comma-separated writer names
	Composers string `json:"composers,omitempty"` // Comma-separated composer names
	Editors   string `json:"editors,omitempty"`   // Comma-separated editor names
	Designers string `json:"designers,omitempty"` // Comma-separated designer names
	Operators string `json:"operators,omitempty"` // Comma-separated operator names

	RatingMPAA      string `json:"rating_mpaa,omitempty"`       // MPAA rating (e.g. "PG-13", "R")
	MinimalAge      string `json:"minimal_age,omitempty"`       // Minimum viewer age (e.g. "16", "12-16")
	AnimeKind       string `json:"anime_kind,omitempty"`        // Anime type: "tv", "movie", "ova", "ona", etc.
	MydramalistTags string `json:"mydramalist_tags,omitempty"`  // Comma-separated MyDramaList tags
	AnimeStatus     string `json:"anime_status,omitempty"`      // "anons", "ongoing", "released"
	DramaStatus     string `json:"drama_status,omitempty"`      // "anons", "ongoing", "released"
	AllStatus       string `json:"all_status,omitempty"`        // Universal status filter
	AnimeStudios    string `json:"anime_studios,omitempty"`     // Comma-separated anime studio names
	AnimeLicensedBy string `json:"anime_licensed_by,omitempty"` // Comma-separated license holders
}

MediaFilters contains filter parameters shared across all Kodik API endpoints. Embed this struct in any Params type to get all common filters and their serialization.

type QualitiesParams

type QualitiesParams struct {
	MediaFilters
}

QualitiesParams contains parameters for the /qualities/v2 endpoint.

func (QualitiesParams) ToMap

func (qp QualitiesParams) ToMap() map[string]string

ToMap serializes QualitiesParams into a flat string map suitable for query parameters.

type QualitiesResponse

type QualitiesResponse struct {
	Time    string         `json:"time"`    // Время выполнения запроса (например, "5ms")
	Total   int            `json:"total"`   // Общее количество записей
	Results []QualityEntry `json:"results"` // Список записей с качествами видео
}

QualitiesResponse представляет структуру ответа для эндпоинта /qualities/v2.

type QualityEntry

type QualityEntry struct {
	Title string `json:"title"` // Название качества (например, "WEB-DLRip 720p")
	Count int    `json:"count"` // Число материалов, имеющих данное качество
}

QualityEntry описывает отдельную запись качества видео, приходящую в ответе от API.

type SearchParams

type SearchParams struct {
	// Text search
	Title     string `json:"title,omitempty"`
	TitleOrig string `json:"title_orig,omitempty"`
	Strict    bool   `json:"strict,omitempty"`     // Require exact word match
	FullMatch bool   `json:"full_match,omitempty"` // Require full string match

	// External identifiers (alternative to text search)
	ID                  string `json:"id,omitempty"`
	PlayerLink          string `json:"player_link,omitempty"`
	KinopoiskID         int    `json:"kinopoisk_id,omitempty"`
	ImdbID              string `json:"imdb_id,omitempty"`
	MdlID               string `json:"mdl_id,omitempty"`
	WorldartAnimationID int    `json:"worldart_animation_id,omitempty"`
	WorldartCinemaID    int    `json:"worldart_cinema_id,omitempty"`
	WorldartLink        string `json:"worldart_link,omitempty"`
	ShikimoriID         int    `json:"shikimori_id,omitempty"`

	// Pagination
	Limit int `json:"limit,omitempty"` // Max results to return (1–100)

	// Translation priority controls
	PrioritizeTranslations    string `json:"prioritize_translations,omitempty"`
	UnprioritizeTranslations  string `json:"unprioritize_translations,omitempty"`
	PrioritizeTranslationType string `json:"prioritize_translation_type,omitempty"`

	ContentFilters
}

SearchParams contains parameters for the /search endpoint. At least one of Title, TitleOrig, or an external identifier must be provided.

func (SearchParams) ToMap

func (sp SearchParams) ToMap() map[string]string

ToMap serializes SearchParams into a flat string map suitable for query parameters.

type SearchResponse

type SearchResponse struct {
	Results []Material `json:"results"`
}

SearchResponse представляет структуру ответа для запроса /search.

type Translation

type Translation struct {
	ID    int    `json:"id"`
	Title string `json:"title"`
	Type  string `json:"type"` // Возможные значения: "voice" или "subtitles"
}

Translation описывает структуру озвучки (дублирования).

type TranslationEntry

type TranslationEntry struct {
	ID    int    `json:"id"`    // Уникальный идентификатор озвучки
	Title string `json:"title"` // Название озвучки
	Count int    `json:"count"` // Число материалов, в которых используется данная озвучка
}

TranslationEntry описывает отдельную запись озвучки в ответе API.

type TranslationsParams

type TranslationsParams struct {
	MediaFilters
}

TranslationsParams contains parameters for the /translations/v2 endpoint.

func (TranslationsParams) ToMap

func (tp TranslationsParams) ToMap() map[string]string

ToMap serializes TranslationsParams into a flat string map suitable for query parameters.

type TranslationsResponse

type TranslationsResponse struct {
	Time    string             `json:"time"`    // Время выполнения запроса (например, "5ms")
	Total   int                `json:"total"`   // Общее количество записей
	Results []TranslationEntry `json:"results"` // Список записей (озвучек)
}

TranslationsResponse представляет структуру ответа эндпоинта /translations/v2.

type YearEntry

type YearEntry struct {
	Year  int `json:"year"`  // Год материала
	Count int `json:"count"` // Количество материалов за данный год
}

YearEntry описывает отдельную запись года в ответе API.

type YearsParams

type YearsParams struct {
	MediaFilters
}

YearsParams contains parameters for the /years endpoint.

func (YearsParams) ToMap

func (yp YearsParams) ToMap() map[string]string

ToMap serializes YearsParams into a flat string map suitable for query parameters.

type YearsResponse

type YearsResponse struct {
	Time    string      `json:"time"`    // Время выполнения запроса (например, "5ms")
	Total   int         `json:"total"`   // Общее количество лет
	Results []YearEntry `json:"results"` // Список записей с годом и количеством материалов
}

YearsResponse представляет структуру ответа от эндпоинта /years API Kodik.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL