diff --git a/.gitignore b/.gitignore index af90ec9..2c3c4af 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ exampleVault/.obsidian/plugins/obsidian-media-db-plugin/* !exampleVault/.obsidian/plugins/obsidian-media-db-plugin/.hotreload exampleVault/Media DB/* +meta.txt diff --git a/README.md b/README.md index 5434c6b..61f013e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,16 @@ ## Obsidian Media DB Plugin -A plugin that can query multiple APIs for movies, series, anime, manga, games, music and wiki articles, and import them into your vault. +A plugin that can query multiple APIs for movies, series, anime, manga, books, comics, games, music, and wiki articles, and import them into your vault. + +> [!WARNING] +> Please make sure you are looking at the README on the [release branch](https://github.com/mProjectsCode/obsidian-media-db-plugin/blob/release/README.md). +> The README on the master branch refers to the current in-development version of the plugin. ### Features #### Search by Title -Search a movie, series, anime, game, music release or wiki article by its name across multiple APIs. +Search for movies, series, anime, manga, books, comics, games, music releases, or wiki articles by their name across multiple APIs. #### Search by ID @@ -15,54 +19,54 @@ Allows you to search by an ID that varies from API to API. Concrete information #### Templates The plugin allows you to set a template note that gets added to the end of any note created by this plugin. -The plugin also offers simple "template tgs". E.g. if the template includes `{{ title }}`, it will be replaced by the title of the movie, show or game. -Note that "template tags" are surrounded with two curly braces and that the spaces inside the curly braces are important. +The plugin also offers simple template tags, for example `{{ title }}`, which will be replaced by the title of the media being imported. +Note that template tags are surrounded by two curly braces and spaces. The spaces inside the curly braces are important! -For arrays there are two special ways of displaying them. +For arrays, there are two special ways of displaying them: -- using `{{ LIST:variable_name }}` will result in +- using `{{ LIST:variable_name }}` will result in: ``` - element 1 - element 2 - element 3 - ... ``` -- using `{{ ENUM:variable_name }}` will result in +- using `{{ ENUM:variable_name }}` will result in: ``` element 1, element 2, element 3, ... ``` -Available variables that can be used in template tags are the same variables from the metadata of the note. +Available variables that can be used in template tags are any front-matter properties. I also published my own templates [here](https://github.com/mProjectsCode/obsidian-media-db-templates). +#### Download poster images + +The plugin offers a setting to automatically download the poster images for a new media, ensuring offline access. The images are saved as `type_title (year)` e.g. `movie_The Perfect Storm (2000)`, in a user-chosen folder. + #### Metadata field customization -Allows you to rename the metadata fields this plugin generates through mappings. +Allows you to rename the metadata fields this plugin generates through mappings. The mappings can be set in the plugin's settings. +The three options for mapping are: -A mapping has to follow this syntax `[origional property name] -> [new property name]`. -Multiple mappings are separated by a new line. -So e.g.: - -``` -title -> name -year -> releaseYear -``` +- `default`: Keep the original name +- `remap`: Rename the property +- `remove`: Removes the property entirely #### Bulk Import -The plugin allows you to import your preexisting media collection and upgrade them to Media DB entries. +The plugin allows you to import your preexisting media collection and upgrade it to Media DB entries. ##### Prerequisites The preexisting media notes must be inside a folder in your vault. -For the plugin to be able to query them they need one metadata field that is used as the title the piece of media is searched by. -This can be achieved by for example using a `csv` import plugin to import an existing list from outside of obsidian. +For the plugin to be able to query them, they need one metadata field that is used as the title the piece of media is searched by. +This can be achieved by, for example, using a `csv` import plugin to import an existing list from outside of Obsidian. ##### Importing To start the import process, right-click on the folder and select the `Import folder as Media DB entries` option. -Then specify the API to search, if the current note content and metadata should be appended to the Media DB entry and the name of the metadata field that contains the title of the piece of media. +Then specify the API to search, if the current note content and metadata should be appended to the Media DB entry, and the name of the metadata field that contains the title of the piece of media. Then the plugin will go through every file in the folder and prompt you to select from the search results. @@ -72,7 +76,7 @@ After all files have been imported or the import was canceled, you will find the ### How to install -**The plugin is now released, so it can be installed directly through obsidian's plugin installer.** +**The plugin is now released, so it can be installed directly through Obsidian's plugin installer.** Alternatively, you can manually download the zip archive from the latest release here on GitHub. After downloading, extract the archive into the `.obsidian/plugins` folder in your vault. @@ -91,20 +95,19 @@ The folder structure should look like this: ### How to use -(pictures are coming) - Once you have installed this plugin, you will find a database icon in the left ribbon. -When using this or the `Add new Media DB entry` command, a popup will open. -Here you can enter the title of what you want to search for and then select in which APIs to search. +When using this or the `Add new Media DB entry` command, a pop-up will open. +Here, you can enter the title of what you want to search for and then select which APIs to search. -After clicking search, a new popup will open prompting you to select from the search results. -Now you select the result you want and the plugin will cast it's magic and create a new note in your vault, that contains the metadata of the selected search result. +After clicking search, a new pop-up will open, prompting you to select from the search results. +Now you select the result you want, and the plugin will cast its magic, creating a new note in your vault that contains the metadata of the selected search result. ### Currently supported media types - movies (including specials) - series (including OVAs) -- games +- videogames +- boardgames - music releases - wiki articles - books @@ -116,21 +119,23 @@ Now you select the result you want and the plugin will cast it's magic and creat | Name | Description | Supported formats | Authentification | Rate limiting | SFW filter support | | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | | [Jikan](https://jikan.moe/) | Jikan is an API that uses [My Anime List](https://myanimelist.net) and offers metadata for anime. | series, movies, specials, OVAs, manga, manwha, novels | No | 60 per minute and 3 per second | Yes | -| [OMDb](https://www.omdbapi.com/) | OMDb is an API that offers metadata for movie, series and games. | series, movies, games | Yes, you can get a free key here [here](https://www.omdbapi.com/apikey.aspx) | 1000 per day | No | +| [OMDb](https://www.omdbapi.com/) | OMDb is an API that offers metadata for movies, series, and games. | series, movies, games | Yes, you can get a free key here [here](https://www.omdbapi.com/apikey.aspx) | 1000 per day | No | +| [TMDB](https://www.themoviedb.org/) | TMDB is a API that offers community editable metadata for movies and series. | series, movies | Yes, by making an account [here](https://www.themoviedb.org/signup) and getting your `API Key` (**not** `API Read Access Token`) [here](https://www.themoviedb.org/settings/api) | 50 per second | Yes | | [MusicBrainz](https://musicbrainz.org/) | MusicBrainz is an API that offers information about music releases. | music releases | No | 50 per second | No | | [Wikipedia](https://en.wikipedia.org/wiki/Main_Page) | The Wikipedia API allows access to all Wikipedia articles. | wiki articles | No | None | No | -| [Steam](https://store.steampowered.com/) | The Steam API offers information on all steam games. | games | No | 10000 per day | No | -| [Open Library](https://openlibrary.org) | The OpenLibrary API offers metadata for books | books | No | Cover access is rate-limited when not using CoverID or OLID by max 100 requests/IP every 5 minutes. This plugin uses OLID so there shouldn't be a rate limit. | No | +| [Steam](https://store.steampowered.com/) | The Steam API offers information on all Steam games. | games | No | 10000 per day | No | +| [Open Library](https://openlibrary.org) | The OpenLibrary API offers metadata for books | books | No | Cover access is rate-limited when not using CoverID or OLID by max 100 requests/IP every 5 minutes. This plugin uses OLID, so there shouldn't be a rate limit. | No | | [Moby Games](https://www.mobygames.com) | The Moby Games API offers metadata for games for all platforms | games | Yes, by making an account [here](https://www.mobygames.com/user/register/). NOTE: As of September 2024 the API key is no longer free so consider using Giant Bomb or steam instead | API requests are limited to 360 per hour (one every ten seconds). In addition, requests should be made no more frequently than one per second. | No | | [Giant Bomb](https://www.giantbomb.com) | The Giant Bomb API offers metadata for games for all platforms | games | Yes, by making an account [here](https://www.giantbomb.com/login-signup/) | API requests are limited to 200 requests per resource, per hour. In addition, they implement velocity detection to prevent malicious use. If too many requests are made per second, you may receive temporary blocks to resources. | No | | Comic Vine | The Comic Vine API offers metadata for comic books | comicbooks | Yes, by making an account [here](https://comicvine.gamespot.com/login-signup/) and going to the [api section](https://comicvine.gamespot.com/api/) of the site | 200 requests per resource, per hour. There is also a velocity detection to prevent malicious use. If too many requests are made per second, you may receive temporary blocks to resources. | No | | [VNDB](https://vndb.org/) | The VNDB API offers metadata for visual novels | games | No | 200 requests per 5 minutes | Yes | +| [Boardgame Geek](https://boardgamegeek.com) | The Boardgame Geek API offers metadata for boardgames | boardgames | Yes, by making an account [here](https://boardgamegeek.com/join/) and then [requesting an application token](https://boardgamegeek.com/applications) | Exact usage limits are still undetermined | No | #### Notes - [Jikan](https://jikan.moe/) - - sometimes the api is very slow, this is normal - - you need to use the title the anime has on [My Anime List](https://myanimelist.net), which is in most cases the japanese title + - sometimes the api is very slow; this is normal + - you need to use the title the anime has on [My Anime List](https://myanimelist.net), which is in most cases the Japanese title - e.g. instead of "Demon Slayer" you have to search "Kimetsu no Yaiba" #### Search by ID @@ -148,16 +153,22 @@ Now you select the result you want and the plugin will cast it's magic and creat - you can find this ID in the URL - e.g. for "Rogue One" the URL looks like this `https://www.imdb.com/title/tt3748528/` so the ID is `tt3748528` - [MusicBrainz](https://musicbrainz.org/) - - the id of a release is not easily accessible, you are better off just searching by title + - the id of a release is not easily accessible; you are better off just searching by title + - the search is generally for albums but you can have a more granular search like so: + - search for albums by a specific `artist:"Lady Gaga" AND primarytype:"album"` + - search for a specific album by a specific artist `artist:"Lady Gaga" AND primarytype:"album" AND releasegroup:"The Fame"` + - search for a specific entry (song or album) by a specific `artist:"Lady Gaga" AND releasegroup:"Poker face"` - [Wikipedia](https://en.wikipedia.org/wiki/Main_Page) - [here](https://en.wikipedia.org/wiki/Wikipedia:Finding_a_Wikidata_ID) is a guide to finding the Wikipedia ID for an article - [Steam](https://store.steampowered.com/) - you can find this ID in the URL - e.g. for "Factorio" the URL looks like this `https://store.steampowered.com/app/427520/Factorio/` so the ID is `427520` - [Open Library](https://openlibrary.org) - - The ID you need is the "work" ID and not the "book" ID, it needs to start with `/works/`. You can find this ID in the URL - - e.g. for "Fantastic Mr. Fox" the URL looks like this `https://openlibrary.org/works/OL45804W` so the ID is `/works/OL45804W` - - This URL is located near the top of the page above the title, see `An edition of Fantastic Mr Fox (1970) ` + - The ID can either be the "/work/" ID, the "/book/" ID, or the "/isbn/" ID it needs to start with `/works/`. You can find this ID in the URL + - e.g. for "Fantastic Mr. Fox" the "/works/" URL looks like this `https://openlibrary.org/works/OL45804W` so the ID is `/works/OL45804W` + - This URL is located near the top of the page above the title, see `An edition of Fantastic Mr Fox (1970) ` + - For a specific edition of "Fantastic Mr. Fox" the "/books/" URL looks like this `https://openlibrary.org/books/OL3567303M/` so the ID is `/books/OL3567303M` + - This URL is located in the editions section` - [Moby Games](https://www.mobygames.com) - you can find this ID in the URL - e.g. for "Bioshock 2" the URL looks like this `https://www.mobygames.com/game/45089/bioshock-2/` so the ID is `45089` @@ -172,7 +183,7 @@ Now you select the result you want and the plugin will cast it's magic and creat - Located in the novel's VNDB URL path - e.g. The ID for [Katawa Shoujo](https://vndb.org/v945) (`https://vndb.org/v945`) is `v945` -### Problems, unexpected behavior or improvement suggestions? +### Problems, unexpected behavior, or improvement suggestions? You are more than welcome to open an issue on [GitHub](https://github.com/mProjectsCode/obsidian-media-db-plugin/issues). @@ -187,4 +198,3 @@ Contributions are always welcome. If you have an idea, feel free to open a featu Credits go to: - https://github.com/anpigon/obsidian-book-search-plugin for some inspiration and the idea to make this plugin -- https://github.com/liamcain/obsidian-periodic-notes for 99% of `Suggest.ts` and `FolderSuggest.ts` diff --git a/automation/fetchSchemas.ts b/automation/fetchSchemas.ts new file mode 100644 index 0000000..f3e2d48 --- /dev/null +++ b/automation/fetchSchemas.ts @@ -0,0 +1,20 @@ +import { $ } from 'utils/shellUtils'; + +async function fetchSchema() { + // https://docs.api.jikan.moe/ + await $('bun openapi-typescript https://raw.githubusercontent.com/jikan-me/jikan-rest/master/storage/api-docs/api-docs.json -o ./src/api/schemas/MALAPI.ts'); + + // https://www.giantbomb.com/forums/api-developers-3017/giant-bomb-openapi-specification-1901269/ + await $('bun openapi-typescript ./src/api/schemas/GiantBomb.json -o ./src/api/schemas/GiantBomb.ts'); + + // https://www.omdbapi.com/swagger.json + // await $('bun openapi-typescript ./src/api/schemas/OMDb.json -o ./src/api/schemas/OMDb.ts'); + + // https://github.com/internetarchive/openlibrary-api/blob/main/swagger.yaml + await $('bun openapi-typescript ./src/api/schemas/OpenLibrary.json -o ./src/api/schemas/OpenLibrary.ts'); + + // https://developer.themoviedb.org/openapi + await $('bun openapi-typescript https://developer.themoviedb.org/openapi/tmdb-api.json -o ./src/api/schemas/TMDB.ts'); +} + +await fetchSchema(); diff --git a/bun.lockb b/bun.lockb index 67f6c25..88a3ee5 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/eslint.config.mjs b/eslint.config.mjs index 5a0b7d2..8d66d47 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -7,7 +7,7 @@ import * as plugin_import from 'eslint-plugin-import'; export default tseslint.config( { - ignores: ['npm/', 'node_modules/', 'exampleVault/', 'automation/', 'main.js', '*.svelte'], + ignores: ['npm/', 'node_modules/', 'exampleVault/', 'automation/', 'main.js', '*.svelte', 'src/api/schemas/'], }, { files: ['src/**/*.ts'], diff --git a/manifest-beta.json b/manifest-beta.json index a8d101f..45e9dc6 100644 --- a/manifest-beta.json +++ b/manifest-beta.json @@ -1,7 +1,7 @@ { "id": "obsidian-media-db-plugin", "name": "Media DB", - "version": "0.8.0", + "version": "0.8.0-canary.20251229T143140", "minAppVersion": "1.5.0", "description": "A plugin that can query multiple APIs for movies, series, anime, games, music and wiki articles, and import them into your vault.", "author": "Moritz Jung", diff --git a/package.json b/package.json index 3dfa6f7..1d4f84f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "obsidian-media-db-plugin", "version": "0.8.0", - "description": "A plugin that can query multiple APIs for movies, series, anime, games, music and wiki articles, and import them into your vault.", + "description": "A plugin that can query multiple APIs for movies, series, anime, manga, books, comics, games, music and wiki articles, and import them into your vault.", "main": "main.js", "scripts": { "dev": "bun run automation/build/esbuild.dev.config.ts", @@ -14,8 +14,8 @@ "lint": "eslint --max-warnings=0 src/**", "lint:fix": "eslint --max-warnings=0 --fix src/**", "svelte-check": "svelte-check --compiler-warnings \"unused-export-let:ignore\"", - "check": "bun run format:check && bun run tsc && bun run test", - "check:fix": "bun run format && bun run tsc && bun run test", + "check": "bun run format:check && bun run tsc && bun run lint && bun run svelte-check", + "check:fix": "bun run format && bun run tsc && bun run lint:fix && bun run svelte-check", "release": "bun run automation/release.ts", "stats": "bun run automation/stats.ts" }, @@ -23,26 +23,29 @@ "author": "Moritz Jung", "license": "GPL-3.0", "devDependencies": { - "@popperjs/core": "^2.11.8", + "@happy-dom/global-registrator": "^18.0.1", "@lemons_dev/parsinom": "^0.0.12", - "@happy-dom/global-registrator": "^14.12.3", - "@types/bun": "^1.1.16", - "builtin-modules": "^4.0.0", - "esbuild": "^0.24.2", + "@popperjs/core": "^2.11.8", + "@types/bun": "^1.2.19", + "builtin-modules": "^5.0.0", + "esbuild": "^0.25.8", "esbuild-plugin-copy-watch": "^2.3.1", - "esbuild-svelte": "^0.8.2", - "eslint": "^9.18.0", - "eslint-plugin-import": "^2.31.0", + "esbuild-svelte": "^0.9.3", + "eslint": "^9.32.0", + "eslint-plugin-import": "^2.32.0", "eslint-plugin-only-warn": "^1.1.0", + "iso-639-2": "^3.0.2", "obsidian": "latest", - "prettier": "^3.4.2", - "prettier-plugin-svelte": "^3.3.3", + "openapi-fetch": "^0.14.0", + "openapi-typescript": "^7.8.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", "string-argv": "^0.3.2", - "svelte": "^5.17.5", - "svelte-check": "^4.1.4", + "svelte": "^5.38.0", + "svelte-check": "^4.3.1", "svelte-preprocess": "^6.0.3", "tslib": "^2.8.1", - "typescript": "^5.7.3", - "typescript-eslint": "^8.20.0" + "typescript": "^5.9.2", + "typescript-eslint": "^8.39.0" } } diff --git a/src/api/APIModel.ts b/src/api/APIModel.ts index d23f2a5..0919db9 100644 --- a/src/api/APIModel.ts +++ b/src/api/APIModel.ts @@ -10,7 +10,7 @@ export abstract class APIModel { plugin!: MediaDbPlugin; /** - * This function should query the api and return a list of matches. The matches should be caped at 20. + * This function should query the api and return a list of matches. The matches should be capped at 20. * * @param title the title to query for */ @@ -18,14 +18,11 @@ export abstract class APIModel { abstract getById(id: string): Promise; + abstract getDisabledMediaTypes(): MediaType[]; + hasType(type: MediaType): boolean { - // if ( - // this.types.contains(type) && - // (Boolean((this.plugin.settings.apiToggle as any)?.[this.apiName]?.[type]) === true || (this.plugin.settings.apiToggle as any)?.[this.apiName]?.[type] === undefined) - // ) { - // return true; - // } - return this.types.contains(type); + const disabledMediaTypes = this.getDisabledMediaTypes(); + return this.types.includes(type) && !disabledMediaTypes.includes(type); } hasTypeOverlap(types: MediaType[]): boolean { diff --git a/src/api/apis/BoardGameGeekAPI.ts b/src/api/apis/BoardGameGeekAPI.ts index 96ef76e..07c2098 100644 --- a/src/api/apis/BoardGameGeekAPI.ts +++ b/src/api/apis/BoardGameGeekAPI.ts @@ -5,6 +5,8 @@ import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +// sadly no open api schema available + export class BoardGameGeekAPI extends APIModel { plugin: MediaDbPlugin; @@ -14,7 +16,7 @@ export class BoardGameGeekAPI extends APIModel { this.plugin = plugin; this.apiName = 'BoardGameGeekAPI'; this.apiDescription = 'A free API for BoardGameGeek things.'; - this.apiUrl = 'https://api.geekdo.com/xmlapi'; + this.apiUrl = 'https://boardgamegeek.com/xmlapi/'; this.types = [MediaType.BoardGame]; } @@ -24,8 +26,15 @@ export class BoardGameGeekAPI extends APIModel { const searchUrl = `${this.apiUrl}/search?search=${encodeURIComponent(title)}`; const fetchData = await requestUrl({ url: searchUrl, + headers: { + Authorization: `Bearer ${this.plugin.settings.BoardgameGeekKey}`, + }, }); + if (fetchData.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + if (fetchData.status !== 200) { throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); } @@ -62,8 +71,15 @@ export class BoardGameGeekAPI extends APIModel { const searchUrl = `${this.apiUrl}/boardgame/${encodeURIComponent(id)}?stats=1`; const fetchData = await requestUrl({ url: searchUrl, + headers: { + Authorization: `Bearer ${this.plugin.settings.BoardgameGeekKey}`, + }, }); + if (fetchData.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + if (fetchData.status !== 200) { throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); } @@ -117,4 +133,7 @@ export class BoardGameGeekAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.BoardgameGeekAPI_disabledMediaTypes; + } } diff --git a/src/api/apis/ComicVineAPI.ts b/src/api/apis/ComicVineAPI.ts index 86c9bf8..53d9820 100644 --- a/src/api/apis/ComicVineAPI.ts +++ b/src/api/apis/ComicVineAPI.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access */ + import { requestUrl } from 'obsidian'; import { ComicMangaModel } from 'src/models/ComicMangaModel'; import type MediaDbPlugin from '../../main'; @@ -5,6 +7,8 @@ import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +// sadly no open api schema available + export class ComicVineAPI extends APIModel { plugin: MediaDbPlugin; @@ -41,7 +45,7 @@ export class ComicVineAPI extends APIModel { year: result.start_year, dataSource: this.apiName, id: `4050-${result.id}`, - publishers: result.publisher?.name ?? [], + publishers: result.publisher?.name, }), ); } @@ -64,28 +68,32 @@ export class ComicVineAPI extends APIModel { } const data = await fetchData.json; - // console.debug(data); const result = data.results; + const authors = result.people as + | { + name: string; + }[] + | undefined; + return new ComicMangaModel({ type: MediaType.ComicManga, title: result.name, englishTitle: result.name, alternateTitles: result.aliases, plot: result.deck, - year: result.start_year ?? '', + year: result.start_year, dataSource: this.apiName, url: result.site_detail_url, id: `4050-${result.id}`, - authors: result.people?.map((x: any) => x.name) ?? [], + authors: authors?.map(x => x.name), chapters: result.count_of_issues, - image: result.image?.original_url ?? '', + image: result.image?.original_url, released: true, - publishers: result.publisher?.name ?? [], - publishedFrom: result.start_year ?? 'unknown', - publishedTo: 'unknown', + publishers: result.publisher?.name, + publishedFrom: result.start_year, status: result.status, userData: { @@ -95,4 +103,7 @@ export class ComicVineAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.ComicVineAPI_disabledMediaTypes; + } } diff --git a/src/api/apis/GiantBombAPI.ts b/src/api/apis/GiantBombAPI.ts index 60bf4e8..76e451b 100644 --- a/src/api/apis/GiantBombAPI.ts +++ b/src/api/apis/GiantBombAPI.ts @@ -1,9 +1,11 @@ -import { requestUrl } from 'obsidian'; +import createClient from 'openapi-fetch'; +import { obsidianFetch } from 'src/utils/Utils'; import type MediaDbPlugin from '../../main'; import { GameModel } from '../../models/GameModel'; import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +import type { paths } from '../schemas/GiantBomb'; export class GiantBombAPI extends APIModel { plugin: MediaDbPlugin; @@ -18,6 +20,7 @@ export class GiantBombAPI extends APIModel { this.apiUrl = 'https://www.giantbomb.com/api'; this.types = [MediaType.Game]; } + async searchByTitle(title: string): Promise { console.log(`MDB | api "${this.apiName}" queried by Title`); @@ -25,35 +28,42 @@ export class GiantBombAPI extends APIModel { throw Error(`MDB | API key for ${this.apiName} missing.`); } - const searchUrl = `${this.apiUrl}/games?api_key=${this.plugin.settings.GiantBombKey}&filter=name:${encodeURIComponent(title)}&format=json`; - const fetchData = await requestUrl({ - url: searchUrl, + const client = createClient({ baseUrl: 'https://www.giantbomb.com/api/' }); + const response = await client.GET('/games', { + params: { + query: { + api_key: this.plugin.settings.GiantBombKey, + filter: `name:${title}`, + format: 'json', + limit: 20, + }, + }, + fetch: obsidianFetch, }); - // console.debug(fetchData); - - if (fetchData.status === 401) { + if (response.response.status === 401) { throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); } - if (fetchData.status === 429) { + if (response.response.status === 429) { throw Error(`MDB | Too many requests for ${this.apiName}, you've exceeded your API quota.`); } - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + if (response.response.status !== 200) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); } - const data = await fetchData.json; - // console.debug(data); + const data = response.data?.results; + const ret: MediaTypeModel[] = []; - for (const result of data.results) { + for (const result of data ?? []) { + const year = result.original_release_date ? new Date(result.original_release_date).getFullYear().toString() : undefined; + ret.push( new GameModel({ - type: MediaType.Game, title: result.name, englishTitle: result.name, - year: new Date(result.original_release_date).getFullYear().toString(), + year: year, dataSource: this.apiName, - id: result.guid, + id: result.guid?.toString(), }), ); } @@ -68,36 +78,79 @@ export class GiantBombAPI extends APIModel { throw Error(`MDB | API key for ${this.apiName} missing.`); } - const searchUrl = `${this.apiUrl}/game/${encodeURIComponent(id)}/?api_key=${this.plugin.settings.GiantBombKey}&format=json`; - const fetchData = await requestUrl({ - url: searchUrl, + const client = createClient({ baseUrl: 'https://www.giantbomb.com/api/' }); + const response = await client.GET('/game/{guid}', { + params: { + path: { + guid: id, + }, + query: { + api_key: this.plugin.settings.GiantBombKey, + format: 'json', + }, + }, + fetch: obsidianFetch, }); - console.debug(fetchData); - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + if (response.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + if (response.response.status === 429) { + throw Error(`MDB | Too many requests for ${this.apiName}, you've exceeded your API quota.`); + } + if (response.response.status !== 200) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); } - const data = await fetchData.json; - // console.debug(data); - const result = data.results; + const result = response.data?.results; + + if (!result) { + throw Error(`MDB | No results found for ID ${id} in ${this.apiName}.`); + } + + console.log(result); + + // sadly the only OpenAPI definition I could find doesn't have the right types + const year = result.original_release_date ? new Date(result.original_release_date).getFullYear().toString() : undefined; + const developers = result.developers as + | { + name: string; + }[] + | undefined; + const publishers = result.publishers as + | { + name: string; + }[] + | undefined; + const genres = result.genres as + | { + name: string; + }[] + | undefined; + const image = result.image as + | { + small_url: string; + medium_url: string; + super_url: string; + } + | undefined; return new GameModel({ type: MediaType.Game, title: result.name, englishTitle: result.name, - year: new Date(result.original_release_date).getFullYear().toString(), + year: year, dataSource: this.apiName, url: result.site_detail_url, - id: result.guid, - developers: result.developers?.map((x: any) => x.name) ?? [], - publishers: result.publishers?.map((x: any) => x.name) ?? [], - genres: result.genres?.map((x: any) => x.name) ?? [], + id: result.guid?.toString(), + developers: developers?.map(x => x.name), + publishers: publishers?.map(x => x.name), + genres: genres?.map(x => x.name), onlineRating: 0, - image: result.image?.super_url ?? '', + image: image?.super_url, released: true, - releaseDate: result.original_release_date ?? 'unknown', + releaseDate: result.original_release_date, userData: { played: false, @@ -106,4 +159,7 @@ export class GiantBombAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.GiantBombAPI_disabledMediaTypes; + } } diff --git a/src/api/apis/MALAPI.ts b/src/api/apis/MALAPI.ts index fa0d322..5ac2cf9 100644 --- a/src/api/apis/MALAPI.ts +++ b/src/api/apis/MALAPI.ts @@ -1,9 +1,12 @@ +import createClient from 'openapi-fetch'; +import { isTruthy, obsidianFetch } from 'src/utils/Utils'; import type MediaDbPlugin from '../../main'; import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MovieModel } from '../../models/MovieModel'; import { SeriesModel } from '../../models/SeriesModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +import type { paths } from '../schemas/MALAPI'; export class MALAPI extends APIModel { plugin: MediaDbPlugin; @@ -28,30 +31,42 @@ export class MALAPI extends APIModel { async searchByTitle(title: string): Promise { console.log(`MDB | api "${this.apiName}" queried by Title`); - const searchUrl = `https://api.jikan.moe/v4/anime?q=${encodeURIComponent(title)}&limit=20${this.plugin.settings.sfwFilter ? '&sfw' : ''}`; + const client = createClient({ baseUrl: 'https://api.jikan.moe/v4/' }); - const fetchData = await fetch(searchUrl); - // console.debug(fetchData); - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + const response = await client.GET('/anime', { + params: { + query: { + q: title, + limit: 20, + sfw: this.plugin.settings.sfwFilter ? true : false, + }, + }, + fetch: obsidianFetch, + }); + + if (response.error !== undefined) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); } - const data = await fetchData.json(); - // console.debug(data); + const data = response.data?.data; const ret: MediaTypeModel[] = []; - for (const result of data.data) { - const type = this.typeMappings.get(result.type?.toLowerCase()); + for (const result of data ?? []) { + const resType = result.type?.toLowerCase(); + const type = resType ? this.typeMappings.get(resType) : undefined; + const year = result.year?.toString() ?? result.aired?.prop?.from?.year?.toString() ?? ''; + const id = result.mal_id?.toString(); + if (type === undefined) { ret.push( new MovieModel({ subType: '', title: result.title, englishTitle: result.title_english ?? result.title, - year: result.year ?? result.aired?.prop?.from?.year ?? '', + year, dataSource: this.apiName, - id: result.mal_id, + id, }), ); } @@ -61,9 +76,9 @@ export class MALAPI extends APIModel { subType: type, title: result.title, englishTitle: result.title_english ?? result.title, - year: result.year ?? result.aired?.prop?.from?.year ?? '', + year, dataSource: this.apiName, - id: result.mal_id, + id, }), ); } else if (type === 'series' || type === 'ova') { @@ -72,9 +87,9 @@ export class MALAPI extends APIModel { subType: type, title: result.title, englishTitle: result.title_english ?? result.title, - year: result.year ?? result.aired?.prop?.from?.year ?? '', + year, dataSource: this.apiName, - id: result.mal_id, + id, }), ); } @@ -86,41 +101,53 @@ export class MALAPI extends APIModel { async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `https://api.jikan.moe/v4/anime/${encodeURIComponent(id)}/full`; - const fetchData = await fetch(searchUrl); + const client = createClient({ baseUrl: 'https://api.jikan.moe/v4/' }); - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + const response = await client.GET('/anime/{id}/full', { + params: { + path: { + id: id as unknown as number, // This is fine + }, + }, + fetch: obsidianFetch, + }); + + if (response.error !== undefined) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); } - const data = await fetchData.json(); - // console.debug(data); - const result = data.data; + const result = response.data?.data; + + if (result === undefined) { + throw Error(`MDB | No data found for ID ${id} in ${this.apiName}.`); + } + + const resType = result.type?.toLowerCase(); + const type = resType ? this.typeMappings.get(resType) : undefined; + const year = result.year?.toString() ?? result.aired?.prop?.from?.year?.toString(); + const new_id = result.mal_id?.toString(); - const type = this.typeMappings.get(result.type?.toLowerCase()); if (type === undefined) { return new MovieModel({ - subType: '', + subType: undefined, title: result.title, englishTitle: result.title_english ?? result.title, - year: result.year ?? result.aired?.prop?.from?.year ?? '', + year: year, dataSource: this.apiName, url: result.url, - id: result.mal_id, + id: new_id, plot: result.synopsis, - genres: result.genres?.map((x: any) => x.name) ?? [], - director: [], - writer: [], - studio: result.studios?.map((x: any) => x.name).join(', ') ?? 'unknown', - duration: result.duration ?? 'unknown', - onlineRating: result.score ?? 0, - actors: [], - image: result.images?.jpg?.image_url ?? '', + genres: result.genres?.map(x => x.name).filter(isTruthy), + studio: result.studios?.map(x => x.name).filter(isTruthy), + duration: result.duration, + onlineRating: result.score, + image: result.images?.jpg?.image_url, released: true, - premiere: this.plugin.dateFormatter.format(result.aired?.from, this.apiDateFormat) ?? 'unknown', - streamingServices: result.streaming?.map((x: any) => x.name) ?? [], + ageRating: result.rating, + premiere: this.plugin.dateFormatter.format(result.aired?.from, this.apiDateFormat), + streamingServices: result.streaming?.map(x => x.name).filter(isTruthy), userData: { watched: false, @@ -135,24 +162,22 @@ export class MALAPI extends APIModel { subType: type, title: result.title, englishTitle: result.title_english ?? result.title, - year: result.year ?? result.aired?.prop?.from?.year ?? '', + year: year, dataSource: this.apiName, url: result.url, - id: result.mal_id, + id: new_id, plot: result.synopsis, - genres: result.genres?.map((x: any) => x.name) ?? [], - director: [], - writer: [], - studio: result.studios?.map((x: any) => x.name).join(', ') ?? 'unknown', - duration: result.duration ?? 'unknown', - onlineRating: result.score ?? 0, - actors: [], - image: result.images?.jpg?.image_url ?? '', + genres: result.genres?.map(x => x.name).filter(isTruthy), + studio: result.studios?.map(x => x.name).filter(isTruthy), + duration: result.duration, + onlineRating: result.score, + image: result.images?.jpg?.image_url, released: true, - premiere: this.plugin.dateFormatter.format(result.aired?.from, this.apiDateFormat) ?? 'unknown', - streamingServices: result.streaming?.map((x: any) => x.name) ?? [], + ageRating: result.rating, + premiere: this.plugin.dateFormatter.format(result.aired?.from, this.apiDateFormat), + streamingServices: result.streaming?.map(x => x.name).filter(isTruthy), userData: { watched: false, @@ -165,24 +190,24 @@ export class MALAPI extends APIModel { subType: type, title: result.title, englishTitle: result.title_english ?? result.title, - year: result.year ?? result.aired?.prop?.from?.year ?? '', + year: year, dataSource: this.apiName, url: result.url, - id: result.mal_id, + id: new_id, plot: result.synopsis, - genres: result.genres?.map((x: any) => x.name) ?? [], - writer: [], - studio: result.studios?.map((x: any) => x.name) ?? [], + genres: result.genres?.map(x => x.name).filter(isTruthy), + studio: result.studios?.map(x => x.name).filter(isTruthy), episodes: result.episodes, - duration: result.duration ?? 'unknown', - onlineRating: result.score ?? 0, - streamingServices: result.streaming?.map((x: any) => x.name) ?? [], - image: result.images?.jpg?.image_url ?? '', + duration: result.duration, + onlineRating: result.score, + streamingServices: result.streaming?.map(x => x.name).filter(isTruthy), + image: result.images?.jpg?.image_url, released: true, - airedFrom: this.plugin.dateFormatter.format(result.aired?.from, this.apiDateFormat) ?? 'unknown', - airedTo: this.plugin.dateFormatter.format(result.aired?.to, this.apiDateFormat) ?? 'unknown', + ageRating: result.rating, + airedFrom: this.plugin.dateFormatter.format(result.aired?.from, this.apiDateFormat), + airedTo: this.plugin.dateFormatter.format(result.aired?.to, this.apiDateFormat), airing: result.airing, userData: { @@ -195,4 +220,7 @@ export class MALAPI extends APIModel { throw new Error(`MDB | Unknown media type for id ${id}`); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.MALAPI_disabledMediaTypes; + } } diff --git a/src/api/apis/MALAPIManga.ts b/src/api/apis/MALAPIManga.ts index bd99476..83d4732 100644 --- a/src/api/apis/MALAPIManga.ts +++ b/src/api/apis/MALAPIManga.ts @@ -1,12 +1,16 @@ +import createClient from 'openapi-fetch'; +import { isTruthy, obsidianFetch } from 'src/utils/Utils'; import type MediaDbPlugin from '../../main'; import { ComicMangaModel } from '../../models/ComicMangaModel'; import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +import type { paths } from '../schemas/MALAPI'; export class MALAPIManga extends APIModel { plugin: MediaDbPlugin; typeMappings: Map; + apiDateFormat: string = 'YYYY-MM-DDTHH:mm:ssZ'; // ISO constructor(plugin: MediaDbPlugin) { super(); @@ -29,43 +33,55 @@ export class MALAPIManga extends APIModel { async searchByTitle(title: string): Promise { console.log(`MDB | api "${this.apiName}" queried by Title`); - const searchUrl = `https://api.jikan.moe/v4/manga?q=${encodeURIComponent(title)}&limit=20${this.plugin.settings.sfwFilter ? '&sfw' : ''}`; + const client = createClient({ baseUrl: 'https://api.jikan.moe/v4/' }); - const fetchData = await fetch(searchUrl); - // console.debug(fetchData); - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + const response = await client.GET('/manga', { + params: { + query: { + q: title, + limit: 20, + sfw: this.plugin.settings.sfwFilter ? true : false, + }, + }, + fetch: obsidianFetch, + }); + + if (response.error !== undefined) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); } - const data = await fetchData.json(); - // console.debug(data); + const data = response.data?.data; const ret: MediaTypeModel[] = []; - for (const result of data.data) { - const type = this.typeMappings.get(result.type?.toLowerCase()); + for (const result of data ?? []) { + const resType = result.type?.toLowerCase(); + const type = resType ? this.typeMappings.get(resType) : undefined; + const year = result.published?.prop?.from?.year?.toString() ?? ''; + const id = result.mal_id?.toString(); + ret.push( new ComicMangaModel({ subType: type, title: result.title, - plot: result.synopsis, + plot: result.synopsis ?? undefined, englishTitle: result.title_english ?? result.title, - alternateTitles: result.titles?.map((x: any) => x.title) ?? [], - year: result.year ?? result.published?.prop?.from?.year ?? '', + alternateTitles: result.titles?.map(x => x.title).filter(isTruthy), + year: year, dataSource: this.apiName, url: result.url, - id: result.mal_id, + id: id, - genres: result.genres?.map((x: any) => x.name) ?? [], - authors: result.authors?.map((x: any) => x.name) ?? [], + genres: result.genres?.map(x => x.name).filter(isTruthy), + authors: result.authors?.map(x => x.name).filter(isTruthy), chapters: result.chapters, volumes: result.volumes, - onlineRating: result.score ?? 0, - image: result.images?.jpg?.image_url ?? '', + onlineRating: result.score, + image: result.images?.jpg?.image_url, released: true, - publishedFrom: new Date(result.published?.from).toLocaleDateString() ?? 'unknown', - publishedTo: new Date(result.published?.to).toLocaleDateString() ?? 'unknown', + publishedFrom: this.plugin.dateFormatter.format(result.published?.from, this.apiDateFormat), + publishedTo: this.plugin.dateFormatter.format(result.published?.to, this.apiDateFormat), status: result.status, userData: { @@ -83,40 +99,53 @@ export class MALAPIManga extends APIModel { async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `https://api.jikan.moe/v4/manga/${encodeURIComponent(id)}/full`; - const fetchData = await fetch(searchUrl); + const client = createClient({ baseUrl: 'https://api.jikan.moe/v4/' }); - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + const response = await client.GET('/manga/{id}/full', { + params: { + path: { + id: id as unknown as number, // This is fine + }, + }, + fetch: obsidianFetch, + }); + + if (response.error !== undefined) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); } - const data = await fetchData.json(); - // console.debug(data); - const result = data.data; + const result = response.data?.data; + + if (!result) { + throw Error(`MDB | No data found for ID ${id} in ${this.apiName}.`); + } + + const resType = result.type?.toLowerCase(); + const type = resType ? this.typeMappings.get(resType) : undefined; + const year = result.published?.prop?.from?.year?.toString() ?? ''; + const new_id = result.mal_id?.toString(); - const type = this.typeMappings.get(result.type?.toLowerCase()); return new ComicMangaModel({ subType: type, title: result.title, + plot: result.synopsis ?? undefined, englishTitle: result.title_english ?? result.title, - alternateTitles: result.titles?.map((x: any) => x.title) ?? [], - year: result.year ?? result.published?.prop?.from?.year ?? '', + alternateTitles: result.titles?.map(x => x.title).filter(isTruthy), + year: year, dataSource: this.apiName, url: result.url, - id: result.mal_id, + id: new_id, - plot: (result.synopsis ?? 'unknown').replace(/"/g, "'") ?? 'unknown', - genres: result.genres?.map((x: any) => x.name) ?? [], - authors: result.authors?.map((x: any) => x.name) ?? [], + genres: result.genres?.map(x => x.name).filter(isTruthy), + authors: result.authors?.map(x => x.name).filter(isTruthy), chapters: result.chapters, volumes: result.volumes, - onlineRating: result.score ?? 0, - image: result.images?.jpg?.image_url ?? '', + onlineRating: result.score, + image: result.images?.jpg?.image_url, released: true, - publishers: result.serializations?.map((x: any) => x.name) ?? [], - publishedFrom: new Date(result.published?.from).toLocaleDateString() ?? 'unknown', - publishedTo: new Date(result.published?.to).toLocaleDateString() ?? 'unknown', + publishedFrom: this.plugin.dateFormatter.format(result.published?.from, this.apiDateFormat), + publishedTo: this.plugin.dateFormatter.format(result.published?.to, this.apiDateFormat), status: result.status, userData: { @@ -126,4 +155,7 @@ export class MALAPIManga extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.MALAPIManga_disabledMediaTypes; + } } diff --git a/src/api/apis/MobyGamesAPI.ts b/src/api/apis/MobyGamesAPI.ts index 4c2922b..a88eec9 100644 --- a/src/api/apis/MobyGamesAPI.ts +++ b/src/api/apis/MobyGamesAPI.ts @@ -1,4 +1,5 @@ -import { Notice } from 'obsidian'; +/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument */ + import { requestUrl } from 'obsidian'; import type MediaDbPlugin from '../../main'; import { GameModel } from '../../models/GameModel'; @@ -6,6 +7,10 @@ import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +// sadly no open api schema available + +// TODO: maybe we should remove this API, as it can no longer be tested without paying for an API key + export class MobyGamesAPI extends APIModel { plugin: MediaDbPlugin; apiDateFormat: string = 'YYYY-DD-MM'; @@ -19,6 +24,7 @@ export class MobyGamesAPI extends APIModel { this.apiUrl = 'https://api.mobygames.com/v1'; this.types = [MediaType.Game]; } + async searchByTitle(title: string): Promise { console.log(`MDB | api "${this.apiName}" queried by Title`); @@ -55,7 +61,7 @@ export class MobyGamesAPI extends APIModel { year: new Date(result.platforms[0].first_release_date).getFullYear().toString(), dataSource: this.apiName, id: result.game_id, - } as GameModel), + }), ); } @@ -107,4 +113,7 @@ export class MobyGamesAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.MobyGamesAPI_disabledMediaTypes; + } } diff --git a/src/api/apis/MusicBrainzAPI.ts b/src/api/apis/MusicBrainzAPI.ts index 87349a1..e1d0d7a 100644 --- a/src/api/apis/MusicBrainzAPI.ts +++ b/src/api/apis/MusicBrainzAPI.ts @@ -3,11 +3,95 @@ import type MediaDbPlugin from '../../main'; import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MusicReleaseModel } from '../../models/MusicReleaseModel'; import { MediaType } from '../../utils/MediaType'; -import { contactEmail, mediaDbVersion, pluginName } from '../../utils/Utils'; +import { contactEmail, getLanguageName, mediaDbVersion, pluginName } from '../../utils/Utils'; import { APIModel } from '../APIModel'; +// sadly no open api schema available + +interface Tag { + name: string; + count: number; +} +interface Genre { + name: string; + count: number; + id: string; + disambiguation: string; +} +interface Release { + id: string; + 'status-id': string; + title: string; + status: string; +} + +interface ArtistCredit { + name: string; + artist: { + tags: Tag[]; + type: string; + id: string; + name: string; + 'short-name': string; + country: string; + }; +} + +interface SearchResponse { + id: string; + 'type-id': string; + score: number; + 'primary-type-id': string; + 'artists-credit-id': string; + count: number; + title: string; + 'first-release-date': string; + 'primary-type': string; + 'artist-credit': ArtistCredit[]; + releases: Release[]; + tags: Tag[]; +} + +interface IdResponse { + id: string; + tags: Tag[]; + 'primary-type-id': string; + 'artist-credit': ArtistCredit[]; + title: string; + genres: Genre[]; + 'first-release-date': string; + releases: Release[]; + 'primary-type': string; + rating: { + value: number; + 'votes-count': number; + }; +} + +interface MediaResponse { + media: { + 'track-count': number; + tracks: { + 'artist-credit': ArtistCredit[]; + length: number | null; + number: string; + position: number; + title: string; + recording: { + length: number; + title: string; + }; + }[]; + }[]; + 'text-representation': { + language: string; + script: string; + }; +} + export class MusicBrainzAPI extends APIModel { plugin: MediaDbPlugin; + apiDateFormat: string = 'YYYY-MM-DD'; constructor(plugin: MediaDbPlugin) { super(); @@ -37,7 +121,9 @@ export class MusicBrainzAPI extends APIModel { throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); } - const data = await fetchData.json; + const data = (await fetchData.json) as { + 'release-groups': SearchResponse[]; + }; // console.debug(data); const ret: MediaTypeModel[] = []; @@ -48,12 +134,13 @@ export class MusicBrainzAPI extends APIModel { title: result.title, englishTitle: result.title, year: new Date(result['first-release-date']).getFullYear().toString(), + releaseDate: this.plugin.dateFormatter.format(result['first-release-date'], this.apiDateFormat) ?? 'unknown', dataSource: this.apiName, url: 'https://musicbrainz.org/release-group/' + result.id, id: result.id, - image: 'https://coverartarchive.org/release-group/' + result.id + '/front', + image: 'https://coverartarchive.org/release-group/' + result.id + '/front-500.jpg', - artists: result['artist-credit'].map((a: any) => a.name), + artists: result['artist-credit'].map(a => a.name), subType: result['primary-type'], }), ); @@ -65,33 +152,73 @@ export class MusicBrainzAPI extends APIModel { async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `https://musicbrainz.org/ws/2/release-group/${encodeURIComponent(id)}?inc=releases+artists+tags+ratings+genres&fmt=json`; - const fetchData = await requestUrl({ - url: searchUrl, + // Fetch release group + const groupUrl = `https://musicbrainz.org/ws/2/release-group/${encodeURIComponent(id)}?inc=releases+artists+tags+ratings+genres&fmt=json`; + const groupResponse = await requestUrl({ + url: groupUrl, headers: { 'User-Agent': `${pluginName}/${mediaDbVersion} (${contactEmail})`, }, }); - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + if (groupResponse.status !== 200) { + throw Error(`MDB | Received status code ${groupResponse.status} from ${this.apiName}.`); } - const result = await fetchData.json; + const result = (await groupResponse.json) as IdResponse; + + // Get ID of the first release + const firstRelease = result.releases?.[0]; + if (!firstRelease) { + throw Error('MDB | No releases found in release group.'); + } + + // Fetch recordings for the first release + const releaseUrl = `https://musicbrainz.org/ws/2/release/${firstRelease.id}?inc=recordings+artists&fmt=json`; + console.log(`MDB | Fetching release recordings from: ${releaseUrl}`); + + const releaseResponse = await requestUrl({ + url: releaseUrl, + headers: { + 'User-Agent': `${pluginName}/${mediaDbVersion} (${contactEmail})`, + }, + }); + + if (releaseResponse.status !== 200) { + throw Error(`MDB | Received status code ${releaseResponse.status} from ${this.apiName}.`); + } + + const releaseData = (await releaseResponse.json) as MediaResponse; + const tracks = extractTracksFromMedia(releaseData.media); + + // Calculate total album length for the first release + const totalrawLength = + releaseData.media[0]?.tracks.reduce((sum, track) => { + const len = track.length ?? track.recording?.length; + return typeof len === 'number' && !isNaN(len) ? sum + len : sum; + }, 0) ?? 0; + const albumLengthCalc = millisecondsToMinutes(totalrawLength); + + console.log(releaseData); return new MusicReleaseModel({ type: 'musicRelease', title: result.title, englishTitle: result.title, year: new Date(result['first-release-date']).getFullYear().toString(), + releaseDate: this.plugin.dateFormatter.format(result['first-release-date'], this.apiDateFormat) ?? 'unknown', dataSource: this.apiName, url: 'https://musicbrainz.org/release-group/' + result.id, id: result.id, - image: 'https://coverartarchive.org/release-group/' + result.id + '/front', + image: 'https://coverartarchive.org/release-group/' + result.id + '/front-500.jpg', - artists: result['artist-credit'].map((a: any) => a.name), - genres: result.genres.map((g: any) => g.name), + artists: result['artist-credit'].map(a => a.name), + language: releaseData['text-representation'].language ? getLanguageName(releaseData['text-representation'].language) : 'Unknown', + genres: result.genres.map(g => g.name), subType: result['primary-type'], + albumDuration: albumLengthCalc, + trackCount: releaseData.media[0]?.['track-count'] ?? 0, + tracks: tracks, rating: result.rating.value * 2, userData: { @@ -99,4 +226,36 @@ export class MusicBrainzAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.MusicBrainzAPI_disabledMediaTypes; + } +} + +function extractTracksFromMedia(media: MediaResponse['media']): { + number: number; + title: string; + duration: string; + featuredArtists: string[]; +}[] { + if (!media || media.length === 0 || !media[0].tracks) return []; + + return media[0].tracks.map((track, index) => { + const title = track.title ?? track.recording?.title ?? 'Unknown Title'; + const rawLength = track.length ?? track.recording?.length; + const duration = rawLength ? millisecondsToMinutes(rawLength) : 'unknown'; + const featuredArtists = track['artist-credit']?.map(ac => ac.name) ?? []; + + return { + number: index + 1, + title, + duration, + featuredArtists, + }; + }); +} + +function millisecondsToMinutes(milliseconds: number): string { + const minutes = Math.floor(milliseconds / 60000); + const seconds = Math.floor((milliseconds % 60000) / 1000); + return `${minutes}:${seconds.toString().padStart(2, '0')}`; } diff --git a/src/api/apis/OMDbAPI.ts b/src/api/apis/OMDbAPI.ts index 0dd54cc..51b4f17 100644 --- a/src/api/apis/OMDbAPI.ts +++ b/src/api/apis/OMDbAPI.ts @@ -1,4 +1,4 @@ -import { Notice } from 'obsidian'; +import { requestUrl } from 'obsidian'; import type MediaDbPlugin from '../../main'; import { GameModel } from '../../models/GameModel'; import type { MediaTypeModel } from '../../models/MediaTypeModel'; @@ -7,6 +7,54 @@ import { SeriesModel } from '../../models/SeriesModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +interface ErrorResponse { + Response: 'False'; + Error: string; +} + +type SearchResponse = + | { + Response: 'True'; + totalResults: string; + Search: { + Title: string; + Year: string; + Poster: string; + imdbID: string; + Type: string; + }[]; + } + | ErrorResponse; + +type IdResponse = + | { + Response: 'True'; + Title: string; + Year: string; + Rated: string; + Released: string; + Runtime: string; + Genre: string; + Director: string; + Writer: string; + Actors: string; + Plot: string; + Language: string; + Country: string; + Awards: string; + Poster: string; + Metascore: string; + imdbRating: string; + imdbVotes: string; + imdbID: string; + Type: string; + DVD: string; + BoxOffice: string; + Production: string; + Website: string; + } + | ErrorResponse; + export class OMDbAPI extends APIModel { plugin: MediaDbPlugin; typeMappings: Map; @@ -33,24 +81,30 @@ export class OMDbAPI extends APIModel { throw new Error(`MDB | API key for ${this.apiName} missing.`); } - const searchUrl = `https://www.omdbapi.com/?s=${encodeURIComponent(title)}&apikey=${this.plugin.settings.OMDbKey}`; - const fetchData = await fetch(searchUrl); + const response = await requestUrl({ + url: `https://www.omdbapi.com/?s=${encodeURIComponent(title)}&apikey=${this.plugin.settings.OMDbKey}`, + method: 'GET', + }); - if (fetchData.status === 401) { + if (response.status === 401) { throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); } - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + if (response.status !== 200) { + throw Error(`MDB | Received status code ${response.status} from ${this.apiName}.`); } - const data = await fetchData.json(); + const data = response.json as SearchResponse | undefined; + + if (!data) { + throw Error(`MDB | No data received from ${this.apiName}.`); + } if (data.Response === 'False') { if (data.Error === 'Movie not found!') { return []; } - throw Error(`MDB | Received error from ${this.apiName}: \n${JSON.stringify(data, undefined, 4)}`); + throw Error(`MDB | Received error from ${this.apiName}: ${data.Error}`); } if (!data.Search) { return []; @@ -111,18 +165,23 @@ export class OMDbAPI extends APIModel { throw Error(`MDB | API key for ${this.apiName} missing.`); } - const searchUrl = `https://www.omdbapi.com/?i=${encodeURIComponent(id)}&apikey=${this.plugin.settings.OMDbKey}`; - const fetchData = await fetch(searchUrl); + const response = await requestUrl({ + url: `https://www.omdbapi.com/?i=${encodeURIComponent(id)}&apikey=${this.plugin.settings.OMDbKey}`, + method: 'GET', + }); - if (fetchData.status === 401) { + if (response.status === 401) { throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); } - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + if (response.status !== 200) { + throw Error(`MDB | Received status code ${response.status} from ${this.apiName}.`); } - const result = await fetchData.json(); - // console.debug(result); + const result = response.json as IdResponse | undefined; + + if (!result) { + throw Error(`MDB | No data received from ${this.apiName}.`); + } if (result.Response === 'False') { throw Error(`MDB | Received error from ${this.apiName}: ${result.Error}`); @@ -130,7 +189,7 @@ export class OMDbAPI extends APIModel { const type = this.typeMappings.get(result.Type.toLowerCase()); if (type === undefined) { - throw Error(`${result.type.toLowerCase()} is an unsupported type.`); + throw Error(`${result.Type.toLowerCase()} is an unsupported type.`); } if (type === 'movie') { @@ -143,19 +202,20 @@ export class OMDbAPI extends APIModel { url: `https://www.imdb.com/title/${result.imdbID}/`, id: result.imdbID, - plot: result.Plot ?? '', - genres: result.Genre?.split(', ') ?? [], - director: result.Director?.split(', ') ?? [], - writer: result.Writer?.split(', ') ?? [], - studio: ['N/A'], - duration: result.Runtime ?? 'unknown', + plot: result.Plot, + genres: result.Genre?.split(', '), + director: result.Director?.split(', '), + writer: result.Writer?.split(', '), + duration: result.Runtime, onlineRating: Number.parseFloat(result.imdbRating ?? 0), - actors: result.Actors?.split(', ') ?? [], - image: result.Poster ?? '', + actors: result.Actors?.split(', '), + image: result.Poster.replace('_SX300', '_SX600'), released: true, - streamingServices: [], - premiere: this.plugin.dateFormatter.format(result.Released, this.apiDateFormat) ?? 'unknown', + country: result.Country?.split(', '), + boxOffice: result.BoxOffice, + ageRating: result.Rated, + premiere: this.plugin.dateFormatter.format(result.Released, this.apiDateFormat), userData: { watched: false, @@ -173,21 +233,20 @@ export class OMDbAPI extends APIModel { url: `https://www.imdb.com/title/${result.imdbID}/`, id: result.imdbID, - plot: result.Plot ?? '', - genres: result.Genre?.split(', ') ?? [], - writer: result.Writer?.split(', ') ?? [], + plot: result.Plot, + genres: result.Genre?.split(', '), + writer: result.Writer?.split(', '), studio: [], episodes: 0, - duration: result.Runtime ?? 'unknown', + duration: result.Runtime, onlineRating: Number.parseFloat(result.imdbRating ?? 0), - actors: result.Actors?.split(', ') ?? [], - image: result.Poster ?? '', + actors: result.Actors?.split(', '), + image: result.Poster.replace('_SX300', '_SX600'), released: true, - streamingServices: [], - airing: false, - airedFrom: this.plugin.dateFormatter.format(result.Released, this.apiDateFormat) ?? 'unknown', - airedTo: 'unknown', + country: result.Country?.split(', '), + ageRating: result.Rated, + airedFrom: this.plugin.dateFormatter.format(result.Released, this.apiDateFormat), userData: { watched: false, @@ -205,14 +264,12 @@ export class OMDbAPI extends APIModel { url: `https://www.imdb.com/title/${result.imdbID}/`, id: result.imdbID, - developers: [], - publishers: [], - genres: result.Genre?.split(', ') ?? [], + genres: result.Genre?.split(', '), onlineRating: Number.parseFloat(result.imdbRating ?? 0), - image: result.Poster ?? '', + image: result.Poster.replace('_SX300', '_SX600'), released: true, - releaseDate: this.plugin.dateFormatter.format(result.Released, this.apiDateFormat) ?? 'unknown', + releaseDate: this.plugin.dateFormatter.format(result.Released, this.apiDateFormat), userData: { played: false, @@ -223,4 +280,8 @@ export class OMDbAPI extends APIModel { throw new Error(`MDB | Unknown media type for id ${id}`); } + + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.OMDbAPI_disabledMediaTypes; + } } diff --git a/src/api/apis/OpenLibraryAPI.ts b/src/api/apis/OpenLibraryAPI.ts index 4835afe..645d15b 100644 --- a/src/api/apis/OpenLibraryAPI.ts +++ b/src/api/apis/OpenLibraryAPI.ts @@ -1,8 +1,34 @@ +import createClient from 'openapi-fetch'; import { BookModel } from 'src/models/BookModel'; +import { obsidianFetch } from 'src/utils/Utils'; import type MediaDbPlugin from '../../main'; import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +import type { paths } from '../schemas/OpenLibrary'; + +interface SearchResponse { + editions: { + docs: { + key?: string; + title?: string; + cover_i?: number; + isbn?: string[]; + }[]; + }; + cover_i?: number; + has_fulltext?: boolean; + edition_count?: number; + title?: string; + author_name?: string[]; + first_publish_year?: number; + key: string; + description?: string; + + number_of_pages_median?: number; + isbn?: string[]; + ratings_average?: number; +} export class OpenLibraryAPI extends APIModel { plugin: MediaDbPlugin; @@ -20,14 +46,24 @@ export class OpenLibraryAPI extends APIModel { async searchByTitle(title: string): Promise { console.log(`MDB | api "${this.apiName}" queried by Title`); - const searchUrl = `https://openlibrary.org/search.json?title=${encodeURIComponent(title)}`; + const client = createClient({ baseUrl: 'https://openlibrary.org/' }); - const fetchData = await fetch(searchUrl); - // console.debug(fetchData); - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + const response = await client.GET('/search.json', { + params: { + query: { + q: title, + }, + }, + fetch: obsidianFetch, + }); + + if (response.error !== undefined) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); } - const data = await fetchData.json(); + + const data = response.data as { + docs: SearchResponse[]; + }; // console.debug(data); @@ -37,11 +73,11 @@ export class OpenLibraryAPI extends APIModel { ret.push( new BookModel({ title: result.title, - englishTitle: result.title_english ?? result.title, - year: result.first_publish_year, + englishTitle: result.title, + year: result.first_publish_year?.toString() ?? 'unknown', dataSource: this.apiName, id: result.key, - author: result.author_name ?? 'unknown', + author: result.author_name?.join(', '), }), ); } @@ -52,33 +88,63 @@ export class OpenLibraryAPI extends APIModel { async getById(id: string): Promise { console.log(`MDB | api "${this.apiName}" queried by ID`); - const searchUrl = `https://openlibrary.org/search.json?q=key:${encodeURIComponent(id)}`; - const fetchData = await fetch(searchUrl); - // console.debug(fetchData); + const client = createClient({ baseUrl: 'https://openlibrary.org/' }); - if (fetchData.status !== 200) { - throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); + const response = await client.GET('/search.json', { + params: { + query: { + q: `${id}`, + fields: 'key,title,author_name,number_of_pages_median,first_publish_year,isbn,ratings_score,first_sentence,title_suggest,rating*,cover*,editions,description', + }, + }, + fetch: obsidianFetch, + }); + + if (response.error !== undefined) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); } - const data = await fetchData.json(); - // console.debug(data); + const data = response.data as { + docs: SearchResponse[]; + q?: string; + }; + const result = data.docs[0]; - return new BookModel({ - title: result.title, - year: result.first_publish_year, - dataSource: this.apiName, - url: `https://openlibrary.org` + result.key, - id: result.key, - isbn: (result.isbn ?? []).find((el: string | any[]) => el.length <= 10) ?? 'unknown', - isbn13: (result.isbn ?? []).find((el: string | any[]) => el.length == 13) ?? 'unknown', - englishTitle: result.title_english ?? result.title, + let key = result.key; + let title = result.title; + let cover_i = result.cover_i; + let isbnArr = result.isbn; - author: result.author_name ?? 'unknown', - plot: result.description ?? 'unknown', - pages: result.number_of_pages_median ?? 'unknown', - onlineRating: Number.parseFloat(Number(result.ratings_average ?? 0).toFixed(2)), - image: `https://covers.openlibrary.org/b/OLID/` + result.cover_edition_key + `-L.jpg`, + // Check if the query is for /isbn/ or /books/ and extract from editions.docs if present + const q = data.q ?? ''; + if ((q.includes('/isbn/') || q.includes('/books/')) && result.editions && Array.isArray(result.editions.docs) && result.editions.docs.length > 0) { + const edition = result.editions.docs[0]; + key = edition.key ?? key; + title = edition.title ?? title; + cover_i = edition.cover_i ?? cover_i; + isbnArr = edition.isbn ?? isbnArr; + } + + const pages = Number(result.number_of_pages_median); + const isbn = Number((isbnArr ?? []).find((el: string) => el.length <= 10)); + const isbn13 = Number((isbnArr ?? []).find((el: string) => el.length == 13)); + + return new BookModel({ + title: title, + year: result.first_publish_year?.toString() ?? 'unknown', + dataSource: this.apiName, + url: `https://openlibrary.org` + key, + id: key, + isbn: Number.isNaN(isbn) ? undefined : isbn, + isbn13: Number.isNaN(isbn13) ? undefined : isbn13, + englishTitle: title, + + author: result.author_name?.join(', '), + plot: result.description ?? undefined, + pages: Number.isNaN(pages) ? undefined : pages, + onlineRating: result.ratings_average, + image: cover_i ? `https://covers.openlibrary.org/b/id/` + cover_i + `-L.jpg` : undefined, released: true, @@ -89,4 +155,7 @@ export class OpenLibraryAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.OpenLibraryAPI_disabledMediaTypes; + } } diff --git a/src/api/apis/SteamAPI.ts b/src/api/apis/SteamAPI.ts index 1e52979..b8e72b2 100644 --- a/src/api/apis/SteamAPI.ts +++ b/src/api/apis/SteamAPI.ts @@ -3,8 +3,129 @@ import type MediaDbPlugin from '../../main'; import { GameModel } from '../../models/GameModel'; import type { MediaTypeModel } from '../../models/MediaTypeModel'; import { MediaType } from '../../utils/MediaType'; +import { imageUrlExists } from '../../utils/Utils'; import { APIModel } from '../APIModel'; +interface SearchResponse { + appid: string; + name: string; + icon: string; + logo: string; +} + +type IdResponse = Record< + string, + { + success: boolean; + data: GameDetails; + } +>; + +interface GameDetails { + type: string; + name: string; + steam_appid: number; + required_age: string; + is_free: boolean; + controller_support: string; + dlc: number[]; + detailed_description: string; + about_the_game: string; + short_description: string; + supported_languages: string; + reviews: string; + header_image: string; + capsule_image: string; + capsule_imagev5: string; + website: string; + pc_requirements: Requirements; + mac_requirements: Requirements; + linux_requirements: Requirements; + legal_notice: string; + drm_notice: string; + developers: string[]; + publishers: string[]; + price_overview: PriceOverview; + packages: number[]; + platforms: Platforms; + metacritic?: { + score: number; + url: string; + }; + categories: Category[]; + genres: Genre[]; + recommendations: { + total: number; + }; + achievements: { + total: number; + highlighted: Achievement[]; + }; + release_date: { + coming_soon: boolean; + date: string; + }; + support_info: { + url: string; + email: string; + }; + background: string; + background_raw: string; + content_descriptors: { + ids: number[]; + notes: string; + }; + ratings: Ratings; +} + +interface Requirements { + minimum: string; + recommended: string; +} + +interface PriceOverview { + currency: string; + initial: number; + final: number; + discount_percent: number; + initial_formatted: string; + final_formatted: string; +} + +interface Platforms { + windows: boolean; + mac: boolean; + linux: boolean; +} + +interface Category { + id: number; + description: string; +} + +interface Genre { + id: string; + description: string; +} + +interface Achievement { + name: string; + path: string; +} + +type Ratings = Record< + string, + { + rating: string; + descriptors: string; + use_age_gate: string; + required_age: string; + rating_id?: string; + banned?: string; + rating_generated?: string; + } +>; + export class SteamAPI extends APIModel { plugin: MediaDbPlugin; typeMappings: Map; @@ -34,7 +155,7 @@ export class SteamAPI extends APIModel { throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); } - const data = await fetchData.json; + const data = (await fetchData.json) as SearchResponse[]; // console.debug(data); @@ -69,14 +190,13 @@ export class SteamAPI extends APIModel { } // console.debug(await fetchData.json); + const data = (await fetchData.json) as IdResponse; - let result: any; - for (const [key, value] of Object.entries(await fetchData.json)) { - // console.log(typeof key, key) - // console.log(typeof id, id) + let result: GameDetails | undefined = undefined; + for (const [key, value] of Object.entries(data)) { // after some testing I found out that id is somehow a number despite that it's defined as string... if (key === String(id)) { - result = (value as any).data; + result = value.data; } } if (!result) { @@ -85,6 +205,16 @@ export class SteamAPI extends APIModel { // console.debug(result); + // Check if a poster version of the image exists, else use the header image + const imageUrl = `https://steamcdn-a.akamaihd.net/steam/apps/${result.steam_appid}/library_600x900_2x.jpg`; + const exists = await imageUrlExists(imageUrl); + let finalimageurl; + if (exists) { + finalimageurl = imageUrl; + } else { + finalimageurl = result.header_image ?? ''; + } + return new GameModel({ type: MediaType.Game, title: result.name, @@ -92,16 +222,16 @@ export class SteamAPI extends APIModel { year: new Date(result.release_date.date).getFullYear().toString(), dataSource: this.apiName, url: `https://store.steampowered.com/app/${result.steam_appid}`, - id: result.steam_appid, + id: result.steam_appid.toString(), developers: result.developers, publishers: result.publishers, - genres: result.genres?.map((x: any) => x.description) ?? [], - onlineRating: Number.parseFloat(result.metacritic?.score ?? 0), - image: result.header_image ?? '', + genres: result.genres?.map(x => x.description), + onlineRating: result.metacritic?.score, + image: finalimageurl, released: !result.release_date?.coming_soon, - releaseDate: this.plugin.dateFormatter.format(result.release_date?.date, this.apiDateFormat) ?? 'unknown', + releaseDate: this.plugin.dateFormatter.format(result.release_date?.date, this.apiDateFormat), userData: { played: false, @@ -109,4 +239,7 @@ export class SteamAPI extends APIModel { }, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.SteamAPI_disabledMediaTypes; + } } diff --git a/src/api/apis/TMDBMovieAPI.ts b/src/api/apis/TMDBMovieAPI.ts new file mode 100644 index 0000000..32e90da --- /dev/null +++ b/src/api/apis/TMDBMovieAPI.ts @@ -0,0 +1,158 @@ +import createClient from 'openapi-fetch'; +import type MediaDbPlugin from '../../main'; +import type { MediaTypeModel } from '../../models/MediaTypeModel'; +import { MovieModel } from '../../models/MovieModel'; +import { MediaType } from '../../utils/MediaType'; +import { APIModel } from '../APIModel'; +import type { paths } from '../schemas/TMDB'; + +export class TMDBMovieAPI extends APIModel { + plugin: MediaDbPlugin; + typeMappings: Map; + apiDateFormat: string = 'YYYY-MM-DD'; + + constructor(plugin: MediaDbPlugin) { + super(); + + this.plugin = plugin; + this.apiName = 'TMDBMovieAPI'; + this.apiDescription = 'A community built Movie DB.'; + this.apiUrl = 'https://www.themoviedb.org/'; + this.types = [MediaType.Movie]; + this.typeMappings = new Map(); + this.typeMappings.set('movie', 'movie'); + } + + async searchByTitle(title: string): Promise { + console.log(`MDB | api "${this.apiName}" queried by Title`); + + if (!this.plugin.settings.TMDBKey) { + throw new Error(`MDB | API key for ${this.apiName} missing.`); + } + + const client = createClient({ baseUrl: 'https://api.themoviedb.org' }); + const response = await client.GET('/3/search/movie', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + query: { + query: encodeURIComponent(title), + include_adult: this.plugin.settings.sfwFilter ? false : true, + }, + }, + fetch: fetch, + }); + + if (response.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + if (response.response.status !== 200) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); + } + + const data = response.data; + + if (!data) { + throw Error(`MDB | No data received from ${this.apiName}.`); + } + + if (data.total_results === 0 || !data.results) { + return []; + } + + // console.debug(data.results); + + const ret: MediaTypeModel[] = []; + + for (const result of data.results) { + ret.push( + new MovieModel({ + type: 'movie', + title: result.original_title, + englishTitle: result.title, + year: result.release_date ? new Date(result.release_date).getFullYear().toString() : 'unknown', + dataSource: this.apiName, + id: result.id.toString(), + }), + ); + } + + return ret; + } + + async getById(id: string): Promise { + console.log(`MDB | api "${this.apiName}" queried by ID`); + + if (!this.plugin.settings.TMDBKey) { + throw Error(`MDB | API key for ${this.apiName} missing.`); + } + + const client = createClient({ baseUrl: 'https://api.themoviedb.org' }); + const response = await client.GET('/3/movie/{movie_id}', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + path: { movie_id: parseInt(id) }, + query: { + append_to_response: 'credits', + }, + }, + fetch: fetch, + }); + + if (response.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + if (response.response.status !== 200) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); + } + + const result = response.data; + + if (!result) { + throw Error(`MDB | No data received from ${this.apiName}.`); + } + // console.debug(result); + + return new MovieModel({ + type: 'movie', + title: result.title, + englishTitle: result.title, + year: result.release_date ? new Date(result.release_date).getFullYear().toString() : 'unknown', + premiere: this.plugin.dateFormatter.format(result.release_date, this.apiDateFormat) ?? 'unknown', + dataSource: this.apiName, + url: `https://www.themoviedb.org/movie/${result.id}`, + id: result.id.toString(), + + plot: result.overview ?? '', + genres: result.genres?.map((g: any) => g.name) ?? [], + // TMDB's spec allows for 'append_to_response' but doesn't seem to account for it in the type + // @ts-ignore + writer: result.credits.crew?.filter((c: any) => c.job === 'Screenplay').map((c: any) => c.name) ?? [], + // @ts-ignore + director: result.credits.crew?.filter((c: any) => c.job === 'Director').map((c: any) => c.name) ?? [], + studio: result.production_companies?.map((s: any) => s.name) ?? [], + + duration: result.runtime?.toString() ?? 'unknown', + onlineRating: result.vote_average, + // @ts-ignore + actors: result.credits.cast.map((c: any) => c.name).slice(0, 5) ?? [], + image: `https://image.tmdb.org/t/p/w780${result.poster_path}`, + + released: ['Released'].includes(result.status!), + streamingServices: [], + + userData: { + watched: false, + lastWatched: '', + personalRating: 0, + }, + }); + } + + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.TMDBMovieAPI_disabledMediaTypes; + } +} diff --git a/src/api/apis/TMDBSeasonAPI.ts b/src/api/apis/TMDBSeasonAPI.ts new file mode 100644 index 0000000..bdeffd8 --- /dev/null +++ b/src/api/apis/TMDBSeasonAPI.ts @@ -0,0 +1,269 @@ +import createClient from 'openapi-fetch'; +import type MediaDbPlugin from '../../main'; +import type { MediaTypeModel } from '../../models/MediaTypeModel'; +import { MediaType } from '../../utils/MediaType'; +import { APIModel } from '../APIModel'; +import { SeasonModel } from '../../models/SeasonModel'; +import type { paths } from '../schemas/TMDB'; + +export class TMDBSeasonAPI extends APIModel { + plugin: MediaDbPlugin; + typeMappings: Map; + apiDateFormat: string = 'YYYY-MM-DD'; + + constructor(plugin: MediaDbPlugin) { + super(); + + this.plugin = plugin; + this.apiName = 'TMDBSeasonAPI'; + this.apiDescription = 'A community built Series DB (seasons).'; + this.apiUrl = 'https://www.themoviedb.org/'; + this.types = [MediaType.Season]; + this.typeMappings = new Map(); + this.typeMappings.set('tv', 'season'); + } + + async searchByTitle(title: string): Promise { + console.log(`MDB | api "${this.apiName}" queried by Title`); + + if (!this.plugin.settings.TMDBKey) { + throw new Error(`MDB | API key for ${this.apiName} missing.`); + } + + const client = createClient({ baseUrl: 'https://api.themoviedb.org' }); + const searchResponse = await client.GET('/3/search/tv', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + query: { + query: encodeURIComponent(title), + include_adult: this.plugin.settings.sfwFilter ? false : true, + }, + }, + fetch: fetch, + }); + + if (searchResponse.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + + if (searchResponse.response.status !== 200) { + throw Error(`MDB | Received status code ${searchResponse.response.status} from ${this.apiName}.`); + } + + const searchData = searchResponse.data; + + if (!searchData?.results || searchData.total_results === 0) { + return []; + } + + const ret: MediaTypeModel[] = []; + + for (const result of searchData.results) { + if (ret.length >= 20) break; + + // Fetch series details to get the total number of seasons + let totalSeasons = 0; + try { + const detailsResponse = await client.GET('/3/tv/{series_id}', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + path: { series_id: result.id ?? 0 }, + }, + fetch: fetch, + }); + + if (detailsResponse.response.status === 200 && detailsResponse.data) { + const detailsData = detailsResponse.data; + if (Array.isArray(detailsData.seasons)) { + totalSeasons = detailsData.seasons.length; + } + } + } catch {} + + ret.push( + new SeasonModel({ + title: `${result.name ?? result.original_name ?? ''}`, + englishTitle: result.name ?? result.original_name ?? '', + year: result.first_air_date ? new Date(result.first_air_date).getFullYear().toString() : 'unknown', + dataSource: this.apiName, + id: result.id?.toString() ?? '', + seasonTitle: result.name ?? result.original_name ?? '', + seasonNumber: totalSeasons, + }), + ); + } + + return ret; + } + + // Fetch all seasons for a given series + async getSeasonsForSeries(tvId: string): Promise { + if (!this.plugin.settings.TMDBKey) { + throw new Error(`MDB | API key for ${this.apiName} missing.`); + } + + const client = createClient({ baseUrl: 'https://api.themoviedb.org' }); + const seriesResponse = await client.GET('/3/tv/{series_id}', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + path: { series_id: parseInt(tvId) }, + }, + fetch: fetch, + }); + + if (seriesResponse.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + + if (seriesResponse.response.status !== 200) { + throw Error(`MDB | Received status code ${seriesResponse.response.status} from ${this.apiName}.`); + } + + const seriesData = seriesResponse.data; + const seriesName = seriesData?.name ?? ''; + + const ret: SeasonModel[] = []; + + if (Array.isArray(seriesData?.seasons)) { + for (const season of seriesData.seasons) { + const seasonNumber = season.season_number ?? 0; + const titleText = `${seriesName} - Season ${seasonNumber}`; + + ret.push( + new SeasonModel({ + title: titleText, + englishTitle: titleText, + year: season.air_date ? new Date(season.air_date).getFullYear().toString() : 'unknown', + dataSource: this.apiName, + id: `${tvId}/season/${seasonNumber}`, + seasonTitle: season.name ?? titleText, + seasonNumber: seasonNumber, + }), + ); + } + } + + return ret; + } + + async getById(id: string): Promise { + console.log(`MDB | api "${this.apiName}" queried by ID`); + + if (!this.plugin.settings.TMDBKey) { + throw Error(`MDB | API key for ${this.apiName} missing.`); + } + + // Expect season ids like "12345/season/2" + const m = /^(\d+)\/season\/(\d+)$/.exec(id); + if (!m) { + throw Error(`MDB | Invalid season id "${id}". Expected format "/season/".`); + } + + const tvId = m[1]; + const seasonNumber = m[2]; + + const client = createClient({ baseUrl: 'https://api.themoviedb.org' }); + + // Fetch season details + const seasonResponse = await client.GET('/3/tv/{series_id}/season/{season_number}', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + path: { + series_id: parseInt(tvId), + season_number: parseInt(seasonNumber), + }, + }, + fetch: fetch, + }); + + if (seasonResponse.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + + if (seasonResponse.response.status !== 200) { + throw Error(`MDB | Received status code ${seasonResponse.response.status} from ${this.apiName}.`); + } + + const seasonData = seasonResponse.data; + if (!seasonData) { + throw Error(`MDB | No data received from ${this.apiName}.`); + } + // Fetch parent series to build consistent titles and inherit fields + const seriesResponse = await client.GET('/3/tv/{series_id}', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + path: { series_id: parseInt(tvId) }, + query: { + append_to_response: 'credits', + }, + }, + fetch: fetch, + }); + + if (seriesResponse.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + + if (seriesResponse.response.status !== 200) { + throw Error(`MDB | Received status code ${seriesResponse.response.status} from ${this.apiName}.`); + } + + const seriesData = seriesResponse.data; + + if (!seriesData) { + throw Error(`MDB | No data received from ${this.apiName}.`); + } + + const seriesName = seriesData?.name ?? ''; + const airDate = seasonData.air_date ?? ''; + const titleText = `${seriesName} - Season ${seasonData.season_number}`; + + // Get airedTo as the air_date of the last episode, if available + let airedTo = 'unknown'; + if (Array.isArray(seasonData.episodes) && seasonData.episodes.length > 0) { + const lastEp = seasonData.episodes[seasonData.episodes.length - 1]; + if (lastEp?.air_date) airedTo = lastEp.air_date; + } + + return new SeasonModel({ + title: titleText, + englishTitle: titleText, + year: airDate ? new Date(airDate).getFullYear().toString() : 'unknown', + dataSource: this.apiName, + url: `https://www.themoviedb.org/tv/${tvId}/season/${seasonData.season_number}`, + id: `${tvId}/season/${seasonData.season_number}`, + seasonTitle: seasonData.name ?? titleText, + seasonNumber: seasonData.season_number ?? Number(seasonNumber), + episodes: Array.isArray(seasonData.episodes) ? seasonData.episodes.length : 0, + airedFrom: this.plugin.dateFormatter.format(airDate, this.apiDateFormat) ?? 'unknown', + airedTo: airedTo, + plot: seasonData.overview ?? '', + image: seasonData.poster_path ? `https://image.tmdb.org/t/p/w780${seasonData.poster_path}` : '', + genres: seriesData.genres?.map(g => g.name ?? '').filter(name => name !== '') ?? [], + writer: seriesData.created_by?.map(c => c.name ?? '').filter(name => name !== '') ?? [], + studio: seriesData.production_companies?.map(s => s.name ?? '').filter(name => name !== '') ?? [], + duration: seriesData.episode_run_time?.[0]?.toString() ?? '', + onlineRating: seasonData.vote_average ?? 0, + // @ts-ignore - append_to_response credits not reflected in base schema + actors: seriesData.credits?.cast?.map((c: any) => c.name).slice(0, 5) ?? [], + released: ['Returning Series', 'Cancelled', 'Ended'].includes(seriesData.status ?? ''), + streamingServices: [], + airing: ['Returning Series'].includes(seriesData.status ?? ''), + userData: { watched: false, lastWatched: '', personalRating: 0 }, + }); + } + + getDisabledMediaTypes(): MediaType[] { + return []; + } +} diff --git a/src/api/apis/TMDBSeriesAPI.ts b/src/api/apis/TMDBSeriesAPI.ts new file mode 100644 index 0000000..299663f --- /dev/null +++ b/src/api/apis/TMDBSeriesAPI.ts @@ -0,0 +1,157 @@ +import createClient from 'openapi-fetch'; +import type MediaDbPlugin from '../../main'; +import type { MediaTypeModel } from '../../models/MediaTypeModel'; +import { SeriesModel } from '../../models/SeriesModel'; +import { MediaType } from '../../utils/MediaType'; +import { APIModel } from '../APIModel'; +import type { paths } from '../schemas/TMDB'; + +export class TMDBSeriesAPI extends APIModel { + plugin: MediaDbPlugin; + typeMappings: Map; + apiDateFormat: string = 'YYYY-MM-DD'; + + constructor(plugin: MediaDbPlugin) { + super(); + + this.plugin = plugin; + this.apiName = 'TMDBSeriesAPI'; + this.apiDescription = 'A community built Series DB.'; + this.apiUrl = 'https://www.themoviedb.org/'; + this.types = [MediaType.Series]; + this.typeMappings = new Map(); + this.typeMappings.set('tv', 'series'); + } + + async searchByTitle(title: string): Promise { + console.log(`MDB | api "${this.apiName}" queried by Title`); + + if (!this.plugin.settings.TMDBKey) { + throw new Error(`MDB | API key for ${this.apiName} missing.`); + } + + const client = createClient({ baseUrl: 'https://api.themoviedb.org' }); + const response = await client.GET('/3/search/tv', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + query: { + query: encodeURIComponent(title), + include_adult: this.plugin.settings.sfwFilter ? false : true, + }, + }, + fetch: fetch, + }); + + if (response.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + if (response.response.status !== 200) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); + } + + const data = response.data; + + if (!data) { + throw Error(`MDB | No data received from ${this.apiName}.`); + } + + if (data.total_results === 0 || !data.results) { + return []; + } + + // console.debug(data.results); + + const ret: MediaTypeModel[] = []; + + for (const result of data.results) { + ret.push( + new SeriesModel({ + type: 'series', + title: result.original_name, + englishTitle: result.name, + year: result.first_air_date ? new Date(result.first_air_date).getFullYear().toString() : 'unknown', + dataSource: this.apiName, + id: result.id.toString(), + }), + ); + } + + return ret; + } + + async getById(id: string): Promise { + console.log(`MDB | api "${this.apiName}" queried by ID`); + + if (!this.plugin.settings.TMDBKey) { + throw Error(`MDB | API key for ${this.apiName} missing.`); + } + + const client = createClient({ baseUrl: 'https://api.themoviedb.org' }); + const response = await client.GET('/3/tv/{series_id}', { + headers: { + Authorization: `Bearer ${this.plugin.settings.TMDBKey}`, + }, + params: { + path: { series_id: parseInt(id) }, + query: { + append_to_response: 'credits', + }, + }, + fetch: fetch, + }); + + if (response.response.status === 401) { + throw Error(`MDB | Authentication for ${this.apiName} failed. Check the API key.`); + } + if (response.response.status !== 200) { + throw Error(`MDB | Received status code ${response.response.status} from ${this.apiName}.`); + } + + const result = response.data; + + if (!result) { + throw Error(`MDB | No data received from ${this.apiName}.`); + } + // console.debug(result); + + return new SeriesModel({ + type: 'series', + title: result.original_name, + englishTitle: result.name, + year: result.first_air_date ? new Date(result.first_air_date).getFullYear().toString() : 'unknown', + dataSource: this.apiName, + url: `https://www.themoviedb.org/tv/${result.id}`, + id: result.id.toString(), + + plot: result.overview ?? '', + genres: result.genres?.map((g: any) => g.name) ?? [], + writer: result.created_by?.map((c: any) => c.name) ?? [], + studio: result.production_companies?.map((s: any) => s.name) ?? [], + episodes: result.number_of_episodes, + duration: result.episode_run_time?.[0]?.toString() ?? 'unknown', + onlineRating: result.vote_average, + // TMDB's spec allows for 'append_to_response' but doesn't seem to account for it in the type + // @ts-ignore + actors: result.credits?.cast.map((c: any) => c.name).slice(0, 5) ?? [], + image: result.poster_path ? `https://image.tmdb.org/t/p/w780${result.poster_path}` : null, + + released: ['Returning Series', 'Cancelled', 'Ended'].includes(result.status!), + streamingServices: [], + airing: ['Returning Series'].includes(result.status!), + airedFrom: this.plugin.dateFormatter.format(result.first_air_date, this.apiDateFormat) ?? 'unknown', + airedTo: ['Returning Series'].includes(result.status!) ? 'unknown' : (this.plugin.dateFormatter.format(result.last_air_date, this.apiDateFormat) ?? 'unknown'), + + userData: { + watched: false, + lastWatched: '', + personalRating: 0, + }, + }); + } + + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.TMDBSeriesAPI_disabledMediaTypes; + } +} diff --git a/src/api/apis/WikipediaAPI.ts b/src/api/apis/WikipediaAPI.ts index 110cd79..9b3b289 100644 --- a/src/api/apis/WikipediaAPI.ts +++ b/src/api/apis/WikipediaAPI.ts @@ -4,6 +4,35 @@ import { WikiModel } from '../../models/WikiModel'; import { MediaType } from '../../utils/MediaType'; import { APIModel } from '../APIModel'; +interface SearchResponse { + query: { + search: { + title: string; + pageid: number; + }[]; + }; +} + +interface IdResponse { + query: { + pages: Record; + }; +} + +interface WikipediaPage { + pageid: number; + title: string; + contentmodel: string; + pagelanguage: string; + pagelanguagehtmlcode: string; + pagelanguagedir: string; + touched: string; // ISO date string + lastrevid: number; + length: number; + fullurl: string; + editurl: string; + canonicalurl: string; +} export class WikipediaAPI extends APIModel { plugin: MediaDbPlugin; apiDateFormat: string = 'YYYY-MM-DDTHH:mm:ssZ'; // ISO @@ -29,7 +58,7 @@ export class WikipediaAPI extends APIModel { throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); } - const data = await fetchData.json(); + const data = (await fetchData.json()) as SearchResponse; console.debug(data); const ret: MediaTypeModel[] = []; @@ -41,7 +70,7 @@ export class WikipediaAPI extends APIModel { englishTitle: result.title, year: '', dataSource: this.apiName, - id: result.pageid, + id: result.pageid.toString(), }), ); } @@ -59,24 +88,25 @@ export class WikipediaAPI extends APIModel { throw Error(`MDB | Received status code ${fetchData.status} from ${this.apiName}.`); } - const data = await fetchData.json(); + const data = (await fetchData.json()) as IdResponse; // console.debug(data); - const result: any = Object.entries(data?.query?.pages)[0][1]; + const result = Object.values(data?.query?.pages)[0]; return new WikiModel({ - type: 'wiki', title: result.title, englishTitle: result.title, - year: '', dataSource: this.apiName, url: result.fullurl, - id: result.pageid, + id: result.pageid.toString(), wikiUrl: result.fullurl, - lastUpdated: this.plugin.dateFormatter.format(result.touched, this.apiDateFormat) ?? undefined, + lastUpdated: this.plugin.dateFormatter.format(result.touched, this.apiDateFormat), length: result.length, userData: {}, }); } + getDisabledMediaTypes(): MediaType[] { + return this.plugin.settings.WikipediaAPI_disabledMediaTypes; + } } diff --git a/src/api/schemas/GiantBomb.json b/src/api/schemas/GiantBomb.json new file mode 100644 index 0000000..4b8a13c --- /dev/null +++ b/src/api/schemas/GiantBomb.json @@ -0,0 +1,11226 @@ +{ + "components": { + "parameters": { + "FieldList": { + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "$ref": "#/components/schemas/FieldList" + } + }, + "Filter": { + "description": "The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format)", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "$ref": "#/components/schemas/Filter" + } + }, + "Format": { + "description": "The data format of the response takes either xml, json, or jsonp.", + "in": "query", + "name": "format", + "required": false, + "schema": { + "$ref": "#/components/schemas/Format" + } + }, + "Game": { + "description": "Filter by the ID field on the game resource.", + "in": "query", + "name": "game", + "required": false, + "schema": { + "$ref": "#/components/schemas/GameId" + } + }, + "Limit": { + "description": "The number of results to display per page. This value defaults to 100 and can not exceed this number.", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "$ref": "#/components/schemas/Limit" + } + }, + "Offset": { + "description": "Return results starting with the object at the offset specified.", + "in": "query", + "name": "offset", + "required": false, + "schema": { + "$ref": "#/components/schemas/Offset" + } + }, + "Page": { + "description": "Page number of search results.", + "in": "query", + "name": "page", + "required": false, + "schema": { + "$ref": "#/components/schemas/Page" + } + }, + "Platforms": { + "description": "Filters results by platform. The value passed to this filter should be the ID of the platform to filter results by.", + "in": "query", + "name": "platforms", + "required": false, + "schema": { + "$ref": "#/components/schemas/PlatformId" + } + }, + "Query": { + "description": "The search string.", + "in": "query", + "name": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/Query" + } + }, + "Resources": { + "description": "List of resources to filter results. This filter can accept multiple arguments, each delimited with a \",\". Available options are:
game
franchise
character
concept
object
location
person
company
video", + "explode": false, + "in": "query", + "name": "resources", + "required": false, + "schema": { + "description": "##ENTER##", + "items": { + "$ref": "#/components/schemas/ResourceType" + }, + "type": "array" + }, + "style": "form" + }, + "Sort": { + "description": "The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc.", + "in": "query", + "name": "sort", + "required": false, + "schema": { + "$ref": "#/components/schemas/Sort" + } + }, + "SubscriberOnly": { + "description": "##ENTER##", + "in": "query", + "name": "subscriber_only", + "required": false, + "schema": { + "$ref": "#/components/schemas/SubscriberOnly" + } + }, + "TimeToSave": { + "description": "The number of seconds into the video the current user is", + "in": "query", + "name": "time_to_save", + "required": false, + "schema": { + "$ref": "#/components/schemas/TimeToSave" + } + }, + "VideoId": { + "description": "Id of the video", + "in": "query", + "name": "video_id", + "required": false, + "schema": { + "$ref": "#/components/schemas/VideoId" + } + } + }, + "responses": { + "InvalidAPIKey": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidAPIKey" + } + }, + "application/jsonp": { + "schema": { + "$ref": "#/components/schemas/InvalidAPIKey" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/InvalidAPIKey" + } + } + }, + "description": "##ENTER##" + } + }, + "schemas": { + "Accessory": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the accessory detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the accessory was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the accessory was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the accessory.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the accessory.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for accessory.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the accessory.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the accessory.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the accessory.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the accessory on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Accessory.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Accessory" + }, + { + "properties": {} + } + ] + }, + "Character": { + "description": "##ENTER##", + "properties": { + "aliases": { + "description": "List of aliases the character is known by. A \\n (newline) seperates each alias.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the character detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "birthday": { + "description": "Birthday of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the character was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the character was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appeared_in_game": { + "description": "Game where the character made its first appearance.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "gender": { + "description": "Gender of the character. Available options are: Male, Female, Other", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "last_name": { + "description": "Last name of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "real_name": { + "description": "Real name of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the character on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Character.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Character" + }, + { + "properties": { + "concepts": { + "description": "Concepts related to the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "enemies": { + "description": "Enemeis of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "franchises": { + "description": "Franchises related to the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "friends": { + "description": "Friends of the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "games": { + "description": "Games the character has appeared in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "locations": { + "description": "Locations related to the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "objects": { + "description": "Objects related to the character.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "people": { + "description": "People who have worked with the character.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "Chat": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the chat detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "channel_name": { + "description": "Name of the video streaming channel associated with the chat.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the chat.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for chat.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the chat.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the chat.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "password": { + "description": "chat password.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the chat on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "title": { + "description": "Title of the chat.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Chat.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Chat" + }, + { + "properties": {} + } + ] + }, + "Company": { + "description": "##ENTER##", + "properties": { + "abbreviation": { + "description": "Abbreviation of the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "aliases": { + "description": "List of aliases the company is known by. A \\n (newline) seperates each alias.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the company detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the company was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_founded": { + "description": "Date the company was founded.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the company was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "location_address": { + "description": "Street address of the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "location_city": { + "description": "City the company resides in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "location_country": { + "description": "Country the company resides in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "location_state": { + "description": "State the company resides in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "phone": { + "description": "Phone number of the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the company on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "website": { + "description": "URL to the company website.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Company.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Company" + }, + { + "properties": { + "characters": { + "description": "Characters related to the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "concepts": { + "description": "Concepts related to the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "developed_games": { + "description": "Games the company has developed.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "developer_releases": { + "description": "Releases the company has developed.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "distributor_releases": { + "description": "Releases the company has distributed.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "locations": { + "description": "Locations related to the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "objects": { + "description": "Objects related to the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "people": { + "description": "People who have worked with the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "published_games": { + "description": "Games published by the company.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "publisher_releases": { + "description": "Releases the company has published.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "Concept": { + "description": "##ENTER##", + "properties": { + "aliases": { + "description": "List of aliases the concept is known by. A \\n (newline) seperates each alias.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the concept detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the concept was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the concept was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appeared_in_franchise": { + "description": "Franchise where the concept made its first appearance.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appeared_in_game": { + "description": "Game where the concept made its first appearance.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the concept on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Concept.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Concept" + }, + { + "properties": { + "characters": { + "description": "Characters related to the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "concepts": { + "description": "Concepts related to the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "franchises": { + "description": "Franchises related to the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "games": { + "description": "Games the concept has appeared in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "locations": { + "description": "Locations related to the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "objects": { + "description": "Objects related to the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "people": { + "description": "People who have worked with the concept.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "related_concepts": { + "description": "Other concepts related to the concept.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "CurrentLive": { + "description": "##ENTER##", + "properties": { + "success": { + "description": "##ENTER##", + "type": "integer" + }, + "video": { + "description": "##ENTER##", + "nullable": true, + "properties": { + "image": { + "description": "Thumbnail image of the video", + "example": "##WRONG TYPE##", + "type": "string" + }, + "stream": { + "description": "URL of the stream (HLS format)", + "example": "##WRONG TYPE##", + "type": "string" + }, + "title": { + "description": "Title of the live video", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "Dlc": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the dlc detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the dlc was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the dlc was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the dlc.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the dlc.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "game": { + "description": "Game the dlc is for.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for dlc.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the dlc.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the dlc.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the dlc.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "platform": { + "description": "The dlc's platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "release_date": { + "description": "Date of the dlc.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the dlc on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Dlc.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Dlc" + }, + { + "properties": {} + } + ] + }, + "FieldList": { + "description": "##ENTER##", + "type": "array" + }, + "Filter": { + "description": "##ENTER##", + "pattern": "^((\\w+:((\\w+)|(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\|\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}))),?)+$", + "type": "string" + }, + "Format": { + "description": "##ENTER##", + "enum": ["xml", "json", "jsonp"], + "type": "string" + }, + "Franchise": { + "description": "##ENTER##", + "properties": { + "aliases": { + "description": "List of aliases the franchise is known by. A \\n (newline) seperates each alias.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the franchise detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the franchise was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the franchise was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the franchise on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Franchise.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Franchise" + }, + { + "properties": { + "characters": { + "description": "Characters related to the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "concepts": { + "description": "Concepts related to the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "games": { + "description": "Games the franchise has appeared in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "locations": { + "description": "Locations related to the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "objects": { + "description": "Objects related to the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "people": { + "description": "People who have worked with the franchise.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "Game": { + "description": "##ENTER##", + "properties": { + "aliases": { + "description": "List of aliases the game is known by. A \\n (newline) seperates each alias.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the game detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the game was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the game was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "expected_release_day": { + "description": "Expected day of release. The month is represented numerically. Combine with 'expected_release_month', 'expected_release_year' and 'expected_release_quarter' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'original_release_date' field is set.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "expected_release_month": { + "description": "Expected month of release. The month is represented numerically. Combine with 'expected_release_day', 'expected_release_quarter' and 'expected_release_year' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'original_release_date' field is set.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "expected_release_quarter": { + "description": "Expected quarter of release. The quarter is represented numerically, where 1 = Q1, 2 = Q2, 3 = Q3, and 4 = Q4. Combine with 'expected_release_day', 'expected_release_day', 'expected_release_month' and 'expected_release_year' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'original_release_date' field is set.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "expected_release_year": { + "description": "Expected year of release. Combine with 'expected_release_day', 'expected_release_month' and 'expected_release_quarter' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'original_release_date' field is set.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "number_of_user_reviews": { + "description": "Number of user reviews of the game on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "original_game_rating": { + "description": "Rating of the first release of the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "original_release_date": { + "description": "Date the game was first released.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "platforms": { + "description": "The platforms the game exists on.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the game on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Game.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Game" + }, + { + "properties": { + "characters": { + "description": "Characters related to the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "concepts": { + "description": "Concepts related to the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "developers": { + "description": "Companies who developed the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "dlcs": { + "description": "Game DLCs", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appearance_characters": { + "description": "Characters that first appeared in the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appearance_concepts": { + "description": "Concepts that first appeared in the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appearance_locations": { + "description": "Locations that first appeared in the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appearance_objects": { + "description": "Objects that first appeared in the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appearance_people": { + "description": "People that were first credited in the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "franchises": { + "description": "Franchises related to the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "genres": { + "description": "Genres that encompass the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "images": { + "description": "List of images associated to the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "killed_characters": { + "description": "Characters killed in the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "locations": { + "description": "Locations related to the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "objects": { + "description": "Objects related to the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "people": { + "description": "People who have worked with the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "publishers": { + "description": "Companies who published the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "releases": { + "description": "Releases of the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "reviews": { + "description": "Staff reviews of the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "similar_games": { + "description": "Other games similar to the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "themes": { + "description": "Themes that encompass the game.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "videos": { + "description": "Videos associated to the game.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "GameId": { + "description": "##ENTER##", + "type": "integer" + }, + "GameRating": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the game_rating detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for game_rating.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the game_rating.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the game_rating.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the game_rating.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "rating_board": { + "description": "Rating board that issues this game_rating.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "GameRating.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/GameRating" + }, + { + "properties": {} + } + ] + }, + "Genre": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the genre detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the genre was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the genre was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the genre.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the genre.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for genre.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the genre.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the genre.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the genre.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the genre on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Genre.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Genre" + }, + { + "properties": {} + } + ] + }, + "GetAllSavedTime": { + "properties": { + "savedTimes": { + "description": "##ENTER##", + "items": { + "description": "##ENTER##", + "properties": { + "savedOn": { + "description": "Time/date the progress was saved", + "example": "##WRONG TYPE##", + "type": "string" + }, + "savedTime": { + "description": "Saved time for this video", + "example": "##WRONG TYPE##", + "type": "string" + }, + "videoId": { + "description": "Id of the video", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "success": { + "description": "##ENTER##", + "type": "integer" + } + }, + "type": "object" + }, + "GetSavedTime": { + "description": "##ENTER##", + "properties": { + "savedTime": { + "description": "Saved time of the video or -1 if no time is saved for this user", + "example": "##WRONG TYPE##", + "type": "string" + }, + "success": { + "description": "##ENTER##", + "type": "integer" + } + }, + "type": "object" + }, + "Image": { + "description": "##ENTER##", + "properties": { + "icon_url": { + "description": "URL to the icon version of the image.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tag": { + "description": "Name of image tag for filerting images.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "medium_url": { + "description": "URL to the medium size of the image.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "original_url": { + "description": "URL to the original image.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "screen_large_url": { + "description": "URL to the large screenshot version of the image.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "screen_url": { + "description": "URL to the screenshot version of the image.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "small_url": { + "description": "URL to the small version of the image.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "super_url": { + "description": "URL to the super sized version of the image.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "thumb_url": { + "description": "URL to the thumb-sized version of the image.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "tiny_url": { + "description": "URL to the tiny version of the image.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "InvalidAPIKey": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "error": { + "enum": ["Invalid API Key"] + }, + "results": { + "enum": [[]] + }, + "status_code": { + "enum": [100] + } + } + } + ] + }, + "Limit": { + "description": "##ENTER##", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "Location": { + "description": "##ENTER##", + "properties": { + "aliases": { + "description": "List of aliases the location is known by. A \\n (newline) seperates each alias.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the location detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the location was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the location was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the location.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the location.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appeared_in_game": { + "description": "Game where the location made its first appearance.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for location.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the location.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the location.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the location.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the location on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Location.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Location" + }, + { + "properties": {} + } + ] + }, + "Object": { + "description": "##ENTER##", + "properties": { + "aliases": { + "description": "List of aliases the object is known by. A \\n (newline) seperates each alias.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the object detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the object was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the object was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_appeared_in_game": { + "description": "Game where the object made its first appearance.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the object on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Object.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Object" + }, + { + "properties": { + "characters": { + "description": "Characters related to the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "companies": { + "description": "Companies related to the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "concepts": { + "description": "Concepts related to the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "franchises": { + "description": "Franchises related to the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "games": { + "description": "Games the object has appeared in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "locations": { + "description": "Locations related to the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "objects": { + "description": "Objects related to the object.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "people": { + "description": "People who have worked with the object.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "Offset": { + "description": "##ENTER##", + "type": "integer" + }, + "Page": { + "description": "##ENTER##", + "type": "integer" + }, + "Person": { + "description": "##ENTER##", + "properties": { + "aliases": { + "description": "List of aliases the person is known by. A \\n (newline) seperates each alias.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the person detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "birth_date": { + "description": "Date the person was born.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "country": { + "description": "Country the person resides in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the person was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the person was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "death_date": { + "description": "Date the person died.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "first_credited_game": { + "description": "Game the person was first credited.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "gender": { + "description": "Gender of the person. Available options are: Male, Female, Other", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "hometown": { + "description": "City or town the person resides in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the person on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Person.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Person" + }, + { + "properties": { + "characters": { + "description": "Characters related to the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "concepts": { + "description": "Concepts related to the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "franchises": { + "description": "Franchises related to the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "games": { + "description": "Games the person has appeared in.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "locations": { + "description": "Locations related to the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "objects": { + "description": "Objects related to the person.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "people": { + "description": "People who have worked with the person.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "Platform": { + "description": "##ENTER##", + "properties": { + "abbreviation": { + "description": "Abbreviation of the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the platform detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "company": { + "description": "Company that created the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the platform was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the platform was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image_tags": { + "description": "List of image tags to filter the images endpoint.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "install_base": { + "description": "Approximate number of sold hardware units.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "online_support": { + "description": "Flag indicating whether the platform has online capabilities.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "original_price": { + "description": "Initial price point of the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "release_date": { + "description": "Date of the platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the platform on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Platform.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Platform" + }, + { + "properties": {} + } + ] + }, + "PlatformId": { + "description": "##ENTER##", + "type": "integer" + }, + "Promo": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the promo detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the promo was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the promo.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for promo.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the promo.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the promo.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "link": { + "description": "The link that promo points to.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the promo.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "resource_type": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceType" + }, + { + "description": "The type of resource the promo is pointing towards." + } + ] + }, + "user": { + "description": "Author of the promo.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Promo.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Promo" + }, + { + "properties": {} + } + ] + }, + "Query": { + "description": "##ENTER##", + "type": "string" + }, + "RatingBoard": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the rating_board detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the rating_board was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the rating_board was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the rating_board.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the rating_board.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for rating_board.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the rating_board.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the rating_board.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the rating_board.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the rating_board on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "RatingBoard.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/RatingBoard" + }, + { + "properties": { + "region": { + "description": "Region the rating_board is responsible for.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "Region": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the region detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the region was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the region was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the region.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the region.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for region.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the region.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the region.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the region.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the region on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Region.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Region" + }, + { + "properties": { + "rating_boards": { + "description": "region in the region.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "Release": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the release detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the release was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the release was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "expected_release_day": { + "description": "\"Expected day of release. The day is represented numerically. Combine with 'expected_release_month', 'expected_release_year' and 'expected_release_quarter' for Giant Bomb's best guess release date of the release. These fields will be empty if the 'release_date' field is set.\"", + "example": "##WRONG TYPE##", + "type": "string" + }, + "expected_release_month": { + "description": "\"Expected month of release. The month is represented numerically. Combine with 'expected_release_day', expected_release_quarter' and 'expected_release_year' for Giant Bomb's best guess release date of the release. These fields will be empty if the 'release_date' field is set.\"", + "example": "##WRONG TYPE##", + "type": "string" + }, + "expected_release_quarter": { + "description": "Expected quarter of release. The quarter is represented numerically, where 1 = Q1, 2 = Q2, 3 = Q3, and 4 = Q4. Combine with 'expected_release_day', 'expected_release_month' and 'expected_release_year' for Giant Bomb's best guess release date of the release. These fields will be empty if the 'release_date' field is set.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "expected_release_year": { + "description": "Expected year of release. Combine with 'expected_release_day', 'expected_release_month' and 'expected_release_quarter' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'release_date' field is set.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "game": { + "description": "Game the release is for.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "game_rating": { + "description": "Rating of the release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "maximum_players": { + "description": "Maximum players", + "example": "##WRONG TYPE##", + "type": "string" + }, + "minimum_players": { + "description": "Minimum players", + "example": "##WRONG TYPE##", + "type": "string" + }, + "multiplayer_features": { + "description": "Multiplayer features", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "platform": { + "description": "The release's platform.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "product_code_type": { + "description": "The type of product code the release has (ex. UPC/A, ISBN-10, EAN-13).", + "example": "##WRONG TYPE##", + "type": "string" + }, + "product_code_value": { + "description": "The release's product code.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "region": { + "description": "Region the release is responsible for.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "release_date": { + "description": "Date of the release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "resolutions": { + "description": "Resolutions available", + "example": "##WRONG TYPE##", + "type": "string" + }, + "singleplayer_features": { + "description": "Singleplayer features", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the release on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "sound_systems": { + "description": "Sound systems", + "example": "##WRONG TYPE##", + "type": "string" + }, + "widescreen_support": { + "description": "Widescreen support", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Release.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Release" + }, + { + "properties": { + "developers": { + "description": "Companies who developed the release.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "publishers": { + "description": "Companies who published the release.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "ResourceType": { + "description": "##ENTER##", + "enum": ["game", "franchise", "character", "concept", "object", "location", "person", "company", "video"], + "type": "string" + }, + "Response": { + "description": "##ENTER##", + "properties": { + "error": { + "description": "A text string representing the status_code", + "type": "string" + }, + "limit": { + "description": "The value of the limit filter specified, or 100 if not specified", + "type": "integer" + }, + "number_of_page_results": { + "description": "The number of results on this page", + "type": "integer" + }, + "number_of_total_results": { + "description": "The number of total results matching the filter conditions specified", + "type": "integer" + }, + "offset": { + "description": "The value of the offset filter specified, or 0 if not specified", + "type": "integer" + }, + "results": { + "description": "Zero or more items that match the filters specified", + "type": "string" + }, + "status_code": { + "description": "An integer indicating the result of the request. Acceptable values are:
1:OK
100:Invalid API Key
101:Object Not Found
102:Error in URL Format
103:'jsonp' format requires a 'json_callback' argument
104:Filter Error
105:Subscriber only video is for subscribers only", + "type": "integer" + } + }, + "type": "object", + "xml": { + "name": "response", + "wrapped": true + } + }, + "Review": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the review detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "dlc_name": { + "description": "Name of the Downloadable Content package.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "game": { + "description": "Game the review is for.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "publish_date": { + "description": "Date the review was published on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "release": { + "description": "Release of game for review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "reviewer": { + "description": "Name of the review's author.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "score": { + "description": "The score given to the game on a scale of 1 to 5.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the review on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Review.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Review" + }, + { + "properties": { + "platforms": { + "description": "Platforms the review appeared in.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "SaveTime": { + "description": "##ENTER##", + "properties": { + "message": { + "description": "##ENTER##", + "type": "string" + }, + "success": { + "description": "##ENTER##", + "type": "boolean" + } + }, + "type": "object" + }, + "Search": { + "allOf": [ + { + "oneOf": [ + { + "$ref": "#/components/schemas/Game" + }, + { + "$ref": "#/components/schemas/Franchise" + }, + { + "$ref": "#/components/schemas/Character" + }, + { + "$ref": "#/components/schemas/Concept" + }, + { + "$ref": "#/components/schemas/Object" + }, + { + "$ref": "#/components/schemas/Location" + }, + { + "$ref": "#/components/schemas/Person" + }, + { + "$ref": "#/components/schemas/Company" + }, + { + "$ref": "#/components/schemas/Video" + } + ] + }, + { + "description": "##ENTER##", + "properties": { + "resource_type": { + "allOf": [ + { + "$ref": "#/components/schemas/ResourceType" + }, + { + "description": "The type of resource the result is mapped to. Available options are:
game
franchise
character
concept
object
location
person
company
video" + } + ] + } + }, + "type": "object" + } + ] + }, + "Sort": { + "description": "##ENTER##", + "pattern": "^\\w+:((asc)|(desc))$", + "type": "string" + }, + "SubscriberOnly": { + "description": "##ENTER##", + "type": "boolean" + }, + "Theme": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the theme detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for theme.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the theme.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the theme.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the theme on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Theme.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Theme" + }, + { + "properties": {} + } + ] + }, + "TimeToSave": { + "description": "##ENTER##", + "type": "integer" + }, + "Type": { + "description": "##ENTER##", + "properties": { + "detail_resource_name": { + "description": "The name of the type's detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the type.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "list_resource_name": { + "description": "The name of the type's list resource.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "UserReview": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the user_review detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_added": { + "description": "Date the user_review was added to Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "date_last_updated": { + "description": "Date the user_review was last updated on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the user_review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "description": { + "description": "Description of the user_review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "dlc": { + "description": "DLC being reviewed.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "game": { + "description": "Game being reviewd.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for user_review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the user_review.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "release": { + "description": "Release being reviewed.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "reviewer": { + "description": "Name of the review's author.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "score": { + "description": "The score given to the game on a scale of 1 to 5.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the user_review on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "UserReview.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/UserReview" + }, + { + "properties": {} + } + ] + }, + "Video": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the video detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "associations": { + "description": "Related objects to the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "embed_player": { + "description": "URL for video embed player. To be inserted into an iFrame.
You can add ?autoplay=true to auto-play.
You can add ?time=x where 'x' is an integer between 0 and the length of the video in seconds to start the video at that point.
You can add ?vol=x where 'x' is a decimal between 0 and 1, .75 for example, to set the starting volume.
The above three parameters may be used together. Example: ?time=45&vol=.5&autoplay=true
See http://www.giantbomb.com/api/video-embed-sample/ for more information on using the embed player.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "hd_url": { + "description": "URL to the HD version of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "high_url": { + "description": "URL to the High Res version of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "length_seconds": { + "description": "Length (in seconds) of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "low_url": { + "description": "URL to the Low Res version of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "premium": { + "description": "Premium status of video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "publish_date": { + "description": "Date the video was published on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "saved_time": { + "description": "The time where the user left off watching this video", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the video on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "url": { + "description": "The video's filename.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "user": { + "description": "Author of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "video_categories": { + "description": "Video categories", + "example": "##WRONG TYPE##", + "type": "string" + }, + "video_show": { + "description": "Video show", + "example": "##WRONG TYPE##", + "type": "string" + }, + "video_type": { + "description": "Video category", + "example": "##WRONG TYPE##", + "type": "string" + }, + "youtube_id": { + "description": "Youtube ID for the video.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "Video.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/Video" + }, + { + "properties": { + "crew": { + "description": "Crew of the video.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "hosts": { + "description": "Hosts of the video.", + "example": "##WRONG TYPE##", + "type": "string" + } + } + } + ] + }, + "VideoCategory": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the video_category detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the video_category.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the video_category.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the video_category.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the video_category.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the video_category on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "VideoCategory.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/VideoCategory" + }, + { + "properties": {} + } + ] + }, + "VideoId": { + "description": "##ENTER##", + "type": "integer" + }, + "VideoShow": { + "description": "##ENTER##", + "properties": { + "active": { + "description": "Is this show currently active", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_detail_url": { + "description": "URL pointing to the video_show detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "api_videos_url": { + "description": "Endpoint to retrieve the videos attached to this video_show.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the video_show.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "display_nav": { + "description": "Should this show be displayed in navigation menus", + "example": "##WRONG TYPE##", + "type": "string" + }, + "guid": { + "description": "For use in single item api call for video_show.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the video_show.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "image": { + "description": "Main image of the video_show.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "latest": { + "description": "The latest episode of a video show. Overrides other sorts when used as a sort field.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "logo": { + "description": "Show logo.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "position": { + "description": "Editor ordering.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "premium": { + "description": "Premium status of video_show.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the video_show on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "title": { + "description": "Title of the video_show.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "VideoShow.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/VideoShow" + }, + { + "properties": {} + } + ] + }, + "VideoType": { + "description": "##ENTER##", + "properties": { + "api_detail_url": { + "description": "URL pointing to the video_type detail resource.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "deck": { + "description": "Brief summary of the video_type.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "id": { + "description": "Unique ID of the video_type.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "name": { + "description": "Name of the video_type.", + "example": "##WRONG TYPE##", + "type": "string" + }, + "site_detail_url": { + "description": "URL pointing to the video_type on Giant Bomb.", + "example": "##WRONG TYPE##", + "type": "string" + } + }, + "type": "object" + }, + "VideoType.Detail": { + "allOf": [ + { + "$ref": "#/components/schemas/VideoType" + }, + { + "properties": {} + } + ] + } + }, + "securitySchemes": { + "api_key": { + "in": "query", + "name": "api_key", + "type": "apiKey" + } + } + }, + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/" + }, + "info": { + "description": "##ENTER##", + "title": "Giant Bomb API", + "version": "0.7" + }, + "openapi": "3.0.2", + "paths": { + "/accessories": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "guid", + "id", + "image", + "image_tags", + "name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Accessory" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Accessory" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Accessory" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/accessory/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "guid", + "id", + "image", + "image_tags", + "name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Accessory.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Accessory.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Accessory.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/character/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "birthday", + "concepts", + "date_added", + "date_last_updated", + "deck", + "description", + "enemies", + "first_appeared_in_game", + "franchises", + "friends", + "games", + "gender", + "guid", + "id", + "image", + "image_tags", + "last_name", + "locations", + "name", + "objects", + "people", + "real_name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Character.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Character.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Character.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/characters": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "birthday", + "date_added", + "date_last_updated", + "deck", + "description", + "first_appeared_in_game", + "gender", + "guid", + "id", + "image", + "image_tags", + "last_name", + "name", + "real_name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Character" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Character" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Character" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/chat/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "channel_name", "deck", "guid", "id", "image", "password", "site_detail_url", "title"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Chat.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Chat.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Chat.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Live"] + }, + "summary": "##ENTER##" + }, + "/chats": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "channel_name", "deck", "guid", "id", "image", "password", "site_detail_url", "title"], + "type": "string" + } + } + ] + }, + "style": "form" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Chat" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Chat" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Chat" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Live"] + }, + "summary": "##ENTER##" + }, + "/companies": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "abbreviation", + "aliases", + "api_detail_url", + "date_added", + "date_founded", + "date_last_updated", + "deck", + "description", + "guid", + "id", + "image", + "image_tags", + "location_address", + "location_city", + "location_country", + "location_state", + "name", + "phone", + "site_detail_url", + "website" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Company" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Company" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Company" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/company/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "abbreviation", + "aliases", + "api_detail_url", + "characters", + "concepts", + "date_added", + "date_founded", + "date_last_updated", + "deck", + "description", + "developed_games", + "developer_releases", + "distributor_releases", + "guid", + "id", + "image", + "image_tags", + "location_address", + "location_city", + "location_country", + "location_state", + "locations", + "name", + "objects", + "people", + "phone", + "published_games", + "publisher_releases", + "site_detail_url", + "website" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Company.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Company.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Company.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/concept/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "characters", + "concepts", + "date_added", + "date_last_updated", + "deck", + "description", + "first_appeared_in_franchise", + "first_appeared_in_game", + "franchises", + "games", + "guid", + "id", + "image", + "image_tags", + "locations", + "name", + "objects", + "people", + "related_concepts", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Concept.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Concept.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Concept.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/concepts": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "first_appeared_in_franchise", + "first_appeared_in_game", + "guid", + "id", + "image", + "image_tags", + "name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Concept" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Concept" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Concept" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/dlc/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "game", + "guid", + "id", + "image", + "name", + "platform", + "release_date", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Dlc.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Dlc.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Dlc.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/dlcs": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "game", + "guid", + "id", + "image", + "name", + "platform", + "release_date", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Platforms" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Dlc" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Dlc" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Dlc" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/franchise/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "characters", + "concepts", + "date_added", + "date_last_updated", + "deck", + "description", + "games", + "guid", + "id", + "image", + "image_tags", + "locations", + "name", + "objects", + "people", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Franchise.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Franchise.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Franchise.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/franchises": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "guid", + "id", + "image", + "image_tags", + "name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Franchise" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Franchise" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Franchise" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/game_rating/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "guid", "id", "image", "name", "rating_board"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/GameRating.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/GameRating.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/GameRating.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/game_ratings": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "guid", "id", "image", "name", "rating_board"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/GameRating" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/GameRating" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/GameRating" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/game/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "characters", + "concepts", + "date_added", + "date_last_updated", + "deck", + "description", + "developers", + "dlcs", + "expected_release_day", + "expected_release_month", + "expected_release_quarter", + "expected_release_year", + "first_appearance_characters", + "first_appearance_concepts", + "first_appearance_locations", + "first_appearance_objects", + "first_appearance_people", + "franchises", + "genres", + "guid", + "id", + "image", + "image_tags", + "images", + "killed_characters", + "locations", + "name", + "number_of_user_reviews", + "objects", + "original_game_rating", + "original_release_date", + "people", + "platforms", + "publishers", + "releases", + "reviews", + "similar_games", + "site_detail_url", + "themes", + "videos" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Game.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Game.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Game.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/games": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "expected_release_day", + "expected_release_month", + "expected_release_quarter", + "expected_release_year", + "guid", + "id", + "image", + "image_tags", + "name", + "number_of_user_reviews", + "original_game_rating", + "original_release_date", + "platforms", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Platforms" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Game" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Game" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Game" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/genre/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "date_added", "date_last_updated", "deck", "description", "guid", "id", "image", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Genre.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Genre.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Genre.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/genres": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "date_added", "date_last_updated", "deck", "description", "guid", "id", "image", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Genre" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Genre" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Genre" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/images/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "icon_url", + "image_tag", + "medium_url", + "original_url", + "screen_large_url", + "screen_url", + "small_url", + "super_url", + "thumb_url", + "tiny_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Filter" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Image" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Image" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Image" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/location/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "first_appeared_in_game", + "guid", + "id", + "image", + "image_tags", + "name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Location.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Location.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Location.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/locations": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "first_appeared_in_game", + "guid", + "id", + "image", + "image_tags", + "name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Location" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Location" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Location" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/object/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "characters", + "companies", + "concepts", + "date_added", + "date_last_updated", + "deck", + "description", + "first_appeared_in_game", + "franchises", + "games", + "guid", + "id", + "image", + "image_tags", + "locations", + "name", + "objects", + "people", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Object.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Object.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Object.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/objects": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "first_appeared_in_game", + "guid", + "id", + "image", + "image_tags", + "name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Object" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Object" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Object" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/people": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "birth_date", + "country", + "date_added", + "date_last_updated", + "death_date", + "deck", + "description", + "first_credited_game", + "gender", + "guid", + "hometown", + "id", + "image", + "image_tags", + "name", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Person" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Person" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Person" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/person/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "aliases", + "api_detail_url", + "birth_date", + "characters", + "concepts", + "country", + "date_added", + "date_last_updated", + "death_date", + "deck", + "description", + "first_credited_game", + "franchises", + "games", + "gender", + "guid", + "hometown", + "id", + "image", + "image_tags", + "locations", + "name", + "objects", + "people", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Person.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Person.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Person.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/platform/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "abbreviation", + "api_detail_url", + "company", + "date_added", + "date_last_updated", + "deck", + "description", + "guid", + "id", + "image", + "image_tags", + "install_base", + "name", + "online_support", + "original_price", + "release_date", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Platform.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Platform.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Platform.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/platforms": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "abbreviation", + "api_detail_url", + "company", + "date_added", + "date_last_updated", + "deck", + "description", + "guid", + "id", + "image", + "image_tags", + "install_base", + "name", + "online_support", + "original_price", + "release_date", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Platform" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Platform" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Platform" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/promo/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "date_added", "deck", "guid", "id", "image", "link", "name", "resource_type", "user"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Promo.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Promo.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Promo.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["General"] + }, + "summary": "##ENTER##" + }, + "/promos": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "date_added", "deck", "guid", "id", "image", "link", "name", "resource_type", "user"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Promo" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Promo" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Promo" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["General"] + }, + "summary": "##ENTER##" + }, + "/rating_board/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "guid", + "id", + "image", + "name", + "region", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/RatingBoard.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/RatingBoard.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/RatingBoard.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/rating_boards": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "date_added", "date_last_updated", "deck", "description", "guid", "id", "image", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/RatingBoard" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/RatingBoard" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/RatingBoard" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/region/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "guid", + "id", + "image", + "name", + "rating_boards", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Region.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Region.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Region.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/regions": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "date_added", "date_last_updated", "deck", "description", "guid", "id", "image", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Region" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Region" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Region" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/release/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "developers", + "expected_release_day", + "expected_release_month", + "expected_release_quarter", + "expected_release_year", + "game", + "game_rating", + "guid", + "id", + "image", + "maximum_players", + "minimum_players", + "multiplayer_features", + "name", + "platform", + "product_code_type", + "product_code_value", + "publishers", + "region", + "release_date", + "resolutions", + "singleplayer_features", + "site_detail_url", + "sound_systems", + "widescreen_support" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Release.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Release.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Release.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/releases": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "expected_release_day", + "expected_release_month", + "expected_release_quarter", + "expected_release_year", + "game", + "game_rating", + "guid", + "id", + "image", + "maximum_players", + "minimum_players", + "multiplayer_features", + "name", + "platform", + "product_code_type", + "product_code_value", + "region", + "release_date", + "resolutions", + "singleplayer_features", + "site_detail_url", + "sound_systems", + "widescreen_support" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Platforms" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Release" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Release" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Release" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/review/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "deck", + "description", + "dlc_name", + "game", + "guid", + "id", + "platforms", + "publish_date", + "release", + "reviewer", + "score", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Review.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Review.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Review.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Reviews"] + }, + "summary": "##ENTER##" + }, + "/reviews": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "deck", + "description", + "dlc_name", + "game", + "guid", + "id", + "publish_date", + "release", + "reviewer", + "score", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Review" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Review" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Review" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Reviews"] + }, + "summary": "##ENTER##" + }, + "/search": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "abbreviation", + "aliases", + "api_detail_url", + "associations", + "birth_date", + "birthday", + "country", + "date_added", + "date_founded", + "date_last_updated", + "death_date", + "deck", + "description", + "embed_player", + "expected_release_day", + "expected_release_month", + "expected_release_quarter", + "expected_release_year", + "first_appeared_in_franchise", + "first_appeared_in_game", + "first_credited_game", + "gender", + "guid", + "hd_url", + "high_url", + "hometown", + "id", + "image", + "image_tags", + "last_name", + "length_seconds", + "location_address", + "location_city", + "location_country", + "location_state", + "low_url", + "name", + "number_of_user_reviews", + "original_game_rating", + "original_release_date", + "phone", + "platforms", + "premium", + "publish_date", + "real_name", + "resource_type", + "saved_time", + "site_detail_url", + "url", + "user", + "video_categories", + "video_show", + "video_type", + "website", + "youtube_id" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "The number of results to display per page. This value defaults to 10 and can not exceed this number.", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Limit" + }, + { + "description": "The number of results to display per page. This value defaults to 10 and can not exceed this number.", + "maximum": 10 + } + ] + } + }, + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/Query" + }, + { + "$ref": "#/components/parameters/Resources" + }, + { + "$ref": "#/components/parameters/SubscriberOnly" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Search" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Search" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Search" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Search"] + }, + "summary": "##ENTER##" + }, + "/theme/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "guid", "id", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Theme.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Theme.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Theme.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/themes": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "guid", "id", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Theme" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Theme" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Theme" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Wiki"] + }, + "summary": "##ENTER##" + }, + "/types": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Type" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Type" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Type" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["General"] + }, + "summary": "##ENTER##" + }, + "/user_review/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "dlc", + "game", + "guid", + "id", + "release", + "reviewer", + "score", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/UserReview.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/UserReview.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/UserReview.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Reviews"] + }, + "summary": "##ENTER##" + }, + "/user_reviews": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "date_added", + "date_last_updated", + "deck", + "description", + "dlc", + "game", + "guid", + "id", + "release", + "reviewer", + "score", + "site_detail_url" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Game" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/UserReview" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/UserReview" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/UserReview" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Reviews"] + }, + "summary": "##ENTER##" + }, + "/video_categories": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "deck", "id", "image", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Sort" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoCategory" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoCategory" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoCategory" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Videos"] + }, + "summary": "##ENTER##" + }, + "/video_category/{id}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "deck", "id", "image", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "id", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoCategory.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoCategory.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoCategory.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Videos"] + }, + "summary": "##ENTER##" + }, + "/video_show/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "active", + "api_detail_url", + "api_videos_url", + "deck", + "display_nav", + "guid", + "id", + "image", + "latest", + "logo", + "position", + "premium", + "site_detail_url", + "title" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoShow.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoShow.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoShow.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Videos"] + }, + "summary": "##ENTER##" + }, + "/video_shows": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "active", + "api_detail_url", + "api_videos_url", + "deck", + "display_nav", + "guid", + "id", + "image", + "latest", + "logo", + "position", + "premium", + "site_detail_url", + "title" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoShow" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoShow" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoShow" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Videos"] + }, + "summary": "##ENTER##" + }, + "/video_type/{id}": { + "description": "##ENTER##", + "get": { + "deprecated": true, + "description": "##ENTER##
DEPRECATED: Please use the video_category or the video_show endpoint", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "deck", "id", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "id", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoType.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoType.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/VideoType.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "Get a details of a video type", + "tags": ["Videos"] + }, + "summary": "##ENTER##" + }, + "/video_types": { + "description": "##ENTER##", + "get": { + "deprecated": true, + "description": "##ENTER##
DEPRECATED: Please use the video_category or the video_show endpoint", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": ["api_detail_url", "deck", "id", "name", "site_detail_url"], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoType" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoType" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/VideoType" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "Get a list of video types", + "tags": ["Videos"] + }, + "summary": "##ENTER##" + }, + "/video/{guid}": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "associations", + "crew", + "deck", + "embed_player", + "guid", + "hd_url", + "high_url", + "hosts", + "id", + "image", + "length_seconds", + "low_url", + "name", + "premium", + "publish_date", + "saved_time", + "site_detail_url", + "url", + "user", + "video_categories", + "video_show", + "video_type", + "youtube_id" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "description": "##ENTER##", + "in": "path", + "name": "guid", + "required": true, + "schema": { + "description": "##ENTER##", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Video.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Video.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "$ref": "#/components/schemas/Video.Detail" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Videos"] + }, + "summary": "##ENTER##" + }, + "/video/current-live": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CurrentLive" + } + }, + "application/jsonp": { + "schema": { + "$ref": "#/components/schemas/CurrentLive" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/CurrentLive" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "Get the currently running live stream", + "tags": ["Live"] + }, + "summary": "##ENTER##" + }, + "/video/get-all-saved-times": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetAllSavedTime" + } + }, + "application/jsonp": { + "schema": { + "$ref": "#/components/schemas/GetAllSavedTime" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/GetAllSavedTime" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "Get all the video saved times for the user", + "tags": ["Bookmarks"] + }, + "summary": "##ENTER##" + }, + "/video/get-saved-time": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "$ref": "#/components/parameters/VideoId" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetSavedTime" + } + }, + "application/jsonp": { + "schema": { + "$ref": "#/components/schemas/GetSavedTime" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/GetSavedTime" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "Get the saved time of a video for the user", + "tags": ["Bookmarks"] + }, + "summary": "##ENTER##" + }, + "/video/save-time": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "$ref": "#/components/parameters/VideoId" + }, + { + "$ref": "#/components/parameters/TimeToSave" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SaveTime" + } + }, + "application/jsonp": { + "schema": { + "$ref": "#/components/schemas/SaveTime" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/SaveTime" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "Save the progress time of a video for this user", + "tags": ["Bookmarks"] + }, + "summary": "##ENTER##" + }, + "/videos": { + "description": "##ENTER##", + "get": { + "description": "##ENTER##", + "externalDocs": { + "description": "##ENTER##", + "url": "https://www.giantbomb.com/api/documentation/#ADD" + }, + "parameters": [ + { + "$ref": "#/components/parameters/Format" + }, + { + "description": "List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a \",\"", + "explode": false, + "in": "query", + "name": "field_list", + "required": false, + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/FieldList" + }, + { + "items": { + "enum": [ + "api_detail_url", + "associations", + "deck", + "embed_player", + "guid", + "hd_url", + "high_url", + "id", + "image", + "length_seconds", + "low_url", + "name", + "premium", + "publish_date", + "saved_time", + "site_detail_url", + "url", + "user", + "video_categories", + "video_show", + "video_type", + "youtube_id" + ], + "type": "string" + } + } + ] + }, + "style": "form" + }, + { + "$ref": "#/components/parameters/Limit" + }, + { + "$ref": "#/components/parameters/Offset" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/SubscriberOnly" + }, + { + "$ref": "#/components/parameters/Filter" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Video" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/jsonp": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Video" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + }, + "application/xml": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Response" + }, + { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/Video" + }, + "type": "array" + }, + "version": { + "description": "##ENTER##", + "example": "1.0", + "type": "string" + } + }, + "type": "object" + } + ], + "type": "object" + } + } + }, + "description": "##ENTER##" + }, + "401": { + "$ref": "#/components/responses/InvalidAPIKey" + } + }, + "security": [ + { + "api_key": [] + } + ], + "summary": "##ENTER##", + "tags": ["Videos"] + }, + "summary": "##ENTER##" + } + }, + "servers": [ + { + "description": "##ENTER##", + "url": "http://www.giantbomb.com/api/" + } + ], + "tags": [ + { + "description": "##ENTER##", + "name": "General" + }, + { + "description": "##ENTER##", + "name": "Wiki" + }, + { + "description": "##ENTER##", + "name": "Search" + }, + { + "description": "##ENTER##", + "name": "Reviews" + }, + { + "description": "##ENTER##", + "name": "Videos" + }, + { + "description": "##ENTER##", + "name": "Live" + }, + { + "description": "##ENTER##", + "name": "Bookmarks" + } + ] +} diff --git a/src/api/schemas/GiantBomb.ts b/src/api/schemas/GiantBomb.ts new file mode 100644 index 0000000..9d8f4ee --- /dev/null +++ b/src/api/schemas/GiantBomb.ts @@ -0,0 +1,6454 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + '/accessories': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Accessory'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Accessory'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Accessory'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/accessory/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Accessory.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Accessory.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Accessory.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/character/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Character.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Character.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Character.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/characters': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Character'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Character'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Character'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/chat/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Chat.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Chat.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Chat.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/chats': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Chat'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Chat'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Chat'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/companies': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Company'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Company'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Company'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/company/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Company.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Company.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Company.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/concept/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Concept.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Concept.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Concept.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/concepts': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Concept'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Concept'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Concept'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/dlc/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Dlc.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Dlc.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Dlc.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/dlcs': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description Filters results by platform. The value passed to this filter should be the ID of the platform to filter results by. */ + platforms?: components['parameters']['Platforms']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Dlc'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Dlc'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Dlc'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/franchise/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Franchise.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Franchise.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Franchise.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/franchises': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Franchise'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Franchise'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Franchise'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/game_rating/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['GameRating.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['GameRating.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['GameRating.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/game_ratings': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['GameRating'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['GameRating'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['GameRating'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/game/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Game.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Game.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Game.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/games': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description Filters results by platform. The value passed to this filter should be the ID of the platform to filter results by. */ + platforms?: components['parameters']['Platforms']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Game'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Game'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Game'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/genre/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Genre.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Genre.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Genre.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/genres': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Genre'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Genre'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Genre'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/images/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Image'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Image'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Image'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/location/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Location.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Location.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Location.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/locations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Location'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Location'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Location'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/object/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Object.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Object.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Object.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/objects': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Object'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Object'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Object'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/people': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Person'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Person'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Person'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/person/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Person.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Person.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Person.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/platform/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Platform.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Platform.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Platform.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/platforms': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Platform'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Platform'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Platform'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/promo/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Promo.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Promo.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Promo.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/promos': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Promo'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Promo'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Promo'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/rating_board/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['RatingBoard.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['RatingBoard.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['RatingBoard.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/rating_boards': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['RatingBoard'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['RatingBoard'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['RatingBoard'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/region/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Region.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Region.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Region.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/regions': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Region'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Region'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Region'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/release/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Release.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Release.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Release.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/releases': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description Filters results by platform. The value passed to this filter should be the ID of the platform to filter results by. */ + platforms?: components['parameters']['Platforms']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Release'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Release'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Release'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/review/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Review.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Review.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Review.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/reviews': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Review'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Review'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Review'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/search': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 10 and can not exceed this number. */ + limit?: components['schemas']['Limit'] & unknown; + /** @description Page number of search results. */ + page?: components['parameters']['Page']; + /** @description The search string. */ + query?: components['parameters']['Query']; + /** @description List of resources to filter results. This filter can accept multiple arguments, each delimited with a ",". Available options are:
game
franchise
character
concept
object
location
person
company
video */ + resources?: components['parameters']['Resources']; + /** @description ##ENTER## */ + subscriber_only?: components['parameters']['SubscriberOnly']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Search'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Search'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Search'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/theme/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Theme.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Theme.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Theme.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/themes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Theme'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Theme'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Theme'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/types': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Type'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Type'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Type'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/user_review/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['UserReview.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['UserReview.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['UserReview.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/user_reviews': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description Filter by the ID field on the game resource. */ + game?: components['parameters']['Game']; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['UserReview'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['UserReview'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['UserReview'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video_categories': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['VideoCategory'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['VideoCategory'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['VideoCategory'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video_category/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['VideoCategory.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['VideoCategory.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['VideoCategory.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video_show/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['VideoShow.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['VideoShow.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['VideoShow.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video_shows': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['VideoShow'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['VideoShow'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['VideoShow'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video_type/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a details of a video type + * @deprecated + * @description ##ENTER##
DEPRECATED: Please use the video_category or the video_show endpoint + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['VideoType.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['VideoType.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['VideoType.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video_types': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a list of video types + * @deprecated + * @description ##ENTER##
DEPRECATED: Please use the video_category or the video_show endpoint + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['VideoType'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['VideoType'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['VideoType'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video/{guid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + }; + header?: never; + path: { + /** @description ##ENTER## */ + guid: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Video.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Video.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Video.Detail']; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video/current-live': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the currently running live stream + * @description ##ENTER## + */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['CurrentLive']; + 'application/jsonp': components['schemas']['CurrentLive']; + 'application/xml': components['schemas']['CurrentLive']; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video/get-all-saved-times': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get all the video saved times for the user + * @description ##ENTER## + */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['GetAllSavedTime']; + 'application/jsonp': components['schemas']['GetAllSavedTime']; + 'application/xml': components['schemas']['GetAllSavedTime']; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video/get-saved-time': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the saved time of a video for the user + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description Id of the video */ + video_id?: components['parameters']['VideoId']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['GetSavedTime']; + 'application/jsonp': components['schemas']['GetSavedTime']; + 'application/xml': components['schemas']['GetSavedTime']; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/video/save-time': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Save the progress time of a video for this user + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description Id of the video */ + video_id?: components['parameters']['VideoId']; + /** @description The number of seconds into the video the current user is */ + time_to_save?: components['parameters']['TimeToSave']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['SaveTime']; + 'application/jsonp': components['schemas']['SaveTime']; + 'application/xml': components['schemas']['SaveTime']; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/videos': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * ##ENTER## + * @description ##ENTER## + */ + get: { + parameters: { + query?: { + /** @description The data format of the response takes either xml, json, or jsonp. */ + format?: components['parameters']['Format']; + /** @description List of field names to include in the response. Use this if you want to reduce the size of the response payload. This filter can accept multiple arguments, each delimited with a "," */ + field_list?: components['schemas']['FieldList'] & unknown; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + limit?: components['parameters']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + offset?: components['parameters']['Offset']; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + sort?: components['parameters']['Sort']; + /** @description ##ENTER## */ + subscriber_only?: components['parameters']['SubscriberOnly']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + filter?: components['parameters']['Filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description ##ENTER## */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['Response'] & { + results?: components['schemas']['Video'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/jsonp': components['schemas']['Response'] & { + results?: components['schemas']['Video'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + 'application/xml': components['schemas']['Response'] & { + results?: components['schemas']['Video'][]; + /** + * @description ##ENTER## + * @example 1.0 + */ + version?: string; + }; + }; + }; + 401: components['responses']['InvalidAPIKey']; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + /** @description ##ENTER## */ + Accessory: { + /** + * @description URL pointing to the accessory detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the accessory was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the accessory was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the accessory. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the accessory. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description For use in single item api call for accessory. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the accessory. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the accessory. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Name of the accessory. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the accessory on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Accessory.Detail': components['schemas']['Accessory'] & unknown; + /** @description ##ENTER## */ + Character: { + /** + * @description List of aliases the character is known by. A \n (newline) seperates each alias. + * @example ##WRONG TYPE## + */ + aliases?: string; + /** + * @description URL pointing to the character detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Birthday of the character. + * @example ##WRONG TYPE## + */ + birthday?: string; + /** + * @description Date the character was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the character was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the character. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the character. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description Game where the character made its first appearance. + * @example ##WRONG TYPE## + */ + first_appeared_in_game?: string; + /** + * @description Gender of the character. Available options are: Male, Female, Other + * @example ##WRONG TYPE## + */ + gender?: string; + /** + * @description For use in single item api call for character. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the character. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the character. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Last name of the character. + * @example ##WRONG TYPE## + */ + last_name?: string; + /** + * @description Name of the character. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description Real name of the character. + * @example ##WRONG TYPE## + */ + real_name?: string; + /** + * @description URL pointing to the character on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Character.Detail': components['schemas']['Character'] & { + /** + * @description Concepts related to the character. + * @example ##WRONG TYPE## + */ + concepts?: string; + /** + * @description Enemeis of the character. + * @example ##WRONG TYPE## + */ + enemies?: string; + /** + * @description Franchises related to the character. + * @example ##WRONG TYPE## + */ + franchises?: string; + /** + * @description Friends of the character. + * @example ##WRONG TYPE## + */ + friends?: string; + /** + * @description Games the character has appeared in. + * @example ##WRONG TYPE## + */ + games?: string; + /** + * @description Locations related to the character. + * @example ##WRONG TYPE## + */ + locations?: string; + /** + * @description Objects related to the character. + * @example ##WRONG TYPE## + */ + objects?: string; + /** + * @description People who have worked with the character. + * @example ##WRONG TYPE## + */ + people?: string; + }; + /** @description ##ENTER## */ + Chat: { + /** + * @description URL pointing to the chat detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Name of the video streaming channel associated with the chat. + * @example ##WRONG TYPE## + */ + channel_name?: string; + /** + * @description Brief summary of the chat. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description For use in single item api call for chat. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the chat. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the chat. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description chat password. + * @example ##WRONG TYPE## + */ + password?: string; + /** + * @description URL pointing to the chat on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + /** + * @description Title of the chat. + * @example ##WRONG TYPE## + */ + title?: string; + }; + 'Chat.Detail': components['schemas']['Chat'] & unknown; + /** @description ##ENTER## */ + Company: { + /** + * @description Abbreviation of the company. + * @example ##WRONG TYPE## + */ + abbreviation?: string; + /** + * @description List of aliases the company is known by. A \n (newline) seperates each alias. + * @example ##WRONG TYPE## + */ + aliases?: string; + /** + * @description URL pointing to the company detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the company was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the company was founded. + * @example ##WRONG TYPE## + */ + date_founded?: string; + /** + * @description Date the company was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the company. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the company. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description For use in single item api call for company. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the company. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the company. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Street address of the company. + * @example ##WRONG TYPE## + */ + location_address?: string; + /** + * @description City the company resides in. + * @example ##WRONG TYPE## + */ + location_city?: string; + /** + * @description Country the company resides in. + * @example ##WRONG TYPE## + */ + location_country?: string; + /** + * @description State the company resides in. + * @example ##WRONG TYPE## + */ + location_state?: string; + /** + * @description Name of the company. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description Phone number of the company. + * @example ##WRONG TYPE## + */ + phone?: string; + /** + * @description URL pointing to the company on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + /** + * @description URL to the company website. + * @example ##WRONG TYPE## + */ + website?: string; + }; + 'Company.Detail': components['schemas']['Company'] & { + /** + * @description Characters related to the company. + * @example ##WRONG TYPE## + */ + characters?: string; + /** + * @description Concepts related to the company. + * @example ##WRONG TYPE## + */ + concepts?: string; + /** + * @description Games the company has developed. + * @example ##WRONG TYPE## + */ + developed_games?: string; + /** + * @description Releases the company has developed. + * @example ##WRONG TYPE## + */ + developer_releases?: string; + /** + * @description Releases the company has distributed. + * @example ##WRONG TYPE## + */ + distributor_releases?: string; + /** + * @description Locations related to the company. + * @example ##WRONG TYPE## + */ + locations?: string; + /** + * @description Objects related to the company. + * @example ##WRONG TYPE## + */ + objects?: string; + /** + * @description People who have worked with the company. + * @example ##WRONG TYPE## + */ + people?: string; + /** + * @description Games published by the company. + * @example ##WRONG TYPE## + */ + published_games?: string; + /** + * @description Releases the company has published. + * @example ##WRONG TYPE## + */ + publisher_releases?: string; + }; + /** @description ##ENTER## */ + Concept: { + /** + * @description List of aliases the concept is known by. A \n (newline) seperates each alias. + * @example ##WRONG TYPE## + */ + aliases?: string; + /** + * @description URL pointing to the concept detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the concept was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the concept was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the concept. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the concept. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description Franchise where the concept made its first appearance. + * @example ##WRONG TYPE## + */ + first_appeared_in_franchise?: string; + /** + * @description Game where the concept made its first appearance. + * @example ##WRONG TYPE## + */ + first_appeared_in_game?: string; + /** + * @description For use in single item api call for concept. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the concept. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the concept. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Name of the concept. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the concept on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Concept.Detail': components['schemas']['Concept'] & { + /** + * @description Characters related to the concept. + * @example ##WRONG TYPE## + */ + characters?: string; + /** + * @description Concepts related to the concept. + * @example ##WRONG TYPE## + */ + concepts?: string; + /** + * @description Franchises related to the concept. + * @example ##WRONG TYPE## + */ + franchises?: string; + /** + * @description Games the concept has appeared in. + * @example ##WRONG TYPE## + */ + games?: string; + /** + * @description Locations related to the concept. + * @example ##WRONG TYPE## + */ + locations?: string; + /** + * @description Objects related to the concept. + * @example ##WRONG TYPE## + */ + objects?: string; + /** + * @description People who have worked with the concept. + * @example ##WRONG TYPE## + */ + people?: string; + /** + * @description Other concepts related to the concept. + * @example ##WRONG TYPE## + */ + related_concepts?: string; + }; + /** @description ##ENTER## */ + CurrentLive: { + /** @description ##ENTER## */ + success?: number; + /** @description ##ENTER## */ + video?: { + /** + * @description Thumbnail image of the video + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description URL of the stream (HLS format) + * @example ##WRONG TYPE## + */ + stream?: string; + /** + * @description Title of the live video + * @example ##WRONG TYPE## + */ + title?: string; + } | null; + }; + /** @description ##ENTER## */ + Dlc: { + /** + * @description URL pointing to the dlc detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the dlc was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the dlc was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the dlc. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the dlc. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description Game the dlc is for. + * @example ##WRONG TYPE## + */ + game?: string; + /** + * @description For use in single item api call for dlc. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the dlc. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the dlc. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description Name of the dlc. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description The dlc's platform. + * @example ##WRONG TYPE## + */ + platform?: string; + /** + * @description Date of the dlc. + * @example ##WRONG TYPE## + */ + release_date?: string; + /** + * @description URL pointing to the dlc on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Dlc.Detail': components['schemas']['Dlc'] & unknown; + /** @description ##ENTER## */ + FieldList: unknown[]; + /** @description ##ENTER## */ + Filter: string; + /** + * @description ##ENTER## + * @enum {string} + */ + Format: 'xml' | 'json' | 'jsonp'; + /** @description ##ENTER## */ + Franchise: { + /** + * @description List of aliases the franchise is known by. A \n (newline) seperates each alias. + * @example ##WRONG TYPE## + */ + aliases?: string; + /** + * @description URL pointing to the franchise detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the franchise was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the franchise was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the franchise. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the franchise. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description For use in single item api call for franchise. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the franchise. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the franchise. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Name of the franchise. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the franchise on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Franchise.Detail': components['schemas']['Franchise'] & { + /** + * @description Characters related to the franchise. + * @example ##WRONG TYPE## + */ + characters?: string; + /** + * @description Concepts related to the franchise. + * @example ##WRONG TYPE## + */ + concepts?: string; + /** + * @description Games the franchise has appeared in. + * @example ##WRONG TYPE## + */ + games?: string; + /** + * @description Locations related to the franchise. + * @example ##WRONG TYPE## + */ + locations?: string; + /** + * @description Objects related to the franchise. + * @example ##WRONG TYPE## + */ + objects?: string; + /** + * @description People who have worked with the franchise. + * @example ##WRONG TYPE## + */ + people?: string; + }; + /** @description ##ENTER## */ + Game: { + /** + * @description List of aliases the game is known by. A \n (newline) seperates each alias. + * @example ##WRONG TYPE## + */ + aliases?: string; + /** + * @description URL pointing to the game detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the game was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the game was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the game. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the game. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description Expected day of release. The month is represented numerically. Combine with 'expected_release_month', 'expected_release_year' and 'expected_release_quarter' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'original_release_date' field is set. + * @example ##WRONG TYPE## + */ + expected_release_day?: string; + /** + * @description Expected month of release. The month is represented numerically. Combine with 'expected_release_day', 'expected_release_quarter' and 'expected_release_year' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'original_release_date' field is set. + * @example ##WRONG TYPE## + */ + expected_release_month?: string; + /** + * @description Expected quarter of release. The quarter is represented numerically, where 1 = Q1, 2 = Q2, 3 = Q3, and 4 = Q4. Combine with 'expected_release_day', 'expected_release_day', 'expected_release_month' and 'expected_release_year' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'original_release_date' field is set. + * @example ##WRONG TYPE## + */ + expected_release_quarter?: string; + /** + * @description Expected year of release. Combine with 'expected_release_day', 'expected_release_month' and 'expected_release_quarter' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'original_release_date' field is set. + * @example ##WRONG TYPE## + */ + expected_release_year?: string; + /** + * @description For use in single item api call for game. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the game. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the game. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Name of the game. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description Number of user reviews of the game on Giant Bomb. + * @example ##WRONG TYPE## + */ + number_of_user_reviews?: string; + /** + * @description Rating of the first release of the game. + * @example ##WRONG TYPE## + */ + original_game_rating?: string; + /** + * @description Date the game was first released. + * @example ##WRONG TYPE## + */ + original_release_date?: string; + /** + * @description The platforms the game exists on. + * @example ##WRONG TYPE## + */ + platforms?: string; + /** + * @description URL pointing to the game on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Game.Detail': components['schemas']['Game'] & { + /** + * @description Characters related to the game. + * @example ##WRONG TYPE## + */ + characters?: string; + /** + * @description Concepts related to the game. + * @example ##WRONG TYPE## + */ + concepts?: string; + /** + * @description Companies who developed the game. + * @example ##WRONG TYPE## + */ + developers?: string; + /** + * @description Game DLCs + * @example ##WRONG TYPE## + */ + dlcs?: string; + /** + * @description Characters that first appeared in the game. + * @example ##WRONG TYPE## + */ + first_appearance_characters?: string; + /** + * @description Concepts that first appeared in the game. + * @example ##WRONG TYPE## + */ + first_appearance_concepts?: string; + /** + * @description Locations that first appeared in the game. + * @example ##WRONG TYPE## + */ + first_appearance_locations?: string; + /** + * @description Objects that first appeared in the game. + * @example ##WRONG TYPE## + */ + first_appearance_objects?: string; + /** + * @description People that were first credited in the game. + * @example ##WRONG TYPE## + */ + first_appearance_people?: string; + /** + * @description Franchises related to the game. + * @example ##WRONG TYPE## + */ + franchises?: string; + /** + * @description Genres that encompass the game. + * @example ##WRONG TYPE## + */ + genres?: string; + /** + * @description List of images associated to the game. + * @example ##WRONG TYPE## + */ + images?: string; + /** + * @description Characters killed in the game. + * @example ##WRONG TYPE## + */ + killed_characters?: string; + /** + * @description Locations related to the game. + * @example ##WRONG TYPE## + */ + locations?: string; + /** + * @description Objects related to the game. + * @example ##WRONG TYPE## + */ + objects?: string; + /** + * @description People who have worked with the game. + * @example ##WRONG TYPE## + */ + people?: string; + /** + * @description Companies who published the game. + * @example ##WRONG TYPE## + */ + publishers?: string; + /** + * @description Releases of the game. + * @example ##WRONG TYPE## + */ + releases?: string; + /** + * @description Staff reviews of the game. + * @example ##WRONG TYPE## + */ + reviews?: string; + /** + * @description Other games similar to the game. + * @example ##WRONG TYPE## + */ + similar_games?: string; + /** + * @description Themes that encompass the game. + * @example ##WRONG TYPE## + */ + themes?: string; + /** + * @description Videos associated to the game. + * @example ##WRONG TYPE## + */ + videos?: string; + }; + /** @description ##ENTER## */ + GameId: number; + /** @description ##ENTER## */ + GameRating: { + /** + * @description URL pointing to the game_rating detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description For use in single item api call for game_rating. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the game_rating. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the game_rating. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description Name of the game_rating. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description Rating board that issues this game_rating. + * @example ##WRONG TYPE## + */ + rating_board?: string; + }; + 'GameRating.Detail': components['schemas']['GameRating'] & unknown; + /** @description ##ENTER## */ + Genre: { + /** + * @description URL pointing to the genre detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the genre was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the genre was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the genre. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the genre. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description For use in single item api call for genre. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the genre. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the genre. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description Name of the genre. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the genre on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Genre.Detail': components['schemas']['Genre'] & unknown; + GetAllSavedTime: { + /** @description ##ENTER## */ + savedTimes?: { + /** + * @description Time/date the progress was saved + * @example ##WRONG TYPE## + */ + savedOn?: string; + /** + * @description Saved time for this video + * @example ##WRONG TYPE## + */ + savedTime?: string; + /** + * @description Id of the video + * @example ##WRONG TYPE## + */ + videoId?: string; + }[]; + /** @description ##ENTER## */ + success?: number; + }; + /** @description ##ENTER## */ + GetSavedTime: { + /** + * @description Saved time of the video or -1 if no time is saved for this user + * @example ##WRONG TYPE## + */ + savedTime?: string; + /** @description ##ENTER## */ + success?: number; + }; + /** @description ##ENTER## */ + Image: { + /** + * @description URL to the icon version of the image. + * @example ##WRONG TYPE## + */ + icon_url?: string; + /** + * @description Name of image tag for filerting images. + * @example ##WRONG TYPE## + */ + image_tag?: string; + /** + * @description URL to the medium size of the image. + * @example ##WRONG TYPE## + */ + medium_url?: string; + /** + * @description URL to the original image. + * @example ##WRONG TYPE## + */ + original_url?: string; + /** + * @description URL to the large screenshot version of the image. + * @example ##WRONG TYPE## + */ + screen_large_url?: string; + /** + * @description URL to the screenshot version of the image. + * @example ##WRONG TYPE## + */ + screen_url?: string; + /** + * @description URL to the small version of the image. + * @example ##WRONG TYPE## + */ + small_url?: string; + /** + * @description URL to the super sized version of the image. + * @example ##WRONG TYPE## + */ + super_url?: string; + /** + * @description URL to the thumb-sized version of the image. + * @example ##WRONG TYPE## + */ + thumb_url?: string; + /** + * @description URL to the tiny version of the image. + * @example ##WRONG TYPE## + */ + tiny_url?: string; + }; + InvalidAPIKey: components['schemas']['Response'] & { + /** @enum {unknown} */ + error?: 'Invalid API Key'; + /** @enum {unknown} */ + results?: never[]; + /** @enum {unknown} */ + status_code?: 100; + }; + /** @description ##ENTER## */ + Limit: number; + /** @description ##ENTER## */ + Location: { + /** + * @description List of aliases the location is known by. A \n (newline) seperates each alias. + * @example ##WRONG TYPE## + */ + aliases?: string; + /** + * @description URL pointing to the location detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the location was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the location was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the location. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the location. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description Game where the location made its first appearance. + * @example ##WRONG TYPE## + */ + first_appeared_in_game?: string; + /** + * @description For use in single item api call for location. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the location. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the location. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Name of the location. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the location on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Location.Detail': components['schemas']['Location'] & unknown; + /** @description ##ENTER## */ + Object: { + /** + * @description List of aliases the object is known by. A \n (newline) seperates each alias. + * @example ##WRONG TYPE## + */ + aliases?: string; + /** + * @description URL pointing to the object detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the object was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the object was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the object. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the object. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description Game where the object made its first appearance. + * @example ##WRONG TYPE## + */ + first_appeared_in_game?: string; + /** + * @description For use in single item api call for object. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the object. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the object. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Name of the object. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the object on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Object.Detail': components['schemas']['Object'] & { + /** + * @description Characters related to the object. + * @example ##WRONG TYPE## + */ + characters?: string; + /** + * @description Companies related to the object. + * @example ##WRONG TYPE## + */ + companies?: string; + /** + * @description Concepts related to the object. + * @example ##WRONG TYPE## + */ + concepts?: string; + /** + * @description Franchises related to the object. + * @example ##WRONG TYPE## + */ + franchises?: string; + /** + * @description Games the object has appeared in. + * @example ##WRONG TYPE## + */ + games?: string; + /** + * @description Locations related to the object. + * @example ##WRONG TYPE## + */ + locations?: string; + /** + * @description Objects related to the object. + * @example ##WRONG TYPE## + */ + objects?: string; + /** + * @description People who have worked with the object. + * @example ##WRONG TYPE## + */ + people?: string; + }; + /** @description ##ENTER## */ + Offset: number; + /** @description ##ENTER## */ + Page: number; + /** @description ##ENTER## */ + Person: { + /** + * @description List of aliases the person is known by. A \n (newline) seperates each alias. + * @example ##WRONG TYPE## + */ + aliases?: string; + /** + * @description URL pointing to the person detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the person was born. + * @example ##WRONG TYPE## + */ + birth_date?: string; + /** + * @description Country the person resides in. + * @example ##WRONG TYPE## + */ + country?: string; + /** + * @description Date the person was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the person was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Date the person died. + * @example ##WRONG TYPE## + */ + death_date?: string; + /** + * @description Brief summary of the person. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the person. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description Game the person was first credited. + * @example ##WRONG TYPE## + */ + first_credited_game?: string; + /** + * @description Gender of the person. Available options are: Male, Female, Other + * @example ##WRONG TYPE## + */ + gender?: string; + /** + * @description For use in single item api call for person. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description City or town the person resides in. + * @example ##WRONG TYPE## + */ + hometown?: string; + /** + * @description Unique ID of the person. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the person. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Name of the person. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the person on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Person.Detail': components['schemas']['Person'] & { + /** + * @description Characters related to the person. + * @example ##WRONG TYPE## + */ + characters?: string; + /** + * @description Concepts related to the person. + * @example ##WRONG TYPE## + */ + concepts?: string; + /** + * @description Franchises related to the person. + * @example ##WRONG TYPE## + */ + franchises?: string; + /** + * @description Games the person has appeared in. + * @example ##WRONG TYPE## + */ + games?: string; + /** + * @description Locations related to the person. + * @example ##WRONG TYPE## + */ + locations?: string; + /** + * @description Objects related to the person. + * @example ##WRONG TYPE## + */ + objects?: string; + /** + * @description People who have worked with the person. + * @example ##WRONG TYPE## + */ + people?: string; + }; + /** @description ##ENTER## */ + Platform: { + /** + * @description Abbreviation of the platform. + * @example ##WRONG TYPE## + */ + abbreviation?: string; + /** + * @description URL pointing to the platform detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Company that created the platform. + * @example ##WRONG TYPE## + */ + company?: string; + /** + * @description Date the platform was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the platform was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the platform. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the platform. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description For use in single item api call for platform. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the platform. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the platform. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description List of image tags to filter the images endpoint. + * @example ##WRONG TYPE## + */ + image_tags?: string; + /** + * @description Approximate number of sold hardware units. + * @example ##WRONG TYPE## + */ + install_base?: string; + /** + * @description Name of the platform. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description Flag indicating whether the platform has online capabilities. + * @example ##WRONG TYPE## + */ + online_support?: string; + /** + * @description Initial price point of the platform. + * @example ##WRONG TYPE## + */ + original_price?: string; + /** + * @description Date of the platform. + * @example ##WRONG TYPE## + */ + release_date?: string; + /** + * @description URL pointing to the platform on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Platform.Detail': components['schemas']['Platform'] & unknown; + /** @description ##ENTER## */ + PlatformId: number; + /** @description ##ENTER## */ + Promo: { + /** + * @description URL pointing to the promo detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the promo was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Brief summary of the promo. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description For use in single item api call for promo. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the promo. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the promo. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description The link that promo points to. + * @example ##WRONG TYPE## + */ + link?: string; + /** + * @description Name of the promo. + * @example ##WRONG TYPE## + */ + name?: string; + resource_type?: components['schemas']['ResourceType'] & unknown; + /** + * @description Author of the promo. + * @example ##WRONG TYPE## + */ + user?: string; + }; + 'Promo.Detail': components['schemas']['Promo'] & unknown; + /** @description ##ENTER## */ + Query: string; + /** @description ##ENTER## */ + RatingBoard: { + /** + * @description URL pointing to the rating_board detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the rating_board was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the rating_board was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the rating_board. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the rating_board. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description For use in single item api call for rating_board. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the rating_board. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the rating_board. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description Name of the rating_board. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the rating_board on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'RatingBoard.Detail': components['schemas']['RatingBoard'] & { + /** + * @description Region the rating_board is responsible for. + * @example ##WRONG TYPE## + */ + region?: string; + }; + /** @description ##ENTER## */ + Region: { + /** + * @description URL pointing to the region detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the region was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the region was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the region. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the region. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description For use in single item api call for region. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the region. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the region. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description Name of the region. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the region on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Region.Detail': components['schemas']['Region'] & { + /** + * @description region in the region. + * @example ##WRONG TYPE## + */ + rating_boards?: string; + }; + /** @description ##ENTER## */ + Release: { + /** + * @description URL pointing to the release detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the release was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the release was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the release. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the release. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description "Expected day of release. The day is represented numerically. Combine with 'expected_release_month', 'expected_release_year' and 'expected_release_quarter' for Giant Bomb's best guess release date of the release. These fields will be empty if the 'release_date' field is set." + * @example ##WRONG TYPE## + */ + expected_release_day?: string; + /** + * @description "Expected month of release. The month is represented numerically. Combine with 'expected_release_day', expected_release_quarter' and 'expected_release_year' for Giant Bomb's best guess release date of the release. These fields will be empty if the 'release_date' field is set." + * @example ##WRONG TYPE## + */ + expected_release_month?: string; + /** + * @description Expected quarter of release. The quarter is represented numerically, where 1 = Q1, 2 = Q2, 3 = Q3, and 4 = Q4. Combine with 'expected_release_day', 'expected_release_month' and 'expected_release_year' for Giant Bomb's best guess release date of the release. These fields will be empty if the 'release_date' field is set. + * @example ##WRONG TYPE## + */ + expected_release_quarter?: string; + /** + * @description Expected year of release. Combine with 'expected_release_day', 'expected_release_month' and 'expected_release_quarter' for Giant Bomb's best guess release date of the game. These fields will be empty if the 'release_date' field is set. + * @example ##WRONG TYPE## + */ + expected_release_year?: string; + /** + * @description Game the release is for. + * @example ##WRONG TYPE## + */ + game?: string; + /** + * @description Rating of the release. + * @example ##WRONG TYPE## + */ + game_rating?: string; + /** + * @description For use in single item api call for release. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the release. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the release. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description Maximum players + * @example ##WRONG TYPE## + */ + maximum_players?: string; + /** + * @description Minimum players + * @example ##WRONG TYPE## + */ + minimum_players?: string; + /** + * @description Multiplayer features + * @example ##WRONG TYPE## + */ + multiplayer_features?: string; + /** + * @description Name of the release. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description The release's platform. + * @example ##WRONG TYPE## + */ + platform?: string; + /** + * @description The type of product code the release has (ex. UPC/A, ISBN-10, EAN-13). + * @example ##WRONG TYPE## + */ + product_code_type?: string; + /** + * @description The release's product code. + * @example ##WRONG TYPE## + */ + product_code_value?: string; + /** + * @description Region the release is responsible for. + * @example ##WRONG TYPE## + */ + region?: string; + /** + * @description Date of the release. + * @example ##WRONG TYPE## + */ + release_date?: string; + /** + * @description Resolutions available + * @example ##WRONG TYPE## + */ + resolutions?: string; + /** + * @description Singleplayer features + * @example ##WRONG TYPE## + */ + singleplayer_features?: string; + /** + * @description URL pointing to the release on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + /** + * @description Sound systems + * @example ##WRONG TYPE## + */ + sound_systems?: string; + /** + * @description Widescreen support + * @example ##WRONG TYPE## + */ + widescreen_support?: string; + }; + 'Release.Detail': components['schemas']['Release'] & { + /** + * @description Companies who developed the release. + * @example ##WRONG TYPE## + */ + developers?: string; + /** + * @description Companies who published the release. + * @example ##WRONG TYPE## + */ + publishers?: string; + }; + /** + * @description ##ENTER## + * @enum {string} + */ + ResourceType: 'game' | 'franchise' | 'character' | 'concept' | 'object' | 'location' | 'person' | 'company' | 'video'; + /** @description ##ENTER## */ + Response: { + /** @description A text string representing the status_code */ + error?: string; + /** @description The value of the limit filter specified, or 100 if not specified */ + limit?: number; + /** @description The number of results on this page */ + number_of_page_results?: number; + /** @description The number of total results matching the filter conditions specified */ + number_of_total_results?: number; + /** @description The value of the offset filter specified, or 0 if not specified */ + offset?: number; + /** @description Zero or more items that match the filters specified */ + results?: string; + /** @description An integer indicating the result of the request. Acceptable values are:
1:OK
100:Invalid API Key
101:Object Not Found
102:Error in URL Format
103:'jsonp' format requires a 'json_callback' argument
104:Filter Error
105:Subscriber only video is for subscribers only */ + status_code?: number; + }; + /** @description ##ENTER## */ + Review: { + /** + * @description URL pointing to the review detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Brief summary of the review. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the review. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description Name of the Downloadable Content package. + * @example ##WRONG TYPE## + */ + dlc_name?: string; + /** + * @description Game the review is for. + * @example ##WRONG TYPE## + */ + game?: string; + /** + * @description For use in single item api call for review. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the review. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Date the review was published on Giant Bomb. + * @example ##WRONG TYPE## + */ + publish_date?: string; + /** + * @description Release of game for review. + * @example ##WRONG TYPE## + */ + release?: string; + /** + * @description Name of the review's author. + * @example ##WRONG TYPE## + */ + reviewer?: string; + /** + * @description The score given to the game on a scale of 1 to 5. + * @example ##WRONG TYPE## + */ + score?: string; + /** + * @description URL pointing to the review on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Review.Detail': components['schemas']['Review'] & { + /** + * @description Platforms the review appeared in. + * @example ##WRONG TYPE## + */ + platforms?: string; + }; + /** @description ##ENTER## */ + SaveTime: { + /** @description ##ENTER## */ + message?: string; + /** @description ##ENTER## */ + success?: boolean; + }; + Search: ( + | components['schemas']['Game'] + | components['schemas']['Franchise'] + | components['schemas']['Character'] + | components['schemas']['Concept'] + | components['schemas']['Object'] + | components['schemas']['Location'] + | components['schemas']['Person'] + | components['schemas']['Company'] + | components['schemas']['Video'] + ) & { + resource_type?: components['schemas']['ResourceType'] & unknown; + }; + /** @description ##ENTER## */ + Sort: string; + /** @description ##ENTER## */ + SubscriberOnly: boolean; + /** @description ##ENTER## */ + Theme: { + /** + * @description URL pointing to the theme detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description For use in single item api call for theme. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the theme. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Name of the theme. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the theme on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'Theme.Detail': components['schemas']['Theme'] & unknown; + /** @description ##ENTER## */ + TimeToSave: number; + /** @description ##ENTER## */ + Type: { + /** + * @description The name of the type's detail resource. + * @example ##WRONG TYPE## + */ + detail_resource_name?: string; + /** + * @description Unique ID of the type. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description The name of the type's list resource. + * @example ##WRONG TYPE## + */ + list_resource_name?: string; + }; + /** @description ##ENTER## */ + UserReview: { + /** + * @description URL pointing to the user_review detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Date the user_review was added to Giant Bomb. + * @example ##WRONG TYPE## + */ + date_added?: string; + /** + * @description Date the user_review was last updated on Giant Bomb. + * @example ##WRONG TYPE## + */ + date_last_updated?: string; + /** + * @description Brief summary of the user_review. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Description of the user_review. + * @example ##WRONG TYPE## + */ + description?: string; + /** + * @description DLC being reviewed. + * @example ##WRONG TYPE## + */ + dlc?: string; + /** + * @description Game being reviewd. + * @example ##WRONG TYPE## + */ + game?: string; + /** + * @description For use in single item api call for user_review. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the user_review. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Release being reviewed. + * @example ##WRONG TYPE## + */ + release?: string; + /** + * @description Name of the review's author. + * @example ##WRONG TYPE## + */ + reviewer?: string; + /** + * @description The score given to the game on a scale of 1 to 5. + * @example ##WRONG TYPE## + */ + score?: string; + /** + * @description URL pointing to the user_review on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'UserReview.Detail': components['schemas']['UserReview'] & unknown; + /** @description ##ENTER## */ + Video: { + /** + * @description URL pointing to the video detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Related objects to the video. + * @example ##WRONG TYPE## + */ + associations?: string; + /** + * @description Brief summary of the video. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description URL for video embed player. To be inserted into an iFrame.
You can add ?autoplay=true to auto-play.
You can add ?time=x where 'x' is an integer between 0 and the length of the video in seconds to start the video at that point.
You can add ?vol=x where 'x' is a decimal between 0 and 1, .75 for example, to set the starting volume.
The above three parameters may be used together. Example: ?time=45&vol=.5&autoplay=true
See http://www.giantbomb.com/api/video-embed-sample/ for more information on using the embed player. + * @example ##WRONG TYPE## + */ + embed_player?: string; + /** + * @description For use in single item api call for video. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description URL to the HD version of the video. + * @example ##WRONG TYPE## + */ + hd_url?: string; + /** + * @description URL to the High Res version of the video. + * @example ##WRONG TYPE## + */ + high_url?: string; + /** + * @description Unique ID of the video. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the video. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description Length (in seconds) of the video. + * @example ##WRONG TYPE## + */ + length_seconds?: string; + /** + * @description URL to the Low Res version of the video. + * @example ##WRONG TYPE## + */ + low_url?: string; + /** + * @description Name of the video. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description Premium status of video. + * @example ##WRONG TYPE## + */ + premium?: string; + /** + * @description Date the video was published on Giant Bomb. + * @example ##WRONG TYPE## + */ + publish_date?: string; + /** + * @description The time where the user left off watching this video + * @example ##WRONG TYPE## + */ + saved_time?: string; + /** + * @description URL pointing to the video on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + /** + * @description The video's filename. + * @example ##WRONG TYPE## + */ + url?: string; + /** + * @description Author of the video. + * @example ##WRONG TYPE## + */ + user?: string; + /** + * @description Video categories + * @example ##WRONG TYPE## + */ + video_categories?: string; + /** + * @description Video show + * @example ##WRONG TYPE## + */ + video_show?: string; + /** + * @description Video category + * @example ##WRONG TYPE## + */ + video_type?: string; + /** + * @description Youtube ID for the video. + * @example ##WRONG TYPE## + */ + youtube_id?: string; + }; + 'Video.Detail': components['schemas']['Video'] & { + /** + * @description Crew of the video. + * @example ##WRONG TYPE## + */ + crew?: string; + /** + * @description Hosts of the video. + * @example ##WRONG TYPE## + */ + hosts?: string; + }; + /** @description ##ENTER## */ + VideoCategory: { + /** + * @description URL pointing to the video_category detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Brief summary of the video_category. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Unique ID of the video_category. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the video_category. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description Name of the video_category. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the video_category on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'VideoCategory.Detail': components['schemas']['VideoCategory'] & unknown; + /** @description ##ENTER## */ + VideoId: number; + /** @description ##ENTER## */ + VideoShow: { + /** + * @description Is this show currently active + * @example ##WRONG TYPE## + */ + active?: string; + /** + * @description URL pointing to the video_show detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Endpoint to retrieve the videos attached to this video_show. + * @example ##WRONG TYPE## + */ + api_videos_url?: string; + /** + * @description Brief summary of the video_show. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Should this show be displayed in navigation menus + * @example ##WRONG TYPE## + */ + display_nav?: string; + /** + * @description For use in single item api call for video_show. + * @example ##WRONG TYPE## + */ + guid?: string; + /** + * @description Unique ID of the video_show. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Main image of the video_show. + * @example ##WRONG TYPE## + */ + image?: string; + /** + * @description The latest episode of a video show. Overrides other sorts when used as a sort field. + * @example ##WRONG TYPE## + */ + latest?: string; + /** + * @description Show logo. + * @example ##WRONG TYPE## + */ + logo?: string; + /** + * @description Editor ordering. + * @example ##WRONG TYPE## + */ + position?: string; + /** + * @description Premium status of video_show. + * @example ##WRONG TYPE## + */ + premium?: string; + /** + * @description URL pointing to the video_show on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + /** + * @description Title of the video_show. + * @example ##WRONG TYPE## + */ + title?: string; + }; + 'VideoShow.Detail': components['schemas']['VideoShow'] & unknown; + /** @description ##ENTER## */ + VideoType: { + /** + * @description URL pointing to the video_type detail resource. + * @example ##WRONG TYPE## + */ + api_detail_url?: string; + /** + * @description Brief summary of the video_type. + * @example ##WRONG TYPE## + */ + deck?: string; + /** + * @description Unique ID of the video_type. + * @example ##WRONG TYPE## + */ + id?: string; + /** + * @description Name of the video_type. + * @example ##WRONG TYPE## + */ + name?: string; + /** + * @description URL pointing to the video_type on Giant Bomb. + * @example ##WRONG TYPE## + */ + site_detail_url?: string; + }; + 'VideoType.Detail': components['schemas']['VideoType'] & unknown; + }; + responses: { + /** @description ##ENTER## */ + InvalidAPIKey: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['InvalidAPIKey']; + 'application/jsonp': components['schemas']['InvalidAPIKey']; + 'application/xml': components['schemas']['InvalidAPIKey']; + }; + }; + }; + parameters: { + FieldList: components['schemas']['FieldList']; + /** @description The result can be filtered by the marked fields in the Fields section below.

Single filter: &filter=field:value
Multiple filters: &filter=field:value,field:value
Date filters: &filter=field:start value|end value (using datetime format) */ + Filter: components['schemas']['Filter']; + /** @description The data format of the response takes either xml, json, or jsonp. */ + Format: components['schemas']['Format']; + /** @description Filter by the ID field on the game resource. */ + Game: components['schemas']['GameId']; + /** @description The number of results to display per page. This value defaults to 100 and can not exceed this number. */ + Limit: components['schemas']['Limit']; + /** @description Return results starting with the object at the offset specified. */ + Offset: components['schemas']['Offset']; + /** @description Page number of search results. */ + Page: components['schemas']['Page']; + /** @description Filters results by platform. The value passed to this filter should be the ID of the platform to filter results by. */ + Platforms: components['schemas']['PlatformId']; + /** @description The search string. */ + Query: components['schemas']['Query']; + /** @description List of resources to filter results. This filter can accept multiple arguments, each delimited with a ",". Available options are:
game
franchise
character
concept
object
location
person
company
video */ + Resources: components['schemas']['ResourceType'][]; + /** @description The result set can be sorted by the marked fields in the Fields section below. Format: &sort=field:direction where direction is either asc or desc. */ + Sort: components['schemas']['Sort']; + /** @description ##ENTER## */ + SubscriberOnly: components['schemas']['SubscriberOnly']; + /** @description The number of seconds into the video the current user is */ + TimeToSave: components['schemas']['TimeToSave']; + /** @description Id of the video */ + VideoId: components['schemas']['VideoId']; + }; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export type operations = Record; diff --git a/src/api/schemas/MALAPI.ts b/src/api/schemas/MALAPI.ts new file mode 100644 index 0000000..7c047f6 --- /dev/null +++ b/src/api/schemas/MALAPI.ts @@ -0,0 +1,6761 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + '/anime/{id}/full': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeFullById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/characters': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeCharacters']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/staff': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeStaff']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/episodes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeEpisodes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/episodes/{episode}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeEpisodeById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/news': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeNews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/forum': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeForum']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/videos': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeVideos']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/videos/episodes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeVideosEpisodes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/pictures': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimePictures']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/statistics': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeStatistics']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/moreinfo': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeMoreInfo']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/recommendations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeRecommendations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/userupdates': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeUserUpdates']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/reviews': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeReviews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/relations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeRelations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/themes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeThemes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/external': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeExternal']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime/{id}/streaming': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeStreaming']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/characters/{id}/full': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getCharacterFullById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/characters/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getCharacterById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/characters/{id}/anime': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getCharacterAnime']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/characters/{id}/manga': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getCharacterManga']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/characters/{id}/voices': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getCharacterVoiceActors']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/characters/{id}/pictures': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getCharacterPictures']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/clubs/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getClubsById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/clubs/{id}/members': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getClubMembers']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/clubs/{id}/staff': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getClubStaff']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/clubs/{id}/relations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getClubRelations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/genres/anime': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeGenres']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/genres/manga': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaGenres']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/magazines': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMagazines']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/full': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaFullById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/characters': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaCharacters']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/news': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaNews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/forum': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaTopics']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/pictures': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaPictures']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/statistics': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaStatistics']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/moreinfo': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaMoreInfo']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/recommendations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaRecommendations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/userupdates': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaUserUpdates']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/reviews': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaReviews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/relations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaRelations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga/{id}/external': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaExternal']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/people/{id}/full': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getPersonFullById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/people/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getPersonById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/people/{id}/anime': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getPersonAnime']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/people/{id}/voices': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getPersonVoices']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/people/{id}/manga': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getPersonManga']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/people/{id}/pictures': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getPersonPictures']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/producers/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getProducerById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/producers/{id}/full': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getProducerFullById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/producers/{id}/external': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getProducerExternal']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/random/anime': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRandomAnime']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/random/manga': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRandomManga']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/random/characters': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRandomCharacters']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/random/people': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRandomPeople']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/random/users': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRandomUsers']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/recommendations/anime': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRecentAnimeRecommendations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/recommendations/manga': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRecentMangaRecommendations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/reviews/anime': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRecentAnimeReviews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/reviews/manga': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getRecentMangaReviews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/schedules': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getSchedules']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/anime': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getAnimeSearch']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/manga': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getMangaSearch']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/people': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getPeopleSearch']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/characters': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getCharactersSearch']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUsersSearch']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/userbyid/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserById']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/clubs': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getClubsSearch']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/producers': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getProducers']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/seasons/now': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getSeasonNow']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/seasons/{year}/{season}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getSeason']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/seasons': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getSeasonsList']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/seasons/upcoming': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getSeasonUpcoming']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/top/anime': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getTopAnime']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/top/manga': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getTopManga']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/top/people': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getTopPeople']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/top/characters': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getTopCharacters']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/top/reviews': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getTopReviews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/full': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserFullProfile']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserProfile']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/statistics': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserStatistics']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/favorites': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserFavorites']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/userupdates': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserUpdates']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/about': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserAbout']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/history': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserHistory']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/friends': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserFriends']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/animelist': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * @deprecated + * @description User Anime lists have been discontinued since May 1st, 2022. Read more + */ + get: operations['getUserAnimelist']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/mangalist': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * @deprecated + * @description User Manga lists have been discontinued since May 1st, 2022. Read more + */ + get: operations['getUserMangaList']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/reviews': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserReviews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/recommendations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserRecommendations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/clubs': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserClubs']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/users/{username}/external': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getUserExternal']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/watch/episodes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getWatchRecentEpisodes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/watch/episodes/popular': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getWatchPopularEpisodes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/watch/promos': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getWatchRecentPromos']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/watch/promos/popular': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['getWatchPopularPromos']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + /** + * @description User's anime list status filter options + * @enum {string} + */ + user_anime_list_status_filter: 'all' | 'watching' | 'completed' | 'onhold' | 'dropped' | 'plantowatch'; + /** + * @description Available Anime order_by properties + * @enum {string} + */ + anime_search_query_orderby: 'mal_id' | 'title' | 'start_date' | 'end_date' | 'episodes' | 'score' | 'scored_by' | 'rank' | 'popularity' | 'members' | 'favorites'; + /** + * @description Available Anime audience ratings

Ratings
  • G - All Ages
  • PG - Children
  • PG-13 - Teens 13 or older
  • R - 17+ (violence & profanity)
  • R+ - Mild Nudity
  • Rx - Hentai
+ * @enum {string} + */ + anime_search_query_rating: 'g' | 'pg' | 'pg13' | 'r17' | 'r' | 'rx'; + /** + * @description Available Anime statuses + * @enum {string} + */ + anime_search_query_status: 'airing' | 'complete' | 'upcoming'; + /** + * @description Available Anime types + * @enum {string} + */ + anime_search_query_type: 'tv' | 'movie' | 'ova' | 'special' | 'ona' | 'music' | 'cm' | 'pv' | 'tv_special'; + /** + * @description Available Character order_by properties + * @enum {string} + */ + characters_search_query_orderby: 'mal_id' | 'name' | 'favorites'; + /** + * @description Club Search Query Category + * @enum {string} + */ + club_search_query_category: + | 'anime' + | 'manga' + | 'actors_and_artists' + | 'characters' + | 'cities_and_neighborhoods' + | 'companies' + | 'conventions' + | 'games' + | 'japan' + | 'music' + | 'other' + | 'schools'; + /** + * @description Club Search Query OrderBy + * @enum {string} + */ + club_search_query_orderby: 'mal_id' | 'name' | 'members_count' | 'created'; + /** + * @description Club Search Query Type + * @enum {string} + */ + club_search_query_type: 'public' | 'private' | 'secret'; + /** + * @description Users Search Query Gender. + * @enum {string} + */ + users_search_query_gender: 'any' | 'male' | 'female' | 'nonbinary'; + /** + * @description Filter genres by type + * @enum {string} + */ + genre_query_filter: 'genres' | 'explicit_genres' | 'themes' | 'demographics'; + /** + * @description Order by magazine data + * @enum {string} + */ + magazines_query_orderby: 'mal_id' | 'name' | 'count'; + /** + * @description User's anime list status filter options + * @enum {string} + */ + user_manga_list_status_filter: 'all' | 'reading' | 'completed' | 'onhold' | 'dropped' | 'plantoread'; + /** + * @description Available Manga order_by properties + * @enum {string} + */ + manga_search_query_orderby: + | 'mal_id' + | 'title' + | 'start_date' + | 'end_date' + | 'chapters' + | 'volumes' + | 'score' + | 'scored_by' + | 'rank' + | 'popularity' + | 'members' + | 'favorites'; + /** + * @description Available Manga statuses + * @enum {string} + */ + manga_search_query_status: 'publishing' | 'complete' | 'hiatus' | 'discontinued' | 'upcoming'; + /** + * @description Available Manga types + * @enum {string} + */ + manga_search_query_type: 'manga' | 'novel' | 'lightnovel' | 'oneshot' | 'doujin' | 'manhwa' | 'manhua'; + /** + * @description Available People order_by properties + * @enum {string} + */ + people_search_query_orderby: 'mal_id' | 'name' | 'birthday' | 'favorites'; + /** + * @description Producers Search Query Order By + * @enum {string} + */ + producers_query_orderby: 'mal_id' | 'count' | 'favorites' | 'established'; + /** + * @description Search query sort direction + * @enum {string} + */ + search_query_sort: 'desc' | 'asc'; + /** + * @description Top items filter types + * @enum {string} + */ + top_anime_filter: 'airing' | 'upcoming' | 'bypopularity' | 'favorite'; + /** + * @description Top items filter types + * @enum {string} + */ + top_manga_filter: 'publishing' | 'upcoming' | 'bypopularity' | 'favorite'; + /** + * @description The type of reviews to filter by. Defaults to anime. + * @enum {string} + */ + top_reviews_type_enum: 'anime' | 'manga'; + /** @description Anime Episodes Resource */ + anime_episodes: { + data?: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL. This is the URL of the episode's video. If there is no video url, this will be null. */ + url?: string | null; + /** @description Title */ + title?: string; + /** @description Title Japanese */ + title_japanese?: string | null; + /** @description title_romanji */ + title_romanji?: string | null; + /** @description Aired Date ISO8601 */ + aired?: string | null; + /** @description Aggregated episode score (1.00 - 5.00) based on MyAnimeList user voting */ + score?: Record | null; + /** @description Filler episode */ + filler?: boolean; + /** @description Recap episode */ + recap?: boolean; + /** @description Episode discussion forum URL */ + forum_url?: string | null; + }[]; + } & components['schemas']['pagination']; + /** @description Anime News Resource */ + anime_news: components['schemas']['pagination'] & components['schemas']['news']; + /** @description Anime Videos Episodes Resource */ + anime_videos_episodes: { + data?: { + /** @description MyAnimeList ID or Episode Number */ + mal_id?: number; + /** @description Episode Title */ + title?: string; + /** @description Episode Subtitle */ + episode?: string; + /** @description Episode Page URL */ + url?: string; + images?: components['schemas']['common_images']; + }[]; + } & components['schemas']['pagination']; + /** @description Character Pictures */ + character_pictures: { + data?: { + /** @description Default JPG Image Size URL */ + image_url?: string | null; + /** @description Large JPG Image Size URL */ + large_image_url?: string | null; + }[]; + }; + /** @description Club Member */ + club_member: { + data?: { + /** @description User's username */ + username?: string; + /** @description User URL */ + url?: string; + images?: components['schemas']['user_images']; + }[]; + }; + /** @description Manga News Resource */ + manga_news: components['schemas']['pagination'] & components['schemas']['news']; + /** @description Manga Pictures */ + manga_pictures: { + data?: components['schemas']['manga_images'][]; + }; + /** @description Character Pictures */ + person_pictures: { + data?: components['schemas']['people_images'][]; + }; + /** @description Random Resources */ + random: { + data?: (components['schemas']['anime'] | components['schemas']['manga'] | components['schemas']['character'] | components['schemas']['person'])[]; + }; + /** @description Anime resources currently airing */ + schedules: { + data?: components['schemas']['anime'][]; + } & components['schemas']['pagination_plus']; + /** @description User Results */ + users_search: { + data?: { + /** @description MyAnimeList URL */ + url?: string; + /** @description MyAnimeList Username */ + username?: string; + images?: components['schemas']['user_images']; + /** @description Last Online Date ISO8601 */ + last_online?: string; + }[]; + } & components['schemas']['pagination']; + /** @description List of available seasons */ + seasons: { + data?: { + /** @description Year */ + year?: number; + /** @description List of available seasons */ + seasons?: string[]; + }[]; + }; + /** @description Anime & Manga Reviews Resource */ + reviews_collection: { + data?: (components['schemas']['anime_review'] | components['schemas']['manga_review'])[]; + }; + /** @description User Friends */ + user_friends: { + data?: ({ + user?: components['schemas']['user_meta']; + } & { + /** @description Last Online Date ISO8601 format */ + last_online?: string; + /** @description Friends Since Date ISO8601 format */ + friends_since?: string; + })[]; + } & components['schemas']['pagination']; + /** @description User Clubs */ + user_clubs: { + data?: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description Club Name */ + name?: string; + /** @description Club URL */ + url?: string; + }[]; + } & components['schemas']['pagination']; + /** @description Watch Episodes */ + watch_episodes: { + data?: { + entry?: components['schemas']['anime_meta']; + /** @description Recent Episodes (max 2 listed) */ + episodes?: { + /** @description MyAnimeList ID */ + mal_id?: string; + /** @description MyAnimeList URL */ + url?: string; + /** @description Episode Title */ + title?: string; + /** @description For MyAnimeList Premium Users */ + premium?: boolean; + }[]; + /** @description Region Locked Episode */ + region_locked?: boolean; + }[]; + } & components['schemas']['pagination']; + /** @description Watch Promos */ + watch_promos: components['schemas']['pagination'] & { + data?: { + /** @description Promo Title */ + title?: string; + entry?: components['schemas']['anime_meta']; + trailer?: components['schemas']['trailer']; + }[]; + }; + /** @description Anime Characters Resource */ + anime_characters: { + data?: { + /** @description Character details */ + character?: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['character_images']; + /** @description Character Name */ + name?: string; + }; + /** @description Character's Role */ + role?: string; + voice_actors?: { + person?: { + mal_id?: number; + url?: string; + images?: components['schemas']['people_images']; + name?: string; + }; + language?: string; + }[]; + }[]; + }; + /** @description Anime Collection Resource */ + anime_search: { + data?: components['schemas']['anime'][]; + } & components['schemas']['pagination_plus']; + /** @description Anime Episode Resource */ + anime_episode: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description Title */ + title?: string; + /** @description Title Japanese */ + title_japanese?: string | null; + /** @description title_romanji */ + title_romanji?: string | null; + /** @description Episode duration in seconds */ + duration?: number | null; + /** @description Aired Date ISO8601 */ + aired?: string | null; + /** @description Filler episode */ + filler?: boolean; + /** @description Recap episode */ + recap?: boolean; + /** @description Episode Synopsis */ + synopsis?: string | null; + }; + /** @description Full anime Resource */ + anime_full: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['anime_images']; + trailer?: components['schemas']['trailer_base']; + /** @description Whether the entry is pending approval on MAL or not */ + approved?: boolean; + /** @description All titles */ + titles?: components['schemas']['title'][]; + /** + * @deprecated + * @description Title + */ + title?: string; + /** + * @deprecated + * @description English Title + */ + title_english?: string | null; + /** + * @deprecated + * @description Japanese Title + */ + title_japanese?: string | null; + /** + * @deprecated + * @description Other Titles + */ + title_synonyms?: string[]; + /** + * @description Anime Type + * @enum {string|null} + */ + type?: 'TV' | 'OVA' | 'Movie' | 'Special' | 'ONA' | 'Music' | null; + /** @description Original Material/Source adapted from */ + source?: string | null; + /** @description Episode count */ + episodes?: number | null; + /** + * @description Airing status + * @enum {string|null} + */ + status?: 'Finished Airing' | 'Currently Airing' | 'Not yet aired' | null; + /** @description Airing boolean */ + airing?: boolean; + aired?: components['schemas']['daterange']; + /** @description Parsed raw duration */ + duration?: string | null; + /** + * @description Anime audience rating + * @enum {string|null} + */ + rating?: 'G - All Ages' | 'PG - Children' | 'PG-13 - Teens 13 or older' | 'R - 17+ (violence & profanity)' | 'R+ - Mild Nudity' | 'Rx - Hentai' | null; + /** + * Format: float + * @description Score + */ + score?: number | null; + /** @description Number of users */ + scored_by?: number | null; + /** @description Ranking */ + rank?: number | null; + /** @description Popularity */ + popularity?: number | null; + /** @description Number of users who have added this entry to their list */ + members?: number | null; + /** @description Number of users who have favorited this entry */ + favorites?: number | null; + /** @description Synopsis */ + synopsis?: string | null; + /** @description Background */ + background?: string | null; + /** + * @description Season + * @enum {string|null} + */ + season?: 'summer' | 'winter' | 'spring' | 'fall' | null; + /** @description Year */ + year?: number | null; + broadcast?: components['schemas']['broadcast']; + producers?: components['schemas']['mal_url'][]; + licensors?: components['schemas']['mal_url'][]; + studios?: components['schemas']['mal_url'][]; + genres?: components['schemas']['mal_url'][]; + explicit_genres?: components['schemas']['mal_url'][]; + themes?: components['schemas']['mal_url'][]; + demographics?: components['schemas']['mal_url'][]; + relations?: { + /** @description Relation type */ + relation?: string; + entry?: components['schemas']['mal_url'][]; + }[]; + theme?: { + openings?: string[]; + endings?: string[]; + }; + external?: { + name?: string; + url?: string; + }[]; + streaming?: { + name?: string; + url?: string; + }[]; + }; + /** @description Anime Relations */ + anime_relations: { + data?: { + /** @description Relation type */ + relation?: string; + entry?: components['schemas']['mal_url'][]; + }[]; + }; + /** @description Anime Resource */ + anime: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['anime_images']; + trailer?: components['schemas']['trailer_base']; + /** @description Whether the entry is pending approval on MAL or not */ + approved?: boolean; + /** @description All titles */ + titles?: components['schemas']['title'][]; + /** + * @deprecated + * @description Title + */ + title?: string; + /** + * @deprecated + * @description English Title + */ + title_english?: string | null; + /** + * @deprecated + * @description Japanese Title + */ + title_japanese?: string | null; + /** + * @deprecated + * @description Other Titles + */ + title_synonyms?: string[]; + /** + * @description Anime Type + * @enum {string|null} + */ + type?: 'TV' | 'OVA' | 'Movie' | 'Special' | 'ONA' | 'Music' | null; + /** @description Original Material/Source adapted from */ + source?: string | null; + /** @description Episode count */ + episodes?: number | null; + /** + * @description Airing status + * @enum {string|null} + */ + status?: 'Finished Airing' | 'Currently Airing' | 'Not yet aired' | null; + /** @description Airing boolean */ + airing?: boolean; + aired?: components['schemas']['daterange']; + /** @description Parsed raw duration */ + duration?: string | null; + /** + * @description Anime audience rating + * @enum {string|null} + */ + rating?: 'G - All Ages' | 'PG - Children' | 'PG-13 - Teens 13 or older' | 'R - 17+ (violence & profanity)' | 'R+ - Mild Nudity' | 'Rx - Hentai' | null; + /** + * Format: float + * @description Score + */ + score?: number | null; + /** @description Number of users */ + scored_by?: number | null; + /** @description Ranking */ + rank?: number | null; + /** @description Popularity */ + popularity?: number | null; + /** @description Number of users who have added this entry to their list */ + members?: number | null; + /** @description Number of users who have favorited this entry */ + favorites?: number | null; + /** @description Synopsis */ + synopsis?: string | null; + /** @description Background */ + background?: string | null; + /** + * @description Season + * @enum {string|null} + */ + season?: 'summer' | 'winter' | 'spring' | 'fall' | null; + /** @description Year */ + year?: number | null; + broadcast?: components['schemas']['broadcast']; + producers?: components['schemas']['mal_url'][]; + licensors?: components['schemas']['mal_url'][]; + studios?: components['schemas']['mal_url'][]; + genres?: components['schemas']['mal_url'][]; + explicit_genres?: components['schemas']['mal_url'][]; + themes?: components['schemas']['mal_url'][]; + demographics?: components['schemas']['mal_url'][]; + }; + /** @description Anime Staff Resource */ + anime_staff: { + data?: { + /** @description Person details */ + person?: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['people_images']; + /** @description Name */ + name?: string; + }; + /** @description Staff Positions */ + positions?: string[]; + }[]; + }; + /** @description Anime Statistics Resource */ + anime_statistics: { + data?: { + /** @description Number of users watching the resource */ + watching?: number; + /** @description Number of users who have completed the resource */ + completed?: number; + /** @description Number of users who have put the resource on hold */ + on_hold?: number; + /** @description Number of users who have dropped the resource */ + dropped?: number; + /** @description Number of users who have planned to watch the resource */ + plan_to_watch?: number; + /** @description Total number of users who have the resource added to their lists */ + total?: number; + scores?: { + /** @description Scoring value */ + score?: number; + /** @description Number of votes for this score */ + votes?: number; + /** + * Format: float + * @description Percentage of votes for this score + */ + percentage?: number; + }[]; + }; + }; + /** @description Anime Opening and Ending Themes */ + anime_themes: { + data?: { + openings?: string[]; + endings?: string[]; + }; + }; + /** @description Anime Videos Resource */ + anime_videos: { + data?: { + promo?: { + /** @description Title */ + title?: string; + trailer?: components['schemas']['trailer']; + }[]; + episodes?: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description Title */ + title?: string; + /** @description Episode */ + episode?: string; + images?: components['schemas']['common_images']; + }[]; + music_videos?: { + /** @description Title */ + title?: string; + video?: components['schemas']['trailer']; + meta?: { + title?: string | null; + author?: string | null; + }; + }[]; + }; + }; + /** @description Character casted in anime */ + character_anime: { + data?: { + /** @description Character's Role */ + role?: string; + anime?: components['schemas']['anime_meta']; + }[]; + }; + /** @description Characters Search Resource */ + characters_search: { + data?: components['schemas']['character'][]; + } & components['schemas']['pagination_plus']; + /** @description Character Resource */ + character_full: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['character_images']; + /** @description Name */ + name?: string; + /** @description Name */ + name_kanji?: string | null; + /** @description Other Names */ + nicknames?: string[]; + /** @description Number of users who have favorited this entry */ + favorites?: number; + /** @description Biography */ + about?: string | null; + anime?: { + /** @description Character's Role */ + role?: string; + anime?: components['schemas']['anime_meta']; + }[]; + manga?: { + /** @description Character's Role */ + role?: string; + manga?: components['schemas']['manga_meta']; + }[]; + voices?: { + /** @description Character's Role */ + language?: string; + person?: components['schemas']['person_meta']; + }[]; + }; + /** @description Character casted in manga */ + character_manga: { + data?: { + /** @description Character's Role */ + role?: string; + manga?: components['schemas']['manga_meta']; + }[]; + }; + /** @description Character Resource */ + character: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['character_images']; + /** @description Name */ + name?: string; + /** @description Name */ + name_kanji?: string | null; + /** @description Other Names */ + nicknames?: string[]; + /** @description Number of users who have favorited this entry */ + favorites?: number; + /** @description Biography */ + about?: string | null; + }; + /** @description Character voice actors */ + character_voice_actors: { + data?: { + /** @description Character's Role */ + language?: string; + person?: components['schemas']['person_meta']; + }[]; + }; + /** @description Clubs Search Resource */ + clubs_search: { + data?: components['schemas']['club'][]; + } & components['schemas']['pagination']; + /** @description Club Relations */ + club_relations: { + data?: { + anime?: components['schemas']['mal_url'][]; + manga?: components['schemas']['mal_url'][]; + characters?: components['schemas']['mal_url'][]; + }; + }; + /** @description Club Resource */ + club: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description Club name */ + name?: string; + /** @description Club URL */ + url?: string; + images?: components['schemas']['common_images']; + /** @description Number of club members */ + members?: number; + /** + * @description Club Category + * @enum {string} + */ + category?: + | 'actors & artists' + | 'anime' + | 'characters' + | 'cities & neighborhoods' + | 'companies' + | 'conventions' + | 'games' + | 'japan' + | 'manga' + | 'music' + | 'others' + | 'schools'; + /** @description Date Created ISO8601 */ + created?: string; + /** + * @description Club access + * @enum {string} + */ + access?: 'public' | 'private' | 'secret'; + }; + /** @description Club Staff Resource */ + club_staff: { + data?: { + /** @description User URL */ + url?: string; + /** @description User's username */ + username?: string; + }[]; + }; + /** @description Youtube Details */ + trailer: components['schemas']['trailer_base'] & components['schemas']['trailer_images']; + /** @description Youtube Details */ + trailer_base: { + /** @description YouTube ID */ + youtube_id?: string | null; + /** @description YouTube URL */ + url?: string | null; + /** @description Parsed Embed URL */ + embed_url?: string | null; + }; + /** @description Youtube Images */ + trailer_images: { + images?: { + /** @description Default Image Size URL (120x90) */ + image_url?: string | null; + /** @description Small Image Size URL (640x480) */ + small_image_url?: string | null; + /** @description Medium Image Size URL (320x180) */ + medium_image_url?: string | null; + /** @description Large Image Size URL (480x360) */ + large_image_url?: string | null; + /** @description Maximum Image Size URL (1280x720) */ + maximum_image_url?: string | null; + }; + }; + /** @description Date range */ + daterange: { + /** @description Date ISO8601 */ + from?: string | null; + /** @description Date ISO8601 */ + to?: string | null; + /** @description Date Prop */ + prop?: { + /** @description Date Prop From */ + from?: { + /** @description Day */ + day?: number | null; + /** @description Month */ + month?: number | null; + /** @description Year */ + year?: number | null; + }; + /** @description Date Prop To */ + to?: { + /** @description Day */ + day?: number | null; + /** @description Month */ + month?: number | null; + /** @description Year */ + year?: number | null; + }; + /** @description Raw parsed string */ + string?: string | null; + }; + }; + /** @description Broadcast Details */ + broadcast: { + /** @description Day of the week */ + day?: string | null; + /** @description Time in 24 hour format */ + time?: string | null; + /** @description Timezone (Tz Database format https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) */ + timezone?: string | null; + /** @description Raw parsed broadcast string */ + string?: string | null; + }; + /** @description Parsed URL Data */ + mal_url: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description Type of resource */ + type?: string; + /** @description Resource Name/Title */ + name?: string; + /** @description MyAnimeList URL */ + url?: string; + }; + /** @description Parsed URL Data */ + mal_url_2: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description Type of resource */ + type?: string; + /** @description Resource Name/Title */ + title?: string; + /** @description MyAnimeList URL */ + url?: string; + }; + /** @description Entry Meta data */ + entry_meta: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description Image URL */ + image_url?: string; + /** @description Entry Name/Title */ + name?: string; + }; + /** @description Related resources */ + relation: { + /** @description Relation type */ + relation?: string; + /** @description Related entries */ + entry?: components['schemas']['mal_url'][]; + }; + pagination: { + pagination?: { + last_visible_page?: number; + has_next_page?: boolean; + }; + }; + pagination_plus: { + pagination?: { + last_visible_page?: number; + has_next_page?: boolean; + current_page?: number; + items?: { + count?: number; + total?: number; + per_page?: number; + }; + }; + }; + user_meta: { + /** @description MyAnimeList Username */ + username?: string; + /** @description MyAnimeList Profile URL */ + url?: string; + images?: components['schemas']['user_images']; + }; + /** @description User Meta By ID */ + user_by_id: { + /** @description MyAnimeList URL */ + url?: string; + /** @description MyAnimeList Username */ + username?: string; + }; + user_images: { + /** @description Available images in JPG */ + jpg?: { + /** @description Image URL JPG */ + image_url?: string | null; + }; + /** @description Available images in WEBP */ + webp?: { + /** @description Image URL WEBP */ + image_url?: string | null; + }; + }; + anime_meta: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['anime_images']; + /** @description Entry title */ + title?: string; + }; + manga_meta: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['manga_images']; + /** @description Entry title */ + title?: string; + }; + character_meta: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['character_images']; + /** @description Entry name */ + name?: string; + }; + person_meta: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['people_images']; + /** @description Entry name */ + name?: string; + }; + anime_images: { + /** @description Available images in JPG */ + jpg?: { + /** @description Image URL JPG */ + image_url?: string | null; + /** @description Small Image URL JPG */ + small_image_url?: string | null; + /** @description Image URL JPG */ + large_image_url?: string | null; + }; + /** @description Available images in WEBP */ + webp?: { + /** @description Image URL WEBP */ + image_url?: string | null; + /** @description Small Image URL WEBP */ + small_image_url?: string | null; + /** @description Image URL WEBP */ + large_image_url?: string | null; + }; + }; + manga_images: { + /** @description Available images in JPG */ + jpg?: { + /** @description Image URL JPG */ + image_url?: string | null; + /** @description Small Image URL JPG */ + small_image_url?: string | null; + /** @description Image URL JPG */ + large_image_url?: string | null; + }; + /** @description Available images in WEBP */ + webp?: { + /** @description Image URL WEBP */ + image_url?: string | null; + /** @description Small Image URL WEBP */ + small_image_url?: string | null; + /** @description Image URL WEBP */ + large_image_url?: string | null; + }; + }; + character_images: { + /** @description Available images in JPG */ + jpg?: { + /** @description Image URL JPG */ + image_url?: string | null; + /** @description Small Image URL JPG */ + small_image_url?: string | null; + }; + /** @description Available images in WEBP */ + webp?: { + /** @description Image URL WEBP */ + image_url?: string | null; + /** @description Small Image URL WEBP */ + small_image_url?: string | null; + }; + }; + people_images: { + /** @description Available images in JPG */ + jpg?: { + /** @description Image URL JPG */ + image_url?: string | null; + }; + }; + common_images: { + /** @description Available images in JPG */ + jpg?: { + /** @description Image URL JPG */ + image_url?: string | null; + }; + }; + title: { + /** @description Title type */ + type?: string; + /** @description Title value */ + title?: string; + }; + /** @description External links */ + external_links: { + data?: { + name?: string; + url?: string; + }[]; + }; + /** @description Forum Resource */ + forum: { + data?: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description Title */ + title?: string; + /** @description Post Date ISO8601 */ + date?: string; + /** @description Author MyAnimeList Username */ + author_username?: string; + /** @description Author Profile URL */ + author_url?: string; + /** @description Comment count */ + comments?: number; + /** @description Last comment details */ + last_comment?: { + /** @description Last comment URL */ + url?: string; + /** @description Author MyAnimeList Username */ + author_username?: string; + /** @description Author Profile URL */ + author_url?: string; + /** @description Last comment date posted ISO8601 */ + date?: string | null; + }; + }[]; + }; + /** @description Genres Collection Resource */ + genres: { + data?: components['schemas']['genre'][]; + }; + /** @description Genre Resource */ + genre: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description Genre Name */ + name?: string; + /** @description MyAnimeList URL */ + url?: string; + /** @description Genre's entry count */ + count?: number; + }; + /** @description Magazine Collection Resource */ + magazines: { + data?: components['schemas']['magazine'][]; + } & components['schemas']['pagination']; + /** @description Magazine Resource */ + magazine: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description Magazine Name */ + name?: string; + /** @description MyAnimeList URL */ + url?: string; + /** @description Magazine's manga count */ + count?: number; + }; + /** @description Manga Characters Resource */ + manga_characters: { + data?: { + character?: components['schemas']['character_meta']; + /** @description Character's Role */ + role?: string; + }[]; + }; + /** @description Manga Search Resource */ + manga_search: { + data?: components['schemas']['manga'][]; + } & components['schemas']['pagination_plus']; + /** @description Manga Resource */ + manga_full: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['manga_images']; + /** @description Whether the entry is pending approval on MAL or not */ + approved?: boolean; + /** @description All Titles */ + titles?: components['schemas']['title'][]; + /** + * @deprecated + * @description Title + */ + title?: string; + /** + * @deprecated + * @description English Title + */ + title_english?: string | null; + /** + * @deprecated + * @description Japanese Title + */ + title_japanese?: string | null; + /** + * @deprecated + * @description Other Titles + */ + title_synonyms?: string[]; + /** + * @description Manga Type + * @enum {string|null} + */ + type?: 'Manga' | 'Novel' | 'Light Novel' | 'One-shot' | 'Doujinshi' | 'Manhua' | 'Manhwa' | 'OEL' | null; + /** @description Chapter count */ + chapters?: number | null; + /** @description Volume count */ + volumes?: number | null; + /** + * @description Publishing status + * @enum {string} + */ + status?: 'Finished' | 'Publishing' | 'On Hiatus' | 'Discontinued' | 'Not yet published'; + /** @description Publishing boolean */ + publishing?: boolean; + published?: components['schemas']['daterange']; + /** + * Format: float + * @description Score + */ + score?: number | null; + /** @description Number of users */ + scored_by?: number | null; + /** @description Ranking */ + rank?: number | null; + /** @description Popularity */ + popularity?: number | null; + /** @description Number of users who have added this entry to their list */ + members?: number | null; + /** @description Number of users who have favorited this entry */ + favorites?: number | null; + /** @description Synopsis */ + synopsis?: string | null; + /** @description Background */ + background?: string | null; + authors?: components['schemas']['mal_url'][]; + serializations?: components['schemas']['mal_url'][]; + genres?: components['schemas']['mal_url'][]; + explicit_genres?: components['schemas']['mal_url'][]; + themes?: components['schemas']['mal_url'][]; + demographics?: components['schemas']['mal_url'][]; + relations?: { + /** @description Relation type */ + relation?: string; + entry?: components['schemas']['mal_url'][]; + }[]; + external?: { + name?: string; + url?: string; + }[]; + }; + /** @description Manga Resource */ + manga: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['manga_images']; + /** @description Whether the entry is pending approval on MAL or not */ + approved?: boolean; + /** @description All Titles */ + titles?: components['schemas']['title'][]; + /** + * @deprecated + * @description Title + */ + title?: string; + /** + * @deprecated + * @description English Title + */ + title_english?: string | null; + /** + * @deprecated + * @description Japanese Title + */ + title_japanese?: string | null; + /** + * @description Manga Type + * @enum {string|null} + */ + type?: 'Manga' | 'Novel' | 'Light Novel' | 'One-shot' | 'Doujinshi' | 'Manhua' | 'Manhwa' | 'OEL' | null; + /** @description Chapter count */ + chapters?: number | null; + /** @description Volume count */ + volumes?: number | null; + /** + * @description Publishing status + * @enum {string} + */ + status?: 'Finished' | 'Publishing' | 'On Hiatus' | 'Discontinued' | 'Not yet published'; + /** @description Publishing boolean */ + publishing?: boolean; + published?: components['schemas']['daterange']; + /** + * Format: float + * @description Score + */ + score?: number | null; + /** @description Number of users */ + scored_by?: number | null; + /** @description Ranking */ + rank?: number | null; + /** @description Popularity */ + popularity?: number | null; + /** @description Number of users who have added this entry to their list */ + members?: number | null; + /** @description Number of users who have favorited this entry */ + favorites?: number | null; + /** @description Synopsis */ + synopsis?: string | null; + /** @description Background */ + background?: string | null; + authors?: components['schemas']['mal_url'][]; + serializations?: components['schemas']['mal_url'][]; + genres?: components['schemas']['mal_url'][]; + explicit_genres?: components['schemas']['mal_url'][]; + themes?: components['schemas']['mal_url'][]; + demographics?: components['schemas']['mal_url'][]; + }; + /** @description Manga Statistics Resource */ + manga_statistics: { + data?: { + /** @description Number of users reading the resource */ + reading?: number; + /** @description Number of users who have completed the resource */ + completed?: number; + /** @description Number of users who have put the resource on hold */ + on_hold?: number; + /** @description Number of users who have dropped the resource */ + dropped?: number; + /** @description Number of users who have planned to read the resource */ + plan_to_read?: number; + /** @description Total number of users who have the resource added to their lists */ + total?: number; + scores?: { + /** @description Scoring value */ + score?: number; + /** @description Number of votes for this score */ + votes?: number; + /** + * Format: float + * @description Percentage of votes for this score + */ + percentage?: number; + }[]; + }; + }; + /** @description More Info Resource */ + moreinfo: { + data?: { + /** @description Additional information on the entry */ + moreinfo?: string | null; + }; + }; + news: { + data?: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description Title */ + title?: string; + /** @description Post Date ISO8601 */ + date?: string; + /** @description Author MyAnimeList Username */ + author_username?: string; + /** @description Author Profile URL */ + author_url?: string; + /** @description Forum topic URL */ + forum_url?: string; + images?: components['schemas']['common_images']; + /** @description Comment count */ + comments?: number; + /** @description Excerpt */ + excerpt?: string; + }[]; + }; + /** @description Person anime staff positions */ + person_anime: { + data?: { + /** @description Person's position */ + position?: string; + anime?: components['schemas']['anime_meta']; + }[]; + }; + /** @description People Search */ + people_search: { + data?: components['schemas']['person'][]; + } & components['schemas']['pagination_plus']; + /** @description Person Resource */ + person_full: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description Person's website URL */ + website_url?: string | null; + images?: components['schemas']['people_images']; + /** @description Name */ + name?: string; + /** @description Given Name */ + given_name?: string | null; + /** @description Family Name */ + family_name?: string | null; + /** @description Other Names */ + alternate_names?: string[]; + /** @description Birthday Date ISO8601 */ + birthday?: string | null; + /** @description Number of users who have favorited this entry */ + favorites?: number; + /** @description Biography */ + about?: string | null; + anime?: { + /** @description Person's position */ + position?: string; + anime?: components['schemas']['anime_meta']; + }[]; + manga?: { + /** @description Person's position */ + position?: string; + manga?: components['schemas']['manga_meta']; + }[]; + voices?: { + /** @description Person's Character's role in the anime */ + role?: string; + anime?: components['schemas']['anime_meta']; + character?: components['schemas']['character_meta']; + }[]; + }; + /** @description Person's mangaography */ + person_manga: { + data?: { + /** @description Person's position */ + position?: string; + manga?: components['schemas']['manga_meta']; + }[]; + }; + /** @description Person Resource */ + person: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description Person's website URL */ + website_url?: string | null; + images?: components['schemas']['people_images']; + /** @description Name */ + name?: string; + /** @description Given Name */ + given_name?: string | null; + /** @description Family Name */ + family_name?: string | null; + /** @description Other Names */ + alternate_names?: string[]; + /** @description Birthday Date ISO8601 */ + birthday?: string | null; + /** @description Number of users who have favorited this entry */ + favorites?: number; + /** @description Biography */ + about?: string | null; + }; + /** @description Person's voice acting roles */ + person_voice_acting_roles: { + data?: { + /** @description Person's Character's role in the anime */ + role?: string; + anime?: components['schemas']['anime_meta']; + character?: components['schemas']['character_meta']; + }[]; + }; + /** @description Pictures Resource */ + pictures: { + data?: { + images?: components['schemas']['anime_images']; + }[]; + }; + /** @description Pictures Resource */ + pictures_variants: { + data?: { + images?: components['schemas']['common_images']; + }[]; + }; + /** @description Producers Collection Resource */ + producers: { + data?: components['schemas']['producer'][]; + } & components['schemas']['pagination']; + /** @description Producers Resource */ + producer_full: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description All titles */ + titles?: components['schemas']['title'][]; + images?: components['schemas']['common_images']; + /** @description Producers's member favorites count */ + favorites?: number; + /** @description Producers's anime count */ + count?: number; + /** @description Established Date ISO8601 */ + established?: string | null; + /** @description About the Producer */ + about?: string | null; + external?: { + name?: string; + url?: string; + }[]; + }; + /** @description Producers Resource */ + producer: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList URL */ + url?: string; + /** @description All titles */ + titles?: components['schemas']['title'][]; + images?: components['schemas']['common_images']; + /** @description Producers's member favorites count */ + favorites?: number; + /** @description Producers's anime count */ + count?: number; + /** @description Established Date ISO8601 */ + established?: string | null; + /** @description About the Producer */ + about?: string | null; + }; + user_about: { + data?: { + /** @description User About. NOTE: About information is customizable by users through BBCode on MyAnimeList. This means users can add multimedia content, different text sizes, etc. Due to this freeform, Jikan returns parsed HTML. Validate on your end! */ + about?: string | null; + }[]; + }; + user_favorites: { + /** @description Favorite Anime */ + anime?: ({ + type?: string; + start_year?: number; + } & components['schemas']['anime_meta'])[]; + /** @description Favorite Manga */ + manga?: ({ + type?: string; + start_year?: number; + } & components['schemas']['manga_meta'])[]; + /** @description Favorite Characters */ + characters?: (components['schemas']['character_meta'] & components['schemas']['mal_url_2'])[]; + /** @description Favorite People */ + people?: components['schemas']['character_meta'][]; + }; + /** @description Transform the resource into an array. */ + user_profile_full: { + /** @description MyAnimeList ID */ + mal_id?: number | null; + /** @description MyAnimeList Username */ + username?: string; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['user_images']; + /** @description Last Online Date ISO8601 */ + last_online?: string | null; + /** @description User Gender */ + gender?: string | null; + /** @description Birthday Date ISO8601 */ + birthday?: string | null; + /** @description Location */ + location?: string | null; + /** @description Joined Date ISO8601 */ + joined?: string | null; + statistics?: { + /** @description Anime Statistics */ + anime?: { + /** + * Format: float + * @description Number of days spent watching Anime + */ + days_watched?: number; + /** + * Format: float + * @description Mean Score + */ + mean_score?: number; + /** @description Anime Watching */ + watching?: number; + /** @description Anime Completed */ + completed?: number; + /** @description Anime On-Hold */ + on_hold?: number; + /** @description Anime Dropped */ + dropped?: number; + /** @description Anime Planned to Watch */ + plan_to_watch?: number; + /** @description Total Anime entries on User list */ + total_entries?: number; + /** @description Anime re-watched */ + rewatched?: number; + /** @description Number of Anime Episodes Watched */ + episodes_watched?: number; + }; + /** @description Manga Statistics */ + manga?: { + /** + * Format: float + * @description Number of days spent reading Manga + */ + days_read?: number; + /** + * Format: float + * @description Mean Score + */ + mean_score?: number; + /** @description Manga Reading */ + reading?: number; + /** @description Manga Completed */ + completed?: number; + /** @description Manga On-Hold */ + on_hold?: number; + /** @description Manga Dropped */ + dropped?: number; + /** @description Manga Planned to Read */ + plan_to_read?: number; + /** @description Total Manga entries on User list */ + total_entries?: number; + /** @description Manga re-read */ + reread?: number; + /** @description Number of Manga Chapters Read */ + chapters_read?: number; + /** @description Number of Manga Volumes Read */ + volumes_read?: number; + }; + }; + external?: { + name?: string; + url?: string; + }[]; + }; + user_history: { + data?: components['schemas']['history'][]; + }; + /** @description Transform the resource into an array. */ + history: { + entry?: components['schemas']['mal_url']; + /** @description Number of episodes/chapters watched/read */ + increment?: number; + /** @description Date ISO8601 */ + date?: string; + }; + user_updates: { + data?: { + /** @description Last updated Anime */ + anime?: ({ + entry?: components['schemas']['anime_meta']; + } & { + score?: number | null; + status?: string; + episodes_seen?: number | null; + episodes_total?: number | null; + /** @description ISO8601 format */ + date?: string; + })[]; + /** @description Last updated Manga */ + manga?: ({ + entry?: components['schemas']['manga_meta']; + } & { + score?: number | null; + status?: string; + chapters_read?: number | null; + chapters_total?: number | null; + volumes_read?: number | null; + volumes_total?: number | null; + /** @description ISO8601 format */ + date?: string; + })[]; + }; + }; + user_profile: { + /** @description MyAnimeList ID */ + mal_id?: number | null; + /** @description MyAnimeList Username */ + username?: string; + /** @description MyAnimeList URL */ + url?: string; + images?: components['schemas']['user_images']; + /** @description Last Online Date ISO8601 */ + last_online?: string | null; + /** @description User Gender */ + gender?: string | null; + /** @description Birthday Date ISO8601 */ + birthday?: string | null; + /** @description Location */ + location?: string | null; + /** @description Joined Date ISO8601 */ + joined?: string | null; + }; + /** @description Transform the resource into an array. */ + users_temp: { + data?: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList Username */ + username?: string; + /** @description MyAnimeList URL */ + url?: string; + /** @description Images */ + images?: { + /** @description Available images in JPG */ + jpg?: { + /** @description Image URL JPG (225x335) */ + image_url?: string; + }; + /** @description Available images in WEBP */ + webp?: { + /** @description Image URL WEBP (225x335) */ + image_url?: string; + }; + }; + /** @description Last Online Date ISO8601 */ + last_online?: string; + /** @description User Gender */ + gender?: string; + /** @description Birthday Date ISO8601 */ + birthday?: string; + /** @description Location */ + location?: string; + /** @description Joined Date ISO8601 */ + joined?: string; + /** @description Anime Stats */ + anime_stats?: { + /** + * Format: float + * @description Number of days spent watching Anime + */ + days_watched?: number; + /** + * Format: float + * @description Mean Score + */ + mean_score?: number; + /** @description Anime Watching */ + watching?: number; + /** @description Anime Completed */ + completed?: number; + /** @description Anime On-Hold */ + on_hold?: number; + /** @description Anime Dropped */ + dropped?: number; + /** @description Anime Planned to Watch */ + plan_to_watch?: number; + /** @description Total Anime entries on User list */ + total_entries?: number; + /** @description Anime re-watched */ + rewatched?: number; + /** @description Number of Anime Episodes Watched */ + episodes_watched?: number; + }; + /** @description Manga Stats */ + manga_stats?: { + /** + * Format: float + * @description Number of days spent reading Manga + */ + days_read?: number; + /** + * Format: float + * @description Mean Score + */ + mean_score?: number; + /** @description Manga Reading */ + reading?: number; + /** @description Manga Completed */ + completed?: number; + /** @description Manga On-Hold */ + on_hold?: number; + /** @description Manga Dropped */ + dropped?: number; + /** @description Manga Planned to Read */ + plan_to_read?: number; + /** @description Total Manga entries on User list */ + total_entries?: number; + /** @description Manga re-read */ + reread?: number; + /** @description Number of Manga Chapters Read */ + chapters_read?: number; + /** @description Number of Manga Volumes Read */ + volumes_read?: number; + }; + /** @description Favorite entries */ + favorites?: { + /** @description Favorite Anime */ + anime?: components['schemas']['entry_meta'][]; + /** @description Favorite Manga */ + manga?: components['schemas']['entry_meta'][]; + /** @description Favorite Characters */ + characters?: components['schemas']['entry_meta'][]; + /** @description Favorite People */ + people?: components['schemas']['entry_meta'][]; + }; + /** @description User About. NOTE: About information is customizable by users through BBCode on MyAnimeList. This means users can add multimedia content, different text sizes, etc. Due to this freeform, Jikan returns parsed HTML. Validate on your end! */ + about?: string; + }[]; + }; + user_statistics: { + data?: { + /** @description Anime Statistics */ + anime?: { + /** + * Format: float + * @description Number of days spent watching Anime + */ + days_watched?: number; + /** + * Format: float + * @description Mean Score + */ + mean_score?: number; + /** @description Anime Watching */ + watching?: number; + /** @description Anime Completed */ + completed?: number; + /** @description Anime On-Hold */ + on_hold?: number; + /** @description Anime Dropped */ + dropped?: number; + /** @description Anime Planned to Watch */ + plan_to_watch?: number; + /** @description Total Anime entries on User list */ + total_entries?: number; + /** @description Anime re-watched */ + rewatched?: number; + /** @description Number of Anime Episodes Watched */ + episodes_watched?: number; + }; + /** @description Manga Statistics */ + manga?: { + /** + * Format: float + * @description Number of days spent reading Manga + */ + days_read?: number; + /** + * Format: float + * @description Mean Score + */ + mean_score?: number; + /** @description Manga Reading */ + reading?: number; + /** @description Manga Completed */ + completed?: number; + /** @description Manga On-Hold */ + on_hold?: number; + /** @description Manga Dropped */ + dropped?: number; + /** @description Manga Planned to Read */ + plan_to_read?: number; + /** @description Total Manga entries on User list */ + total_entries?: number; + /** @description Manga re-read */ + reread?: number; + /** @description Number of Manga Chapters Read */ + chapters_read?: number; + /** @description Number of Manga Volumes Read */ + volumes_read?: number; + }; + }; + }; + /** @description Recommendations */ + recommendations: { + data?: { + /** @description MAL IDs of recommendations is both of the MAL ID's with a `-` delimiter */ + mal_id?: string; + /** @description Array of 2 entries that are being recommended to each other */ + entry?: (components['schemas']['anime_meta'] | components['schemas']['manga_meta'])[]; + /** @description Recommendation context provided by the user */ + content?: string; + user?: components['schemas']['user_by_id']; + }[]; + } & components['schemas']['pagination']; + /** @description Entry Recommendations Resource */ + entry_recommendations: { + data?: { + entry?: components['schemas']['anime_meta'] | components['schemas']['manga_meta']; + }[]; + }; + manga_review: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList review URL */ + url?: string; + /** @description Entry type */ + type?: string; + /** @description User reaction count on the review */ + reactions?: { + /** @description Overall reaction count */ + overall?: number; + /** @description Nice reaction count */ + nice?: number; + /** @description Love it reaction count */ + love_it?: number; + /** @description Funny reaction count */ + funny?: number; + /** @description Confusing reaction count */ + confusing?: number; + /** @description Informative reaction count */ + informative?: number; + /** @description Well written reaction count */ + well_written?: number; + /** @description Creative reaction count */ + creative?: number; + }; + /** @description Review created date ISO8601 */ + date?: string; + /** @description Review content */ + review?: string; + /** @description Number of user votes on the Review */ + score?: number; + /** @description Review tags */ + tags?: string[]; + /** @description The review contains spoiler */ + is_spoiler?: boolean; + /** @description The review was made before the entry was completed */ + is_preliminary?: boolean; + }; + anime_review: { + /** @description MyAnimeList ID */ + mal_id?: number; + /** @description MyAnimeList review URL */ + url?: string; + /** @description Entry type */ + type?: string; + /** @description User reaction count on the review */ + reactions?: { + /** @description Overall reaction count */ + overall?: number; + /** @description Nice reaction count */ + nice?: number; + /** @description Love it reaction count */ + love_it?: number; + /** @description Funny reaction count */ + funny?: number; + /** @description Confusing reaction count */ + confusing?: number; + /** @description Informative reaction count */ + informative?: number; + /** @description Well written reaction count */ + well_written?: number; + /** @description Creative reaction count */ + creative?: number; + }; + /** @description Review created date ISO8601 */ + date?: string; + /** @description Review content */ + review?: string; + /** @description Number of user votes on the Review */ + score?: number; + /** @description Review tags */ + tags?: string[]; + /** @description The review contains spoiler */ + is_spoiler?: boolean; + /** @description The review was made before the entry was completed */ + is_preliminary?: boolean; + /** @description Number of episodes watched */ + episodes_watched?: number; + }; + /** @description Anime Reviews Resource */ + anime_reviews: { + data?: ({ + user?: components['schemas']['user_meta']; + } & components['schemas']['anime_review'])[]; + } & components['schemas']['pagination']; + /** @description Manga Reviews Resource */ + manga_reviews: { + data?: ({ + user?: components['schemas']['user_meta']; + } & components['schemas']['manga_review'])[]; + } & components['schemas']['pagination']; + /** @description Streaming links */ + streaming_links: { + data?: { + name?: string; + url?: string; + }[]; + }; + /** @description Anime User Updates Resource */ + anime_userupdates: { + data?: { + user?: components['schemas']['user_meta']; + /** @description User Score */ + score?: number | null; + /** @description User list status */ + status?: string; + /** @description Number of episodes seen */ + episodes_seen?: number | null; + /** @description Total number of episodes */ + episodes_total?: number | null; + /** @description Last updated date ISO8601 */ + date?: string; + }[]; + } & components['schemas']['pagination']; + /** @description Manga User Updates Resource */ + manga_userupdates: { + data?: { + user?: components['schemas']['user_meta']; + /** @description User Score */ + score?: number | null; + /** @description User list status */ + status?: string; + /** @description Number of volumes read */ + volumes_read?: number; + /** @description Total number of volumes */ + volumes_total?: number; + /** @description Number of chapters read */ + chapters_read?: number; + /** @description Total number of chapters */ + chapters_total?: number; + /** @description Last updated date ISO8601 */ + date?: string; + }[]; + } & components['schemas']['pagination']; + }; + responses: { + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + parameters: { + /** @description This is a flag. When supplied it will include entries which are continuing from previous seasons. MAL includes these items on the seasons view in the ″TV (continuing)″ section. (Example: https://myanimelist.net/anime/season/2024/winter)
Example usage: `?continuing` */ + continuing: boolean; + /** @description This is a flag. When supplied it will include entries with the Kids genres in specific endpoints that filter them out by default. You do not need to pass a value to it. e.g usage: `?kids` */ + kids: boolean; + limit: number; + page: number; + /** @description Any reviews left during an ongoing anime/manga, those reviews are tagged as preliminary. NOTE: Preliminary reviews are not returned by default so if the entry is airing/publishing you need to add this otherwise you will get an empty list. e.g usage: `?preliminary=true` */ + preliminary: boolean; + /** @description 'Safe For Work'. This is a flag. When supplied it will filter out entries according to the SFW Policy. You do not need to pass a value to it. e.g usage: `?sfw` */ + sfw: boolean; + /** @description Any reviews that are tagged as a spoiler. Spoiler reviews are not returned by default. e.g usage: `?spoiler=true` */ + spoilers: boolean; + /** @description This is a flag. When supplied it will include entries which are unapproved. Unapproved entries on MyAnimeList are those that are user submitted and have not yet been approved by MAL to show up on other pages. They will have their own specifc pages and are often removed resulting in a 404 error. You do not need to pass a value to it. e.g usage: `?unapproved` */ + unapproved: boolean; + }; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getAnimeFullById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns complete anime resource data */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['anime_full']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['anime']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeCharacters: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime characters resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_characters']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeStaff: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime staff resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_staff']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeEpisodes: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a list of anime episodes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_episodes']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeEpisodeById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + episode: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a single anime episode resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['anime_episode']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeNews: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a list of news articles related to the entry */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_news']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeForum: { + parameters: { + query?: { + /** @description Filter topics */ + filter?: 'all' | 'episode' | 'other'; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a list of forum topics related to the entry */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['forum']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeVideos: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns videos related to the entry */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_videos']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeVideosEpisodes: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns episode videos related to the entry */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_videos_episodes']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimePictures: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns pictures related to the entry */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['pictures_variants']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeStatistics: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime statistics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_statistics']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeMoreInfo: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime statistics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['moreinfo']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeRecommendations: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime recommendations */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['entry_recommendations']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeUserUpdates: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a list of users who have added/updated/removed the entry on their list */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_userupdates']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeReviews: { + parameters: { + query?: { + page?: components['parameters']['page']; + /** @description Any reviews left during an ongoing anime/manga, those reviews are tagged as preliminary. NOTE: Preliminary reviews are not returned by default so if the entry is airing/publishing you need to add this otherwise you will get an empty list. e.g usage: `?preliminary=true` */ + preliminary?: components['parameters']['preliminary']; + /** @description Any reviews that are tagged as a spoiler. Spoiler reviews are not returned by default. e.g usage: `?spoiler=true` */ + spoilers?: components['parameters']['spoilers']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime reviews */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_reviews']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeRelations: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime relations */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['relation'][]; + }; + }; + }; + }; + }; + getAnimeThemes: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime themes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_themes']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeExternal: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime external links */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['external_links']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeStreaming: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime streaming links */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['external_links']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getCharacterFullById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns complete character resource data */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['character_full']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getCharacterById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns character resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['character']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getCharacterAnime: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime that character is in */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['character_anime']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getCharacterManga: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns manga that character is in */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['character_manga']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getCharacterVoiceActors: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns the character's voice actors */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['character_voice_actors']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getCharacterPictures: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns pictures related to the entry */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['character_pictures']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getClubsById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Club Resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['club']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getClubMembers: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Club Members Resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['pagination'] & components['schemas']['club_member']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getClubStaff: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Club Staff */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['club_staff']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getClubRelations: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Club Relations */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['club_relations']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeGenres: { + parameters: { + query?: { + filter?: components['schemas']['genre_query_filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns entry genres, explicit_genres, themes and demographics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['genres']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaGenres: { + parameters: { + query?: { + filter?: components['schemas']['genre_query_filter']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns entry genres, explicit_genres, themes and demographics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['genres']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMagazines: { + parameters: { + query?: { + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + q?: string; + order_by?: components['schemas']['magazines_query_orderby']; + sort?: components['schemas']['search_query_sort']; + /** @description Return entries starting with the given letter */ + letter?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns magazines collection */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['magazines']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaFullById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns complete manga resource data */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['manga_full']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns pictures related to the entry */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['manga']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaCharacters: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns manga characters resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['manga_characters']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaNews: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a list of manga news topics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['manga_news']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaTopics: { + parameters: { + query?: { + /** @description Filter topics */ + filter?: 'all' | 'episode' | 'other'; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a list of manga forum topics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['forum']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaPictures: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a list of manga pictures */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['manga_pictures']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaStatistics: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns anime statistics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['manga_statistics']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaMoreInfo: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns manga moreinfo */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['moreinfo']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaRecommendations: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns manga recommendations */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['entry_recommendations']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaUserUpdates: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns manga user updates */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['manga_userupdates']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaReviews: { + parameters: { + query?: { + page?: components['parameters']['page']; + /** @description Any reviews left during an ongoing anime/manga, those reviews are tagged as preliminary. NOTE: Preliminary reviews are not returned by default so if the entry is airing/publishing you need to add this otherwise you will get an empty list. e.g usage: `?preliminary=true` */ + preliminary?: components['parameters']['preliminary']; + /** @description Any reviews that are tagged as a spoiler. Spoiler reviews are not returned by default. e.g usage: `?spoiler=true` */ + spoilers?: components['parameters']['spoilers']; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns manga reviews */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['manga_reviews']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaRelations: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns manga relations */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['relation'][]; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaExternal: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns manga external links */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['external_links']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPersonFullById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns complete character resource data */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['person_full']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPersonById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns pictures related to the entry */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['person']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPersonAnime: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns person's anime staff positions */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['person_anime']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPersonVoices: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns person's voice acting roles */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['person_voice_acting_roles']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPersonManga: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns person's published manga works */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['person_manga']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPersonPictures: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a list of pictures of the person */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['person_pictures']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getProducerById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns producer resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['producer']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getProducerFullById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns producer resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['producer_full']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getProducerExternal: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns producer's external links */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['external_links']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRandomAnime: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a random anime resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['anime']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRandomManga: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a random manga resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['manga']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRandomCharacters: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a random character resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['character']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRandomPeople: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a random person resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['person']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRandomUsers: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns a random user profile resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['user_profile']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRecentAnimeRecommendations: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns recent anime recommendations */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['recommendations']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRecentMangaRecommendations: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns recent manga recommendations */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['recommendations']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRecentAnimeReviews: { + parameters: { + query?: { + page?: components['parameters']['page']; + /** @description Any reviews left during an ongoing anime/manga, those reviews are tagged as preliminary. NOTE: Preliminary reviews are not returned by default so if the entry is airing/publishing you need to add this otherwise you will get an empty list. e.g usage: `?preliminary=true` */ + preliminary?: components['parameters']['preliminary']; + /** @description Any reviews that are tagged as a spoiler. Spoiler reviews are not returned by default. e.g usage: `?spoiler=true` */ + spoilers?: components['parameters']['spoilers']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns recent anime reviews */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getRecentMangaReviews: { + parameters: { + query?: { + page?: components['parameters']['page']; + /** @description Any reviews left during an ongoing anime/manga, those reviews are tagged as preliminary. NOTE: Preliminary reviews are not returned by default so if the entry is airing/publishing you need to add this otherwise you will get an empty list. e.g usage: `?preliminary=true` */ + preliminary?: components['parameters']['preliminary']; + /** @description Any reviews that are tagged as a spoiler. Spoiler reviews are not returned by default. e.g usage: `?spoiler=true` */ + spoilers?: components['parameters']['spoilers']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns recent manga reviews */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getSchedules: { + parameters: { + query?: { + /** @description Filter by day */ + filter?: 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday' | 'unknown' | 'other'; + /** @description When supplied, it will filter entries with the `Kids` Genre Demographic. When supplied as `kids=true`, it will return only Kid entries and when supplied as `kids=false`, it will filter out any Kid entries. Defaults to `false`. */ + kids?: 'true' | 'false'; + /** @description 'Safe For Work'. When supplied, it will filter entries with the `Hentai` Genre. When supplied as `sfw=true`, it will return only SFW entries and when supplied as `sfw=false`, it will filter out any Hentai entries. Defaults to `false`. */ + sfw?: 'true' | 'false'; + /** @description This is a flag. When supplied it will include entries which are unapproved. Unapproved entries on MyAnimeList are those that are user submitted and have not yet been approved by MAL to show up on other pages. They will have their own specifc pages and are often removed resulting in a 404 error. You do not need to pass a value to it. e.g usage: `?unapproved` */ + unapproved?: components['parameters']['unapproved']; + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns weekly schedule */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['schedules']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAnimeSearch: { + parameters: { + query?: { + /** @description This is a flag. When supplied it will include entries which are unapproved. Unapproved entries on MyAnimeList are those that are user submitted and have not yet been approved by MAL to show up on other pages. They will have their own specifc pages and are often removed resulting in a 404 error. You do not need to pass a value to it. e.g usage: `?unapproved` */ + unapproved?: components['parameters']['unapproved']; + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + q?: string; + type?: components['schemas']['anime_search_query_type']; + score?: number; + /** @description Set a minimum score for results. */ + min_score?: number; + /** @description Set a maximum score for results */ + max_score?: number; + status?: components['schemas']['anime_search_query_status']; + rating?: components['schemas']['anime_search_query_rating']; + /** @description Filter out Adult entries */ + sfw?: boolean; + /** @description Filter by genre(s) IDs. Can pass multiple with a comma as a delimiter. e.g 1,2,3 */ + genres?: string; + /** @description Exclude genre(s) IDs. Can pass multiple with a comma as a delimiter. e.g 1,2,3 */ + genres_exclude?: string; + order_by?: components['schemas']['anime_search_query_orderby']; + sort?: components['schemas']['search_query_sort']; + /** @description Return entries starting with the given letter */ + letter?: string; + /** @description Filter by producer(s) IDs. Can pass multiple with a comma as a delimiter. e.g 1,2,3 */ + producers?: string; + /** @description Filter by starting date. Format: YYYY-MM-DD. e.g `2022`, `2005-05`, `2005-01-01` */ + start_date?: string; + /** @description Filter by ending date. Format: YYYY-MM-DD. e.g `2022`, `2005-05`, `2005-01-01` */ + end_date?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns search results for anime */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getMangaSearch: { + parameters: { + query?: { + /** @description This is a flag. When supplied it will include entries which are unapproved. Unapproved entries on MyAnimeList are those that are user submitted and have not yet been approved by MAL to show up on other pages. They will have their own specifc pages and are often removed resulting in a 404 error. You do not need to pass a value to it. e.g usage: `?unapproved` */ + unapproved?: components['parameters']['unapproved']; + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + q?: string; + type?: components['schemas']['manga_search_query_type']; + score?: number; + /** @description Set a minimum score for results. */ + min_score?: number; + /** @description Set a maximum score for results */ + max_score?: number; + status?: components['schemas']['manga_search_query_status']; + /** @description Filter out Adult entries */ + sfw?: boolean; + /** @description Filter by genre(s) IDs. Can pass multiple with a comma as a delimiter. e.g 1,2,3 */ + genres?: string; + /** @description Exclude genre(s) IDs. Can pass multiple with a comma as a delimiter. e.g 1,2,3 */ + genres_exclude?: string; + order_by?: components['schemas']['manga_search_query_orderby']; + sort?: components['schemas']['search_query_sort']; + /** @description Return entries starting with the given letter */ + letter?: string; + /** @description Filter by magazine(s) IDs. Can pass multiple with a comma as a delimiter. e.g 1,2,3 */ + magazines?: string; + /** @description Filter by starting date. Format: YYYY-MM-DD. e.g `2022`, `2005-05`, `2005-01-01` */ + start_date?: string; + /** @description Filter by ending date. Format: YYYY-MM-DD. e.g `2022`, `2005-05`, `2005-01-01` */ + end_date?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns search results for manga */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['manga_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPeopleSearch: { + parameters: { + query?: { + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + q?: string; + order_by?: components['schemas']['people_search_query_orderby']; + sort?: components['schemas']['search_query_sort']; + /** @description Return entries starting with the given letter */ + letter?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns search results for people */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['people_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getCharactersSearch: { + parameters: { + query?: { + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + q?: string; + order_by?: components['schemas']['characters_search_query_orderby']; + sort?: components['schemas']['search_query_sort']; + /** @description Return entries starting with the given letter */ + letter?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns search results for characters */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['characters_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUsersSearch: { + parameters: { + query?: { + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + q?: string; + gender?: components['schemas']['users_search_query_gender']; + location?: string; + maxAge?: number; + minAge?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns search results for users */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['users_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns username by ID search */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['user_by_id']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getClubsSearch: { + parameters: { + query?: { + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + q?: string; + type?: components['schemas']['club_search_query_type']; + category?: components['schemas']['club_search_query_category']; + order_by?: components['schemas']['club_search_query_orderby']; + sort?: components['schemas']['search_query_sort']; + /** @description Return entries starting with the given letter */ + letter?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns search results for clubs */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['clubs_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getProducers: { + parameters: { + query?: { + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + q?: string; + order_by?: components['schemas']['producers_query_orderby']; + sort?: components['schemas']['search_query_sort']; + /** @description Return entries starting with the given letter */ + letter?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns producers collection */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['producers']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getSeasonNow: { + parameters: { + query?: { + /** @description Entry types */ + filter?: 'tv' | 'movie' | 'ova' | 'special' | 'ona' | 'music'; + /** @description 'Safe For Work'. This is a flag. When supplied it will filter out entries according to the SFW Policy. You do not need to pass a value to it. e.g usage: `?sfw` */ + sfw?: components['parameters']['sfw']; + /** @description This is a flag. When supplied it will include entries which are unapproved. Unapproved entries on MyAnimeList are those that are user submitted and have not yet been approved by MAL to show up on other pages. They will have their own specifc pages and are often removed resulting in a 404 error. You do not need to pass a value to it. e.g usage: `?unapproved` */ + unapproved?: components['parameters']['unapproved']; + /** @description This is a flag. When supplied it will include entries which are continuing from previous seasons. MAL includes these items on the seasons view in the ″TV (continuing)″ section. (Example: https://myanimelist.net/anime/season/2024/winter)
Example usage: `?continuing` */ + continuing?: components['parameters']['continuing']; + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns current seasonal anime */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getSeason: { + parameters: { + query?: { + /** @description Entry types */ + filter?: 'tv' | 'movie' | 'ova' | 'special' | 'ona' | 'music'; + /** @description 'Safe For Work'. This is a flag. When supplied it will filter out entries according to the SFW Policy. You do not need to pass a value to it. e.g usage: `?sfw` */ + sfw?: components['parameters']['sfw']; + /** @description This is a flag. When supplied it will include entries which are unapproved. Unapproved entries on MyAnimeList are those that are user submitted and have not yet been approved by MAL to show up on other pages. They will have their own specifc pages and are often removed resulting in a 404 error. You do not need to pass a value to it. e.g usage: `?unapproved` */ + unapproved?: components['parameters']['unapproved']; + /** @description This is a flag. When supplied it will include entries which are continuing from previous seasons. MAL includes these items on the seasons view in the ″TV (continuing)″ section. (Example: https://myanimelist.net/anime/season/2024/winter)
Example usage: `?continuing` */ + continuing?: components['parameters']['continuing']; + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + }; + header?: never; + path: { + year: number; + season: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns seasonal anime */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getSeasonsList: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns available list of seasons */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['seasons']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getSeasonUpcoming: { + parameters: { + query?: { + /** @description Entry types */ + filter?: 'tv' | 'movie' | 'ova' | 'special' | 'ona' | 'music'; + /** @description 'Safe For Work'. This is a flag. When supplied it will filter out entries according to the SFW Policy. You do not need to pass a value to it. e.g usage: `?sfw` */ + sfw?: components['parameters']['sfw']; + /** @description This is a flag. When supplied it will include entries which are unapproved. Unapproved entries on MyAnimeList are those that are user submitted and have not yet been approved by MAL to show up on other pages. They will have their own specifc pages and are often removed resulting in a 404 error. You do not need to pass a value to it. e.g usage: `?unapproved` */ + unapproved?: components['parameters']['unapproved']; + /** @description This is a flag. When supplied it will include entries which are continuing from previous seasons. MAL includes these items on the seasons view in the ″TV (continuing)″ section. (Example: https://myanimelist.net/anime/season/2024/winter)
Example usage: `?continuing` */ + continuing?: components['parameters']['continuing']; + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns upcoming season's anime */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getTopAnime: { + parameters: { + query?: { + type?: components['schemas']['anime_search_query_type']; + filter?: components['schemas']['top_anime_filter']; + rating?: components['schemas']['anime_search_query_rating']; + /** @description Filter out Adult entries */ + sfw?: boolean; + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns top anime */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['anime_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getTopManga: { + parameters: { + query?: { + type?: components['schemas']['manga_search_query_type']; + filter?: components['schemas']['top_manga_filter']; + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns top manga */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['manga_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getTopPeople: { + parameters: { + query?: { + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns top people */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['people_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getTopCharacters: { + parameters: { + query?: { + page?: components['parameters']['page']; + limit?: components['parameters']['limit']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns top characters */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['characters_search']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getTopReviews: { + parameters: { + query?: { + page?: components['parameters']['page']; + type?: components['schemas']['top_reviews_type_enum']; + /** @description Whether the results include preliminary reviews or not. Defaults to true. */ + preliminary?: boolean; + /** @description Whether the results include reviews with spoilers or not. Defaults to true. */ + spoilers?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns top reviews */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: { + data?: ( + | ({ + user?: components['schemas']['user_meta']; + } & { + anime?: components['schemas']['anime_meta']; + } & components['schemas']['anime_review']) + | ({ + user?: components['schemas']['user_meta']; + } & { + manga?: components['schemas']['manga_meta']; + } & components['schemas']['manga_review']) + )[]; + } & components['schemas']['pagination']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserFullProfile: { + parameters: { + query?: never; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns complete user resource data */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['user_profile_full']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserProfile: { + parameters: { + query?: never; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user profile */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['user_profile']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserStatistics: { + parameters: { + query?: never; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user statistics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['user_statistics']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserFavorites: { + parameters: { + query?: never; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user favorites */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: components['schemas']['user_favorites']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserUpdates: { + parameters: { + query?: never; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user updates */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['user_updates']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserAbout: { + parameters: { + query?: never; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user about in raw HTML */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['user_about']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserHistory: { + parameters: { + query?: { + type?: 'anime' | 'manga'; + }; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user history (past 30 days) */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['user_history']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserFriends: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user friends */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['user_friends']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserAnimelist: { + parameters: { + query?: { + status?: components['schemas']['user_anime_list_status_filter']; + }; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user anime list */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserMangaList: { + parameters: { + query?: { + status?: components['schemas']['user_manga_list_status_filter']; + }; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user manga list */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserReviews: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user reviews */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + data?: { + data?: ( + | ({ + user?: components['schemas']['user_meta']; + } & { + anime?: components['schemas']['anime_meta']; + } & components['schemas']['anime_review']) + | ({ + user?: components['schemas']['user_meta']; + } & { + manga?: components['schemas']['manga_meta']; + } & components['schemas']['manga_review']) + )[]; + } & components['schemas']['pagination']; + }; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserRecommendations: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Recent Anime Recommendations */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['recommendations']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserClubs: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user clubs */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['user_clubs']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getUserExternal: { + parameters: { + query?: never; + header?: never; + path: { + username: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns user's external links */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['external_links']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWatchRecentEpisodes: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Recently Added Episodes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['watch_episodes']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWatchPopularEpisodes: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Popular Episodes */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['watch_episodes']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWatchRecentPromos: { + parameters: { + query?: { + page?: components['parameters']['page']; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Recently Added Promotional Videos */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['watch_promos']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWatchPopularPromos: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns Popular Promotional Videos */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['watch_promos']; + }; + }; + /** @description Error: Bad request. When required parameters were not supplied. */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; +} diff --git a/src/api/schemas/OpenLibrary.json b/src/api/schemas/OpenLibrary.json new file mode 100644 index 0000000..6258f57 --- /dev/null +++ b/src/api/schemas/OpenLibrary.json @@ -0,0 +1,602 @@ +{ + "components": { + "schemas": { + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "title": "Detail", + "type": "array" + } + }, + "title": "HTTPValidationError", + "type": "object" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "type": "string" + }, + "title": "Location", + "type": "array" + }, + "msg": { + "title": "Message", + "type": "string" + }, + "type": { + "title": "Error Type", + "type": "string" + } + }, + "required": ["loc", "msg", "type"], + "title": "ValidationError", + "type": "object" + } + } + }, + "info": { + "description": "- These are still in development and may not be perfect\n- Contribute by proposing edits to [openapi.json](https://github.com/internetarchive/openlibrary/blob/master/static/openapi.json)\n- Please do not use our APIs for bulk downloads, see [dev center](https://openlibrary.org/developers/api)", + "title": "Open Library API", + "version": "0.1.0" + }, + "openapi": "3.0.2", + "paths": { + "/api/books": { + "get": { + "operationId": "read_api_books_api_books_get", + "parameters": [ + { + "examples": { + "isbn": { + "value": "ISBN:0201558025" + }, + "multiple": { + "value": "ISBN:9781408113479,OCLC:420517" + }, + "oclc": { + "value": "OCLC:263296519" + } + }, + "in": "query", + "name": "bibkeys", + "required": true, + "schema": { + "title": "Bibkeys", + "type": "string" + } + }, + { + "description": "Specifies the response format. Possible values are json and javascript. When not specified the format is javascript.", + "in": "query", + "name": "format", + "required": false, + "schema": { + "default": "json", + "title": "Format", + "type": "string" + } + }, + { + "description": "The name of the JavaScript function to call with the result. This is considered only when the format is javascript.", + "in": "query", + "name": "callback", + "required": false, + "schema": { + "title": "Callback" + } + }, + { + "description": "Decides what information to provide for each matched bib_key. Possible values are viewapi and data. The default value is viewapi.", + "in": "query", + "name": "jscmd", + "required": false, + "schema": { + "default": "viewapi", + "title": "Jscmd", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Api Books", + "tags": ["books"] + } + }, + "/api/volumes/brief/{key_type}/{value}.json": { + "get": { + "operationId": "read_api_volumes_brief_api_volumes_brief__key_type___value__json_get", + "parameters": [ + { + "in": "path", + "name": "key_type", + "required": true, + "schema": { + "title": "Key Type" + } + }, + { + "in": "path", + "name": "value", + "required": true, + "schema": { + "title": "Value" + } + }, + { + "in": "query", + "name": "callback", + "required": false, + "schema": { + "title": "Callback" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Api Volumes Brief", + "tags": ["books"] + } + }, + "/authors/{olid}.json": { + "get": { + "operationId": "read_authors_authors__olid__json_get", + "parameters": [ + { + "in": "path", + "name": "olid", + "required": true, + "schema": { + "title": "Olid" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Authors", + "tags": ["authors"] + } + }, + "/authors/{olid}/works.json": { + "get": { + "operationId": "read_authors_works_authors__olid__works_json_get", + "parameters": [ + { + "in": "path", + "name": "olid", + "required": true, + "schema": { + "title": "Olid" + } + }, + { + "in": "query", + "name": "limit", + "required": false, + "schema": { + "title": "Limit", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Authors Works", + "tags": ["authors"] + } + }, + "/books/{olid}": { + "get": { + "operationId": "read_books_books__olid__get", + "parameters": [ + { + "in": "path", + "name": "olid", + "required": true, + "schema": { + "example": "OL53924W", + "title": "Olid" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Books", + "tags": ["books"] + } + }, + "/covers/{key_type}/{value}-{size}.jpg": { + "get": { + "operationId": "read_covers_key_type_value_size_jpeg_covers__key_type___value___size__jpg_get", + "parameters": [ + { + "in": "path", + "name": "key_type", + "required": true, + "schema": { + "title": "Key Type" + } + }, + { + "in": "path", + "name": "value", + "required": true, + "schema": { + "title": "Value" + } + }, + { + "in": "path", + "name": "size", + "required": true, + "schema": { + "title": "Size" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Covers Key Type Value Size Jpeg", + "tags": ["covers"] + } + }, + "/isbn/{isbn}": { + "get": { + "operationId": "read_isbn_isbn__isbn__get", + "parameters": [ + { + "in": "path", + "name": "isbn", + "required": true, + "schema": { + "title": "Isbn" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Isbn", + "tags": ["books"] + } + }, + "/search.json": { + "get": { + "operationId": "read_search_json_search_json_get", + "parameters": [ + { + "in": "query", + "name": "q", + "required": true, + "schema": { + "title": "Q" + } + }, + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "title": "Page", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Search Json", + "tags": ["search"] + } + }, + "/search/authors.json": { + "get": { + "operationId": "read_search_authors_json_search_authors_json_get", + "parameters": [ + { + "in": "query", + "name": "q", + "required": true, + "schema": { + "title": "Q" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Search Authors Json", + "tags": ["search"] + } + }, + "/subjects/{subject}.json": { + "get": { + "operationId": "read_subjects_subjects__subject__json_get", + "parameters": [ + { + "in": "path", + "name": "subject", + "required": true, + "schema": { + "title": "Subject" + } + }, + { + "in": "query", + "name": "details", + "required": false, + "schema": { + "default": false, + "title": "Details", + "type": "boolean" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Subjects", + "tags": ["subjects"] + } + }, + "/works/{olid}": { + "get": { + "operationId": "read_works_works__olid__get", + "parameters": [ + { + "in": "path", + "name": "olid", + "required": true, + "schema": { + "title": "Olid" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Read Works", + "tags": ["books"] + } + } + }, + "tags": [ + { + "description": "Retrieve a specific work or edition by identifier", + "externalDocs": { + "description": "Find out more", + "url": "https://openlibrary.org/dev/docs/api/books" + }, + "name": "books" + }, + { + "description": "Retrieve an author and their works by author identifier", + "externalDocs": { + "description": "Find out more", + "url": "https://openlibrary.org/dev/docs/api/authors" + }, + "name": "authors" + }, + { + "description": "Search results for books, authors, and more", + "externalDocs": { + "description": "Find out more", + "url": "https://openlibrary.org/dev/docs/api/search" + }, + "name": "search" + }, + { + "description": "Fetch book covers by ISBN or Open Library identifier", + "externalDocs": { + "description": "Find out more", + "url": "https://openlibrary.org/dev/docs/api/covers" + }, + "name": "covers" + }, + { + "description": "Fetch books by subject name ", + "externalDocs": { + "description": "Find out more", + "url": "https://openlibrary.org/dev/docs/api/subjects" + }, + "name": "subjects" + } + ] +} diff --git a/src/api/schemas/OpenLibrary.ts b/src/api/schemas/OpenLibrary.ts new file mode 100644 index 0000000..aa6fbba --- /dev/null +++ b/src/api/schemas/OpenLibrary.ts @@ -0,0 +1,578 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + '/api/books': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Api Books */ + get: operations['read_api_books_api_books_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/volumes/brief/{key_type}/{value}.json': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Api Volumes Brief */ + get: operations['read_api_volumes_brief_api_volumes_brief__key_type___value__json_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/authors/{olid}.json': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Authors */ + get: operations['read_authors_authors__olid__json_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/authors/{olid}/works.json': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Authors Works */ + get: operations['read_authors_works_authors__olid__works_json_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/books/{olid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Books */ + get: operations['read_books_books__olid__get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/covers/{key_type}/{value}-{size}.jpg': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Covers Key Type Value Size Jpeg */ + get: operations['read_covers_key_type_value_size_jpeg_covers__key_type___value___size__jpg_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/isbn/{isbn}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Isbn */ + get: operations['read_isbn_isbn__isbn__get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/search.json': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Search Json */ + get: operations['read_search_json_search_json_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/search/authors.json': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Search Authors Json */ + get: operations['read_search_authors_json_search_authors_json_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/subjects/{subject}.json': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Subjects */ + get: operations['read_subjects_subjects__subject__json_get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/works/{olid}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read Works */ + get: operations['read_works_works__olid__get']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + /** HTTPValidationError */ + HTTPValidationError: { + /** Detail */ + detail?: components['schemas']['ValidationError'][]; + }; + /** ValidationError */ + ValidationError: { + /** Location */ + loc: string[]; + /** Message */ + msg: string; + /** Error Type */ + type: string; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + read_api_books_api_books_get: { + parameters: { + query: { + bibkeys: string; + /** @description Specifies the response format. Possible values are json and javascript. When not specified the format is javascript. */ + format?: string; + /** @description The name of the JavaScript function to call with the result. This is considered only when the format is javascript. */ + callback?: unknown; + /** @description Decides what information to provide for each matched bib_key. Possible values are viewapi and data. The default value is viewapi. */ + jscmd?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_api_volumes_brief_api_volumes_brief__key_type___value__json_get: { + parameters: { + query?: { + callback?: unknown; + }; + header?: never; + path: { + key_type: unknown; + value: unknown; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_authors_authors__olid__json_get: { + parameters: { + query?: never; + header?: never; + path: { + olid: unknown; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_authors_works_authors__olid__works_json_get: { + parameters: { + query?: { + limit?: number; + }; + header?: never; + path: { + olid: unknown; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_books_books__olid__get: { + parameters: { + query?: never; + header?: never; + path: { + olid: unknown; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_covers_key_type_value_size_jpeg_covers__key_type___value___size__jpg_get: { + parameters: { + query?: never; + header?: never; + path: { + key_type: unknown; + value: unknown; + size: unknown; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_isbn_isbn__isbn__get: { + parameters: { + query?: never; + header?: never; + path: { + isbn: unknown; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_search_json_search_json_get: { + parameters: { + query: { + q: unknown; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_search_authors_json_search_authors_json_get: { + parameters: { + query: { + q: unknown; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_subjects_subjects__subject__json_get: { + parameters: { + query?: { + details?: boolean; + }; + header?: never; + path: { + subject: unknown; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; + read_works_works__olid__get: { + parameters: { + query?: never; + header?: never; + path: { + olid: unknown; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPValidationError']; + }; + }; + }; + }; +} diff --git a/src/api/schemas/TMDB.ts b/src/api/schemas/TMDB.ts new file mode 100644 index 0000000..6df120e --- /dev/null +++ b/src/api/schemas/TMDB.ts @@ -0,0 +1,22832 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + '/3/authentication': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Validate Key + * @description Test your API Key to see if it's valid. + */ + get: operations['authentication-validate-key']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the public details of an account on TMDB. + */ + get: operations['account-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/favorite': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Favorite + * @description Mark a movie or TV show as a favourite. + */ + post: operations['account-add-favorite']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/watchlist': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add To Watchlist + * @description Add a movie or TV show to your watchlist. + */ + post: operations['account-add-to-watchlist']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/favorite/movies': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Favorite Movies + * @description Get a users list of favourite movies. + */ + get: operations['account-get-favorites']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/favorite/tv': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Favorite TV + * @description Get a users list of favourite TV shows. + */ + get: operations['account-favorite-tv']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/lists': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists + * @description Get a users list of custom lists. + */ + get: operations['account-lists']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/rated/movies': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated Movies + * @description Get a users list of rated movies. + */ + get: operations['account-rated-movies']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/rated/tv': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated TV + * @description Get a users list of rated TV shows. + */ + get: operations['account-rated-tv']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/rated/tv/episodes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated TV Episodes + * @description Get a users list of rated TV episodes. + */ + get: operations['account-rated-tv-episodes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/watchlist/movies': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watchlist Movies + * @description Get a list of movies added to a users watchlist. + */ + get: operations['account-watchlist-movies']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/account/{account_id}/watchlist/tv': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watchlist TV + * @description Get a list of TV shows added to a users watchlist. + */ + get: operations['account-watchlist-tv']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/authentication/guest_session/new': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Create Guest Session */ + get: operations['authentication-create-guest-session']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/authentication/token/new': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Create Request Token */ + get: operations['authentication-create-request-token']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/authentication/session/new': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Session */ + post: operations['authentication-create-session']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/authentication/session/convert/4': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Session (from v4 token) */ + post: operations['authentication-create-session-from-v4-token']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/authentication/token/validate_with_login': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Session (with login) + * @description This method allows an application to validate a request token by entering a username and password. + */ + post: operations['authentication-create-session-from-login']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/authentication/session': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Delete Session */ + delete: operations['authentication-delete-session']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/certification/movie/list': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie Certifications + * @description Get an up to date list of the officially supported movie certifications on TMDB. + */ + get: operations['certification-movie-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/certification/tv/list': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** TV Certifications */ + get: operations['certifications-tv-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/changes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie List + * @description Get a list of all of the movie ids that have been changed in the past 24 hours. + */ + get: operations['changes-movie-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/changes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** People List */ + get: operations['changes-people-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/changes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** TV List */ + get: operations['changes-tv-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/collection/{collection_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get collection details by ID. + */ + get: operations['collection-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/collection/{collection_id}/images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a collection. + */ + get: operations['collection-images']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/collection/{collection_id}/translations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Translations */ + get: operations['collection-translations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/company/{company_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the company details by ID. + */ + get: operations['company-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/company/{company_id}/alternative_names': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Alternative Names + * @description Get the company details by ID. + */ + get: operations['company-alternative-names']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/company/{company_id}/images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the company logos by id. + */ + get: operations['company-images']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/configuration': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Query the API configuration details. + */ + get: operations['configuration-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/configuration/countries': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Countries + * @description Get the list of countries (ISO 3166-1 tags) used throughout TMDB. + */ + get: operations['configuration-countries']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/configuration/jobs': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Jobs + * @description Get the list of the jobs and departments we use on TMDB. + */ + get: operations['configuration-jobs']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/configuration/languages': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Languages + * @description Get the list of languages (ISO 639-1 tags) used throughout TMDB. + */ + get: operations['configuration-languages']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/configuration/primary_translations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Primary Translations + * @description Get a list of the officially supported translations on TMDB. + */ + get: operations['configuration-primary-translations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/configuration/timezones': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Timezones + * @description Get the list of timezones used throughout TMDB. + */ + get: operations['configuration-timezones']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/credit/{credit_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get a movie or TV credit details by ID. + */ + get: operations['credit-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/discover/movie': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie + * @description Find movies using over 30 filters and sort options. + */ + get: operations['discover-movie']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/discover/tv': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV + * @description Find TV shows using over 30 filters and sort options. + */ + get: operations['discover-tv']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/find/{external_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Find By ID + * @description Find data by external ID's. + */ + get: operations['find-by-id']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/genre/movie/list': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie List + * @description Get the list of official genres for movies. + */ + get: operations['genre-movie-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/genre/tv/list': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV List + * @description Get the list of official genres for TV shows. + */ + get: operations['genre-tv-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/guest_session/{guest_session_id}/rated/movies': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated Movies + * @description Get the rated movies for a guest session. + */ + get: operations['guest-session-rated-movies']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/guest_session/{guest_session_id}/rated/tv': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated TV + * @description Get the rated TV shows for a guest session. + */ + get: operations['guest-session-rated-tv']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/guest_session/{guest_session_id}/rated/tv/episodes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated TV Episodes + * @description Get the rated TV episodes for a guest session. + */ + get: operations['guest-session-rated-tv-episodes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/keyword/{keyword_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Details */ + get: operations['keyword-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/keyword/{keyword_id}/movies': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Movies */ + get: operations['keyword-movies']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/list/{list_id}/add_item': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Movie + * @description Add a movie to a list. + */ + post: operations['list-add-movie']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/list/{list_id}/item_status': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Check Item Status + * @description Use this method to check if an item has already been added to the list. + */ + get: operations['list-check-item-status']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/list/{list_id}/clear': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Clear + * @description Clear all items from a list. + */ + post: operations['list-clear']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/list': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create */ + post: operations['list-create']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/list/{list_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Details */ + get: operations['list-details']; + put?: never; + post?: never; + /** + * Delete + * @description Delete a list. + */ + delete: operations['list-delete']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/list/{list_id}/remove_item': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Remove Movie + * @description Remove a movie from a list. + */ + post: operations['list-remove-movie']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/now_playing': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Now Playing + * @description Get a list of movies that are currently in theatres. + */ + get: operations['movie-now-playing-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/popular': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Popular + * @description Get a list of movies ordered by popularity. + */ + get: operations['movie-popular-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/top_rated': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Top Rated + * @description Get a list of movies ordered by rating. + */ + get: operations['movie-top-rated-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/upcoming': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Upcoming + * @description Get a list of movies that are being released soon. + */ + get: operations['movie-upcoming-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the top level details of a movie by ID. + */ + get: operations['movie-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/account_states': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Account States + * @description Get the rating, watchlist and favourite status of an account. + */ + get: operations['movie-account-states']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/alternative_titles': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Alternative Titles + * @description Get the alternative titles for a movie. + */ + get: operations['movie-alternative-titles']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/changes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a movie. + */ + get: operations['movie-changes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Credits */ + get: operations['movie-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/external_ids': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** External IDs */ + get: operations['movie-external-ids']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a movie. + */ + get: operations['movie-images']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/keywords': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Keywords */ + get: operations['movie-keywords']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/latest': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Latest + * @description Get the newest movie ID. + */ + get: operations['movie-latest-id']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/lists': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists + * @description Get the lists that a movie has been added to. + */ + get: operations['movie-lists']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/recommendations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Recommendations */ + get: operations['movie-recommendations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/release_dates': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Release Dates + * @description Get the release dates and certifications for a movie. + */ + get: operations['movie-release-dates']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/reviews': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Reviews + * @description Get the user reviews for a movie. + */ + get: operations['movie-reviews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/similar': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Similar + * @description Get the similar movies based on genres and keywords. + */ + get: operations['movie-similar']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/translations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations for a movie. + */ + get: operations['movie-translations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/videos': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Videos */ + get: operations['movie-videos']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/watch/providers': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watch Providers + * @description Get the list of streaming providers we have for a movie. + */ + get: operations['movie-watch-providers']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/movie/{movie_id}/rating': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Rating + * @description Rate a movie and save it to your rated list. + */ + post: operations['movie-add-rating']; + /** + * Delete Rating + * @description Delete a user rating. + */ + delete: operations['movie-delete-rating']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/network/{network_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Details */ + get: operations['network-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/network/{network_id}/alternative_names': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Alternative Names + * @description Get the alternative names of a network. + */ + get: operations['details-copy']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/network/{network_id}/images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the TV network logos by id. + */ + get: operations['alternative-names-copy']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/popular': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Popular + * @description Get a list of people ordered by popularity. + */ + get: operations['person-popular-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Query the top level details of a person. + */ + get: operations['person-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}/changes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a person. + */ + get: operations['person-changes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}/combined_credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Combined Credits + * @description Get the combined movie and TV credits that belong to a person. + */ + get: operations['person-combined-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}/external_ids': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * External IDs + * @description Get the external ID's that belong to a person. + */ + get: operations['person-external-ids']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}/images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the profile images that belong to a person. + */ + get: operations['person-images']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/latest': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Latest + * @description Get the newest created person. This is a live response and will continuously change. + */ + get: operations['person-latest-id']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}/movie_credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie Credits + * @description Get the movie credits for a person. + */ + get: operations['person-movie-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}/tv_credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV Credits + * @description Get the TV credits that belong to a person. + */ + get: operations['person-tv-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}/tagged_images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Tagged Images + * @description Get the tagged images for a person. + */ + get: operations['person-tagged-images']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/person/{person_id}/translations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations that belong to a person. + */ + get: operations['translations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/review/{review_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Retrieve the details of a movie or TV show review. + */ + get: operations['review-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/search/collection': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Collection + * @description Search for collections by their original, translated and alternative names. + */ + get: operations['search-collection']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/search/company': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Company + * @description Search for companies by their original and alternative names. + */ + get: operations['search-company']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/search/keyword': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Keyword + * @description Search for keywords by their name. + */ + get: operations['search-keyword']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/search/movie': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie + * @description Search for movies by their original, translated and alternative titles. + */ + get: operations['search-movie']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/search/multi': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Multi + * @description Use multi search when you want to search for movies, TV shows and people in a single request. + */ + get: operations['search-multi']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/search/person': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Person + * @description Search for people by their name and also known as names. + */ + get: operations['search-person']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/search/tv': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV + * @description Search for TV shows by their original, translated and also known as names. + */ + get: operations['search-tv']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/trending/all/{time_window}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * All + * @description Get the trending movies, TV shows and people. + */ + get: operations['trending-all']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/trending/movie/{time_window}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movies + * @description Get the trending movies on TMDB. + */ + get: operations['trending-movies']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/trending/person/{time_window}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * People + * @description Get the trending people on TMDB. + */ + get: operations['trending-people']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/trending/tv/{time_window}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV + * @description Get the trending TV shows on TMDB. + */ + get: operations['trending-tv']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/airing_today': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Airing Today + * @description Get a list of TV shows airing today. + */ + get: operations['tv-series-airing-today-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/on_the_air': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * On The Air + * @description Get a list of TV shows that air in the next 7 days. + */ + get: operations['tv-series-on-the-air-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/popular': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Popular + * @description Get a list of TV shows ordered by popularity. + */ + get: operations['tv-series-popular-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/top_rated': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Top Rated + * @description Get a list of TV shows ordered by rating. + */ + get: operations['tv-series-top-rated-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the details of a TV show. + */ + get: operations['tv-series-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/account_states': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Account States + * @description Get the rating, watchlist and favourite status. + */ + get: operations['tv-series-account-states']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/aggregate_credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Aggregate Credits + * @description Get the aggregate credits (cast and crew) that have been added to a TV show. + */ + get: operations['tv-series-aggregate-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/alternative_titles': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Alternative Titles + * @description Get the alternative titles that have been added to a TV show. + */ + get: operations['tv-series-alternative-titles']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/changes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a TV show. + */ + get: operations['tv-series-changes']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/content_ratings': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Content Ratings + * @description Get the content ratings that have been added to a TV show. + */ + get: operations['tv-series-content-ratings']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Credits + * @description Get the latest season credits of a TV show. + */ + get: operations['tv-series-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/episode_groups': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Episode Groups + * @description Get the episode groups that have been added to a TV show. + */ + get: operations['tv-series-episode-groups']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/external_ids': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * External IDs + * @description Get a list of external IDs that have been added to a TV show. + */ + get: operations['tv-series-external-ids']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a TV series. + */ + get: operations['tv-series-images']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/keywords': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Keywords + * @description Get a list of keywords that have been added to a TV show. + */ + get: operations['tv-series-keywords']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/latest': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Latest + * @description Get the newest TV show ID. + */ + get: operations['tv-series-latest-id']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/lists': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists + * @description Get the lists that a TV series has been added to. + */ + get: operations['lists-copy']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/recommendations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Recommendations */ + get: operations['tv-series-recommendations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/reviews': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Reviews + * @description Get the reviews that have been added to a TV show. + */ + get: operations['tv-series-reviews']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/screened_theatrically': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Screened Theatrically + * @description Get the seasons and episodes that have screened theatrically. + */ + get: operations['tv-series-screened-theatrically']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/similar': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Similar + * @description Get the similar TV shows. + */ + get: operations['tv-series-similar']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/translations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations that have been added to a TV show. + */ + get: operations['tv-series-translations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/videos': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Videos + * @description Get the videos that belong to a TV show. + */ + get: operations['tv-series-videos']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/watch/providers': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watch Providers + * @description Get the list of streaming providers we have for a TV show. + */ + get: operations['tv-series-watch-providers']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/rating': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Rating + * @description Rate a TV show and save it to your rated list. + */ + post: operations['tv-series-add-rating']; + /** Delete Rating */ + delete: operations['tv-series-delete-rating']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Query the details of a TV season. + */ + get: operations['tv-season-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/account_states': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Account States + * @description Get the rating, watchlist and favourite status. + */ + get: operations['tv-season-account-states']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/aggregate_credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Aggregate Credits + * @description Get the aggregate credits (cast and crew) that have been added to a TV season. + */ + get: operations['tv-season-aggregate-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/season/{season_id}/changes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a TV season. + */ + get: operations['tv-season-changes-by-id']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Credits */ + get: operations['tv-season-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/external_ids': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * External IDs + * @description Get a list of external IDs that have been added to a TV season. + */ + get: operations['tv-season-external-ids']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a TV season. + */ + get: operations['tv-season-images']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/translations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations for a TV season. + */ + get: operations['tv-season-translations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/videos': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Videos + * @description Get the videos that belong to a TV season. + */ + get: operations['tv-season-videos']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/watch/providers': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watch Providers + * @description Get the list of streaming providers we have for a TV season. + */ + get: operations['tv-season-watch-providers']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/episode/{episode_number}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Query the details of a TV episode. + */ + get: operations['tv-episode-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/account_states': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Account States + * @description Get the rating, watchlist and favourite status. + */ + get: operations['tv-episode-account-states']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/episode/{episode_id}/changes': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a TV episode. + */ + get: operations['tv-episode-changes-by-id']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/credits': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Credits */ + get: operations['tv-episode-credits']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/external_ids': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * External IDs + * @description Get a list of external IDs that have been added to a TV episode. + */ + get: operations['tv-episode-external-ids']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/images': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a TV episode. + */ + get: operations['tv-episode-images']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/translations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations that have been added to a TV episode. + */ + get: operations['tv-episode-translations']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/videos': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Videos + * @description Get the videos that belong to a TV episode. + */ + get: operations['tv-episode-videos']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/rating': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Rating + * @description Rate a TV episode and save it to your rated list. + */ + post: operations['tv-episode-add-rating']; + /** + * Delete Rating + * @description Delete your rating on a TV episode. + */ + delete: operations['tv-episode-delete-rating']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/tv/episode_group/{tv_episode_group_id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the details of a TV episode group. + */ + get: operations['tv-episode-group-details']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/watch/providers/regions': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Available Regions + * @description Get the list of the countries we have watch provider (OTT/streaming) data for. + */ + get: operations['watch-providers-available-regions']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/watch/providers/movie': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie Providers + * @description Get the list of streaming providers we have for movies. + */ + get: operations['watch-providers-movie-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/3/watch/providers/tv': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV Providers + * @description Get the list of streaming providers we have for TV shows. + */ + get: operations['watch-provider-tv-list']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + 'authentication-validate-key': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example true + */ + success: boolean; + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + /** @description 401 */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 7 + */ + status_code: number; + /** @example Invalid API key: You must be granted a valid key. */ + status_message?: string; + /** + * @default true + * @example false + */ + success: boolean; + }; + }; + }; + }; + }; + 'account-details': { + parameters: { + query?: { + session_id?: string; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + avatar?: { + gravatar?: { + /** @example c9e9fc152ee756a900db85757c29815d */ + hash?: string; + }; + tmdb?: { + /** @example /xy44UvpbTgzs9kWmp4C3fEaCl5h.png */ + avatar_path?: string; + }; + }; + /** + * @default 0 + * @example 548 + */ + id: number; + /** @example en */ + iso_639_1?: string; + /** @example CA */ + iso_3166_1?: string; + /** @example Travis Bell */ + name?: string; + /** + * @default true + * @example false + */ + include_adult: boolean; + /** @example travisbell */ + username?: string; + }; + }; + }; + }; + }; + 'account-add-favorite': { + parameters: { + query?: { + session_id?: string; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + 'account-add-to-watchlist': { + parameters: { + query?: { + session_id?: string; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + 'account-get-favorites': { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /se5Hxz7PArQZOG3Nx2bpfOhLhtV.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 9806 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example The Incredibles */ + original_title?: string; + /** @example Bob Parr has given up his superhero days to log in time as an insurance adjuster and raise his three children with his formerly heroic wife in suburbia. But when he receives a mysterious assignment, it's time to get back into costume. */ + overview?: string; + /** + * @default 0 + * @example 71.477 + */ + popularity: number; + /** @example /2LqaLgk4Z226KkgPJuiOQ58wvrm.jpg */ + poster_path?: string; + /** @example 2004-10-27 */ + release_date?: string; + /** @example The Incredibles */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.702 + */ + vote_average: number; + /** + * @default 0 + * @example 16162 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 4 + */ + total_pages: number; + /** + * @default 0 + * @example 80 + */ + total_results: number; + }; + }; + }; + }; + }; + 'account-favorite-tv': { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1396 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Breaking Bad */ + original_name?: string; + /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ + overview?: string; + /** + * @default 0 + * @example 292.904 + */ + popularity: number; + /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ + poster_path?: string; + /** @example 2008-01-20 */ + first_air_date?: string; + /** @example Breaking Bad */ + name?: string; + /** + * @default 0 + * @example 8.878 + */ + vote_average: number; + /** + * @default 0 + * @example 11548 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 4 + */ + total_pages: number; + /** + * @default 0 + * @example 68 + */ + total_results: number; + }; + }; + }; + }; + }; + 'account-lists': { + parameters: { + query?: { + page?: number; + session_id?: string; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example */ + description?: string; + /** + * @default 0 + * @example 0 + */ + favorite_count: number; + /** + * @default 0 + * @example 120174 + */ + id: number; + /** + * @default 0 + * @example 5 + */ + item_count: number; + /** @example en */ + iso_639_1?: string; + /** @example movie */ + list_type?: string; + /** @example Test Alpha Sort */ + name?: string; + poster_path?: unknown; + }[]; + /** + * @default 0 + * @example 2 + */ + total_pages: number; + /** + * @default 0 + * @example 25 + */ + total_results: number; + }; + }; + }; + }; + }; + 'account-rated-movies': { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /dUVbWINfRMGojGZRcO6GF1Z2nV8.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 120 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example The Lord of the Rings: The Fellowship of the Ring */ + original_title?: string; + /** @example Young hobbit Frodo Baggins, after inheriting a mysterious ring from his uncle Bilbo, must leave his home in order to keep it from falling into the hands of its evil creator. Along the way, a fellowship is formed to protect the ringbearer and make sure that the ring arrives at its final destination: Mt. Doom, the only place where it can be destroyed. */ + overview?: string; + /** + * @default 0 + * @example 84.737 + */ + popularity: number; + /** @example /6oom5QYQ2yQTMJIbnvbkBL9cHo6.jpg */ + poster_path?: string; + /** @example 2001-12-18 */ + release_date?: string; + /** @example The Lord of the Rings: The Fellowship of the Ring */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.396 + */ + vote_average: number; + /** + * @default 0 + * @example 22579 + */ + vote_count: number; + /** + * @default 0 + * @example 8 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 47 + */ + total_pages: number; + /** + * @default 0 + * @example 940 + */ + total_results: number; + }; + }; + }; + }; + }; + 'account-rated-tv': { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /2yZXtM2Kky1Sy0kachbDlwybl3y.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1705 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Fringe */ + original_name?: string; + /** @example FBI Special Agent Olivia Dunham, brilliant but formerly institutionalized scientist Walter Bishop and his scheming, reluctant son Peter uncover a deadly mystery involving a series of unbelievable events and realize they may be a part of a larger, more disturbing pattern that blurs the line between science fiction and technology. */ + overview?: string; + /** + * @default 0 + * @example 151.906 + */ + popularity: number; + /** @example /sY9hg5dLJ93RJOyKEiu1nAtBRND.jpg */ + poster_path?: string; + /** @example 2008-09-09 */ + first_air_date?: string; + /** @example Fringe */ + name?: string; + /** + * @default 0 + * @example 8.109 + */ + vote_average: number; + /** + * @default 0 + * @example 2050 + */ + vote_count: number; + /** + * @default 0 + * @example 9 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 15 + */ + total_pages: number; + /** + * @default 0 + * @example 290 + */ + total_results: number; + }; + }; + }; + }; + }; + 'account-rated-tv-episodes': { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example 2013-10-17 */ + air_date?: string; + /** + * @default 0 + * @example 5 + */ + episode_number: number; + /** + * @default 0 + * @example 64782 + */ + id: number; + /** @example The Workplace Proximity */ + name?: string; + /** @example Amy starts working at Caltech which causes friction with Sheldon. Howard agrees with Sheldon who mentions this to Bernadette causing a big fight for the Wolowitzes. */ + overview?: string; + /** @example 4X5305 */ + production_code?: string; + /** + * @default 0 + * @example 22 + */ + runtime: number; + /** + * @default 0 + * @example 7 + */ + season_number: number; + /** + * @default 0 + * @example 1418 + */ + show_id: number; + /** @example /k8atjbd5gAsntuhbPnFpvnvo0qn.jpg */ + still_path?: string; + /** + * @default 0 + * @example 7.242 + */ + vote_average: number; + /** + * @default 0 + * @example 31 + */ + vote_count: number; + /** + * @default 0 + * @example 8 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 10 + */ + total_pages: number; + /** + * @default 0 + * @example 186 + */ + total_results: number; + }; + }; + }; + }; + }; + 'account-watchlist-movies': { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /rgNzvSagnlc32TuMEBa529QFIig.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 76726 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Chronicle */ + original_title?: string; + /** @example Three high school students make an incredible discovery, leading to their developing uncanny powers beyond their understanding. As they learn to control their abilities and use them to their advantage, their lives start to spin out of control, and their darker sides begin to take over. */ + overview?: string; + /** + * @default 0 + * @example 37.148 + */ + popularity: number; + /** @example /xENglsVIIWEEhhB5lgpy33tGcKI.jpg */ + poster_path?: string; + /** @example 2012-02-01 */ + release_date?: string; + /** @example Chronicle */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.822 + */ + vote_average: number; + /** + * @default 0 + * @example 4741 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 34 + */ + total_pages: number; + /** + * @default 0 + * @example 677 + */ + total_results: number; + }; + }; + }; + }; + }; + 'account-watchlist-tv': { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /7phlGHRupo38EnuwmkAHdNUqov3.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 58932 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example The Crazy Ones */ + original_name?: string; + /** @example The Crazy Ones is an American situation comedy series created by David E. Kelley that stars Robin Williams and Sarah Michelle Gellar. The single-camera project premiered on CBS on September 26, 2013, as part of the 2013–14 American television season as a Thursday night 9 pm entry. Bill D'Elia, Dean Lorey, Jason Winer, John Montgomery and Mark Teitelbaum serve as executive producers for 20th Century Fox Television. */ + overview?: string; + /** + * @default 0 + * @example 8.939 + */ + popularity: number; + /** @example /s2e7hTrdmNUaJDf0yDP5b4AHvrD.jpg */ + poster_path?: string; + /** @example 2013-09-26 */ + first_air_date?: string; + /** @example The Crazy Ones */ + name?: string; + /** + * @default 0 + * @example 6.176 + */ + vote_average: number; + /** + * @default 0 + * @example 94 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 17 + */ + total_pages: number; + /** + * @default 0 + * @example 325 + */ + total_results: number; + }; + }; + }; + }; + }; + 'authentication-create-guest-session': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 1ce82ec1223641636ad4a60b07de3581 */ + guest_session_id?: string; + /** @example 2016-08-27 16:26:40 UTC */ + expires_at?: string; + }; + }; + }; + }; + }; + 'authentication-create-request-token': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 2016-08-26 17:04:39 UTC */ + expires_at?: string; + /** @example ff5c7eeb5a8870efe3cd7fc5c282cffd26800ecd */ + request_token?: string; + }; + }; + }; + }; + }; + 'authentication-create-session': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 79191836ddaa0da3df76a5ffef6f07ad6ab0c641 */ + session_id?: string; + }; + }; + }; + }; + }; + 'authentication-create-session-from-v4-token': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 2629f70fb498edc263a0adb99118ac41f0053e8c */ + session_id?: string; + }; + }; + }; + }; + }; + 'authentication-create-session-from-login': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 2018-07-24 04:10:26 UTC */ + expires_at?: string; + /** @example 1531f1a558c8357ce8990cf887ff196e8f5402ec */ + request_token?: string; + }; + }; + }; + }; + }; + 'authentication-delete-session': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example true + */ + success: boolean; + }; + }; + }; + }; + }; + 'certification-movie-list': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + certifications?: { + AU?: { + /** @example E */ + certification?: string; + /** @example Exempt from classification. Films that are exempt from classification must not contain contentious material (i.e. material that would ordinarily be rated M or higher). */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + BG?: { + /** @example D */ + certification?: string; + /** @example Prohibited for persons under 16. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + BR?: { + /** @example 14 */ + certification?: string; + /** @example Not recommended for minors under fourteen. More violent material, stronger sex references and/or nudity. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + CA?: { + /** @example G */ + certification?: string; + /** @example All ages. */ + meaning?: string; + /** + * @default 0 + * @example 2 + */ + order: number; + }[]; + 'CA-QC'?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + DE?: { + /** @example 12 */ + certification?: string; + /** @example Children 12 or older admitted, children between 6 and 11 only when accompanied by parent or a legal guardian. */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + DK?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + ES?: { + /** @example A */ + certification?: string; + /** @example General admission. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + FI?: { + /** @example K-16 */ + certification?: string; + /** @example Over 16 years. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + FR?: { + /** @example TP */ + certification?: string; + /** @example Valid for all audiences. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + GB?: { + /** @example 15 */ + certification?: string; + /** @example Only those over 15 years are admitted. Nobody younger than 15 can rent or buy a 15-rated VHS, DVD, Blu-ray Disc, UMD or game, or watch a film in the cinema with this rating. Films under this category can contain adult themes, hard drugs, frequent strong language and limited use of very strong language, strong violence and strong sex references, and nudity without graphic detail. Sexual activity may be portrayed but without any strong detail. Sexual violence may be shown if discreet and justified by context. */ + meaning?: string; + /** + * @default 0 + * @example 5 + */ + order: number; + }[]; + HU?: { + /** @example 6 */ + certification?: string; + /** @example Not recommended below age of 6. */ + meaning?: string; + /** + * @default 0 + * @example 2 + */ + order: number; + }[]; + IN?: { + /** @example U */ + certification?: string; + /** @example Unrestricted Public Exhibition throughout India, suitable for all age groups. Films under this category should not upset children over 4. Such films may contain educational, social or family-oriented themes. Films under this category may also contain fantasy violence and/or mild bad language. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IT?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + LT?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + MY?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + NL?: { + /** @example AL */ + certification?: string; + /** @example All ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + NO?: { + /** @example 6 */ + certification?: string; + /** @example 6 years (no restriction for children accompanied by an adult). */ + meaning?: string; + /** + * @default 0 + * @example 2 + */ + order: number; + }[]; + NZ?: { + /** @example G */ + certification?: string; + /** @example Suitable for general audiences. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + PH?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + PT?: { + /** @example Públicos */ + certification?: string; + /** @example For all the public (especially designed for children under 3 years of age). */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + RU?: { + /** @example 6+ */ + certification?: string; + /** @example (For children above 6) – Unsuitable for children under 6. */ + meaning?: string; + /** + * @default 0 + * @example 2 + */ + order: number; + }[]; + SE?: { + /** @example 11 */ + certification?: string; + /** @example Children over the age of 7, who are accompanied by an adult, are admitted to films that have been passed for children from the age of 11. */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + US?: { + /** @example R */ + certification?: string; + /** @example Under 17 requires accompanying parent or adult guardian 21 or older. The parent/guardian is required to stay with the child under 17 through the entire movie, even if the parent gives the child/teenager permission to see the film alone. These films may contain strong profanity, graphic sexuality, nudity, strong violence, horror, gore, and strong drug use. A movie rated R for profanity often has more severe or frequent language than the PG-13 rating would permit. An R-rated movie may have more blood, gore, drug use, nudity, or graphic sexuality than a PG-13 movie would admit. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + KR?: { + /** @example All */ + certification?: string; + /** @example Film suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + SK?: { + /** @example U */ + certification?: string; + /** @example General audience. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TH?: { + /** @example P */ + certification?: string; + /** @example Educational. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + MX?: { + /** @example AA */ + certification?: string; + /** @example Informative-only rating: Understandable for children under 7 years. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ID?: { + /** @example SU */ + certification?: string; + /** @example All ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TR?: { + /** @example Genel İzleyici Kitlesi */ + certification?: string; + /** @example General audience. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + AR?: { + /** @example ATP */ + certification?: string; + /** @example For all public. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + GR?: { + /** @example K */ + certification?: string; + /** @example No restrictions. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TW?: { + /** @example 0+ */ + certification?: string; + /** @example Viewing is permitted for audiences of all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ZA?: { + /** @example A */ + certification?: string; + /** @example Suitable for all. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + SG?: { + /** @example G */ + certification?: string; + /** @example Suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IE?: { + /** @example G */ + certification?: string; + /** @example Suitable for children of school going age (note: children can be enrolled in school from the age of 4). */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + PR?: { + /** @example G */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + JP?: { + /** @example G */ + certification?: string; + /** @example General, suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + VI?: { + /** @example G */ + certification?: string; + /** @example All ages admitted. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + CH?: { + /** @example 0 */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IL?: { + /** @example All */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + HK?: { + /** @example I */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + MO?: { + /** @example A */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + LV?: { + /** @example U */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + LU?: { + /** @example EA */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + }; + }; + }; + }; + }; + }; + 'certifications-tv-list': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + certifications?: { + AU?: { + /** @example P */ + certification?: string; + /** @example Programming is intended for younger children 2–11; commercial stations must show at least 30 minutes of P-rated content each weekday and weekends at all times. No advertisements may be shown during P-rated programs. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + BR?: { + /** @example 14 */ + certification?: string; + /** @example Content suitable for viewers over the age of 14. */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + CA?: { + /** @example Exempt */ + certification?: string; + /** @example Shows which are exempt from ratings (such as news and sports programming) will not display an on-screen rating at all. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + 'CA-QC'?: { + /** @example 18+ */ + certification?: string; + /** @example Only to be viewed by adults and may contain extreme violence and graphic sexual content. It is mostly used for 18+ movies and pornography. */ + meaning?: string; + /** + * @default 0 + * @example 5 + */ + order: number; + }[]; + DE?: { + /** @example 0 */ + certification?: string; + /** @example Can be aired at any time. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ES?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + FR?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + GB?: { + /** @example U */ + certification?: string; + /** @example The U symbol stands for Universal. A U film should be suitable for audiences aged four years and over. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + HU?: { + /** @example Unrated */ + certification?: string; + /** @example Without age restriction. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + KR?: { + /** @example Exempt */ + certification?: string; + /** @example This rating is only for knowledge based game shows; lifestyle shows; documentary shows; news; current topic discussion shows; education/culture shows; sports that excludes MMA or other violent sports; and other programs that Korea Communications Standards Commission recognizes. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + LT?: { + /** @example S */ + certification?: string; + /** @example Intended for adult viewers from the age of 18 (corresponding to the age-appropriate index N-18) and broadcast between 23 (11pm) and 6 (6am) hours; Limited to minors and intended for adult audiences. */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + NL?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + PH?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + PT?: { + /** @example 12AP */ + certification?: string; + /** @example Acompanhamento Parental (may not be suitable for children under 12, parental guidance advised). */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + RU?: { + /** @example 16+ */ + certification?: string; + /** @example Only teens the age of 16 or older can watch. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + SK?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + TH?: { + /** @example ส */ + certification?: string; + /** @example Sor - Educational movies which the public should be encouraged to see. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + US?: { + /** @example TV-MA */ + certification?: string; + /** @example This program is specifically designed to be viewed by adults and therefore may be unsuitable for children under 17. */ + meaning?: string; + /** + * @default 0 + * @example 6 + */ + order: number; + }[]; + IT?: { + /** @example T */ + certification?: string; + /** @example All ages admitted. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + FI?: { + /** @example S */ + certification?: string; + /** @example Allowed at all times. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + MY?: { + /** @example U */ + certification?: string; + /** @example No age limit. Can be broadcast anytime. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + NZ?: { + /** @example G */ + certification?: string; + /** @example Approved for general viewing. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + NO?: { + /** @example A */ + certification?: string; + /** @example Allowed at all times. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + BG?: { + /** @example Unrated */ + certification?: string; + /** @example Can be viewed for each age. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + MX?: { + /** @example AA */ + certification?: string; + /** @example Aimed at children (can be broadcast anytime). */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IN?: { + /** @example U */ + certification?: string; + /** @example Viewable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + DK?: { + /** @example A */ + certification?: string; + /** @example Suitable for a general audience. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + SE?: { + /** @example Btl */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ID?: { + /** @example SU */ + certification?: string; + /** @example Suitable for general audiences over the age of 2 years. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TR?: { + /** @example Genel İzleyici */ + certification?: string; + /** @example General audience. Suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + AR?: { + /** @example ATP */ + certification?: string; + /** @example Suitable for all audiences. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + PL?: { + /** @example 0 */ + certification?: string; + /** @example Positive or neutral view of the world, little to no violence, non-sexual love, and no sexual content. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + MA?: { + /** @example NR */ + certification?: string; + /** @example All audiences. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + GR?: { + /** @example K */ + certification?: string; + /** @example Suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IL?: { + /** @example E */ + certification?: string; + /** @example Exempt from classification. This rating is usually applied to live broadcasts. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TW?: { + /** @example 0+ */ + certification?: string; + /** @example Suitable for watching by general audiences. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ZA?: { + /** @example All */ + certification?: string; + /** @example This is a programme/film that does not contain any obscenity, and is suitable for family viewing. A logo must be displayed in the corner of the screen for 30 seconds after each commercial break. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + SG?: { + /** @example G */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + PR?: { + /** @example NR */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + VI?: { + /** @example NR */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + }; + }; + }; + }; + }; + }; + 'changes-movie-list': { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + results?: { + /** + * @default 0 + * @example 1120293 + */ + id: number; + /** + * @default true + * @example false + */ + adult: boolean; + }[]; + /** + * @default 0 + * @example 3 + */ + page: number; + /** + * @default 0 + * @example 57 + */ + total_pages: number; + /** + * @default 0 + * @example 5700 + */ + total_results: number; + }; + }; + }; + }; + }; + 'changes-people-list': { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + results?: { + /** + * @default 0 + * @example 4037513 + */ + id: number; + /** + * @default true + * @example false + */ + adult: boolean; + }[]; + /** + * @default 0 + * @example 1 + */ + page: number; + /** + * @default 0 + * @example 53 + */ + total_pages: number; + /** + * @default 0 + * @example 5292 + */ + total_results: number; + }; + }; + }; + }; + }; + 'changes-tv-list': { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + results?: { + /** + * @default 0 + * @example 225591 + */ + id: number; + /** + * @default true + * @example false + */ + adult: boolean; + }[]; + /** + * @default 0 + * @example 1 + */ + page: number; + /** + * @default 0 + * @example 18 + */ + total_pages: number; + /** + * @default 0 + * @example 1763 + */ + total_results: number; + }; + }; + }; + }; + }; + 'collection-details': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + collection_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 10 + */ + id: number; + /** @example Star Wars Collection */ + name?: string; + /** @example en */ + original_language?: string; + /** @example Star Wars Collection */ + original_name?: string; + /** @example An epic space-opera theatrical film series, which depicts the adventures of various characters "a long time ago in a galaxy far, far away…." */ + overview?: string; + /** @example /22dj38IckjzEEUZwN1tPU5VJ1qq.jpg */ + poster_path?: string; + /** @example /4z9ijhgEthfRHShoOvMaBlpciXS.jpg */ + backdrop_path?: string; + parts?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /2w4xG178RpB4MDAIfTkqAuSJzec.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 11 + */ + id: number; + /** @example Star Wars */ + name?: string; + /** @example Star Wars */ + original_name?: string; + /** @example Princess Leia is captured and held hostage by the evil Imperial forces in their effort to take over the galactic Empire. Venturesome Luke Skywalker and dashing captain Han Solo team together with the loveable robot duo R2-D2 and C-3PO to rescue the beautiful princess and restore peace and justice in the Empire. */ + overview?: string; + /** @example /6FfCtAuVAW8XJjZ7eWeLibRLWTw.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + /** @example en */ + original_language?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 15.8557 + */ + popularity: number; + /** @example 1977-05-25 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.205 + */ + vote_average: number; + /** + * @default 0 + * @example 21522 + */ + vote_count: number; + }[]; + }; + }; + }; + }; + }; + 'collection-images': { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + collection_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 10 + */ + id: number; + backdrops?: { + /** + * @default 0 + * @example 1.778 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 1080 + */ + height: number; + iso_639_1?: unknown; + /** @example /d8duYyyC9J5T825Hg7grmaabfxQ.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.464 + */ + vote_average: number; + /** + * @default 0 + * @example 30 + */ + vote_count: number; + /** + * @default 0 + * @example 1920 + */ + width: number; + }[]; + posters?: { + /** + * @default 0 + * @example 0.667 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 3000 + */ + height: number; + /** @example en */ + iso_639_1?: string; + /** @example /r8Ph5MYXL04Qzu4QBbq2KjqwtkQ.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.516 + */ + vote_average: number; + /** + * @default 0 + * @example 14 + */ + vote_count: number; + /** + * @default 0 + * @example 2000 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + 'collection-translations': { + parameters: { + query?: never; + header?: never; + path: { + collection_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 10 + */ + id: number; + translations?: { + /** @example AE */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example */ + title?: string; + /** @example */ + overview?: string; + /** @example */ + homepage?: string; + }; + }[]; + }; + }; + }; + }; + }; + 'company-details': { + parameters: { + query?: never; + header?: never; + path: { + company_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example */ + description?: string; + /** @example San Francisco, California */ + headquarters?: string; + /** @example https://www.lucasfilm.com */ + homepage?: string; + /** + * @default 0 + * @example 1 + */ + id: number; + /** @example /o86DbpburjxrqAzEDhXZcyE8pDb.png */ + logo_path?: string; + /** @example Lucasfilm Ltd. */ + name?: string; + /** @example US */ + origin_country?: string; + parent_company?: unknown; + }; + }; + }; + }; + }; + 'company-alternative-names': { + parameters: { + query?: never; + header?: never; + path: { + company_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + id: number; + results?: { + /** @example 루카스필름 */ + name?: string; + /** @example */ + type?: string; + }[]; + }; + }; + }; + }; + }; + 'company-images': { + parameters: { + query?: never; + header?: never; + path: { + company_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + id: number; + logos?: { + /** + * @default 0 + * @example 2.97979797979798 + */ + aspect_ratio: number; + /** @example /o86DbpburjxrqAzEDhXZcyE8pDb.png */ + file_path?: string; + /** + * @default 0 + * @example 99 + */ + height: number; + /** @example 5aa080d6c3a3683fea00011e */ + id?: string; + /** @example .svg */ + file_type?: string; + /** + * @default 0 + * @example 5.384 + */ + vote_average: number; + /** + * @default 0 + * @example 2 + */ + vote_count: number; + /** + * @default 0 + * @example 295 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + 'configuration-details': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + images?: { + /** @example http://image.tmdb.org/t/p/ */ + base_url?: string; + /** @example https://image.tmdb.org/t/p/ */ + secure_base_url?: string; + backdrop_sizes?: string[]; + logo_sizes?: string[]; + poster_sizes?: string[]; + profile_sizes?: string[]; + still_sizes?: string[]; + }; + change_keys?: string[]; + }; + }; + }; + }; + }; + 'configuration-countries': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example AD */ + iso_3166_1?: string; + /** @example Andorra */ + english_name?: string; + /** @example Andorra */ + native_name?: string; + }[]; + }; + }; + }; + }; + 'configuration-jobs': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example Production */ + department?: string; + jobs?: string[]; + }[]; + }; + }; + }; + }; + 'configuration-languages': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example bi */ + iso_639_1?: string; + /** @example Bislama */ + english_name?: string; + /** @example */ + name?: string; + }[]; + }; + }; + }; + }; + 'configuration-primary-translations': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': string[]; + }; + }; + }; + }; + 'configuration-timezones': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example AD */ + iso_3166_1?: string; + zones?: string[]; + }[]; + }; + }; + }; + }; + 'credit-details': { + parameters: { + query?: never; + header?: never; + path: { + credit_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example cast */ + credit_type?: string; + /** @example Acting */ + department?: string; + /** @example Actor */ + job?: string; + media?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /uDgy6hyPd82kOHh6I95FLtLnj6p.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 100088 + */ + id: number; + /** @example The Last of Us */ + name?: string; + /** @example en */ + original_language?: string; + /** @example The Last of Us */ + original_name?: string; + /** @example Zwanzig Jahre nachdem die moderne Zivilisation zerstört wurde. – Joel, ein abgehärteter Überlebender, wird angeheuert, um Ellie, ein 14-jähriges Mädchen, aus einer bedrückenden Quarantänezone zu schmuggeln. Was als kleiner Job beginnt, wird bald zu einer brutalen, herzzerreißenden Reise, bei der die beiden die USA durchqueren müssen und aufeinander angewiesen sind, um zu überleben. */ + overview?: string; + /** @example /igwIPNClQpGVzb61QlGqcpT5zUy.jpg */ + poster_path?: string; + /** @example tv */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 898.378 + */ + popularity: number; + /** @example 2023-01-15 */ + first_air_date?: string; + /** + * @default 0 + * @example 8.749 + */ + vote_average: number; + /** + * @default 0 + * @example 3341 + */ + vote_count: number; + origin_country?: string[]; + /** @example Joel Miller */ + character?: string; + episodes?: unknown[]; + seasons?: { + /** @example 2023-01-15 */ + air_date?: string; + /** + * @default 0 + * @example 9 + */ + episode_count: number; + /** + * @default 0 + * @example 144593 + */ + id: number; + /** @example Staffel 1 */ + name?: string; + /** @example Die 1. Staffel der Endzeit-Horrorserie The Last of Us feierte ihre Premiere am 15. Januar 2023 bei HBO. In Staffel 1 beginnt für den Überlebenden Joel und das Mädchen Ellie eine Reise durch das postapokalyptische Amerika, in dem Plünderer und mutierte Wesen ihnen nach dem Leben trachten. */ + overview?: string; + /** @example /aUQKIpZZ31KWbpdHMCmaV76u78T.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 100088 + */ + show_id: number; + }[]; + }; + /** @example tv */ + media_type?: string; + /** @example 6024a814c0ae36003d59cc3c */ + id?: string; + person?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1253360 + */ + id: number; + /** @example Pedro Pascal */ + name?: string; + /** @example Pedro Pascal */ + original_name?: string; + /** @example person */ + media_type?: string; + /** + * @default 0 + * @example 106.095 + */ + popularity: number; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** @example Acting */ + known_for_department?: string; + /** @example /dBOrm29cr7NUrjiDQMTtrTyDpfy.jpg */ + profile_path?: string; + }; + }; + }; + }; + }; + }; + 'discover-movie': { + parameters: { + query?: { + /** @description use in conjunction with `region` */ + certification?: string; + /** @description use in conjunction with `region` */ + 'certification.gte'?: string; + /** @description use in conjunction with `region` */ + 'certification.lte'?: string; + /** @description use in conjunction with the `certification`, `certification.gte` and `certification.lte` filters */ + certification_country?: string; + include_adult?: boolean; + include_video?: boolean; + language?: string; + page?: number; + primary_release_year?: number; + 'primary_release_date.gte'?: string; + 'primary_release_date.lte'?: string; + region?: string; + 'release_date.gte'?: string; + 'release_date.lte'?: string; + sort_by?: + | 'original_title.asc' + | 'original_title.desc' + | 'popularity.asc' + | 'popularity.desc' + | 'revenue.asc' + | 'revenue.desc' + | 'primary_release_date.asc' + | 'title.asc' + | 'title.desc' + | 'primary_release_date.desc' + | 'vote_average.asc' + | 'vote_average.desc' + | 'vote_count.asc' + | 'vote_count.desc'; + 'vote_average.gte'?: number; + 'vote_average.lte'?: number; + 'vote_count.gte'?: number; + 'vote_count.lte'?: number; + /** @description use in conjunction with `with_watch_monetization_types ` or `with_watch_providers ` */ + watch_region?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_cast?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_companies?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_crew?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_genres?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_keywords?: string; + with_origin_country?: string; + with_original_language?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_people?: string; + /** @description possible values are: [1, 2, 3, 4, 5, 6] can be a comma (`AND`) or pipe (`OR`) separated query, can be used in conjunction with `region` */ + with_release_type?: number; + 'with_runtime.gte'?: number; + 'with_runtime.lte'?: number; + /** @description possible values are: [flatrate, free, ads, rent, buy] use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ + with_watch_monetization_types?: string; + /** @description use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ + with_watch_providers?: string; + without_companies?: string; + without_genres?: string; + without_keywords?: string; + without_watch_providers?: string; + year?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /8YFL5QQVPy3AgrEQxNYVSgiPEbe.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 640146 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + original_title?: string; + /** @example Super-Hero partners Scott Lang and Hope van Dyne, along with with Hope's parents Janet van Dyne and Hank Pym, and Scott's daughter Cassie Lang, find themselves exploring the Quantum Realm, interacting with strange new creatures and embarking on an adventure that will push them beyond the limits of what they thought possible. */ + overview?: string; + /** + * @default 0 + * @example 9272.643 + */ + popularity: number; + /** @example /ngl2FKBlU4fhbdsrtdom9LVLBXw.jpg */ + poster_path?: string; + /** @example 2023-02-15 */ + release_date?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.5 + */ + vote_average: number; + /** + * @default 0 + * @example 1856 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 38020 + */ + total_pages: number; + /** + * @default 0 + * @example 760385 + */ + total_results: number; + }; + }; + }; + }; + }; + 'discover-tv': { + parameters: { + query?: { + 'air_date.gte'?: string; + 'air_date.lte'?: string; + first_air_date_year?: number; + 'first_air_date.gte'?: string; + 'first_air_date.lte'?: string; + include_adult?: boolean; + include_null_first_air_dates?: boolean; + language?: string; + page?: number; + screened_theatrically?: boolean; + sort_by?: + | 'first_air_date.asc' + | 'first_air_date.desc' + | 'name.asc' + | 'name.desc' + | 'original_name.asc' + | 'original_name.desc' + | 'popularity.asc' + | 'popularity.desc' + | 'vote_average.asc' + | 'vote_average.desc' + | 'vote_count.asc' + | 'vote_count.desc'; + timezone?: string; + 'vote_average.gte'?: number; + 'vote_average.lte'?: number; + 'vote_count.gte'?: number; + 'vote_count.lte'?: number; + /** @description use in conjunction with `with_watch_monetization_types ` or `with_watch_providers ` */ + watch_region?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_companies?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_genres?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_keywords?: string; + with_networks?: number; + with_origin_country?: string; + with_original_language?: string; + 'with_runtime.gte'?: number; + 'with_runtime.lte'?: number; + /** @description possible values are: [0, 1, 2, 3, 4, 5], can be a comma (`AND`) or pipe (`OR`) separated query */ + with_status?: string; + /** @description possible values are: [flatrate, free, ads, rent, buy] use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ + with_watch_monetization_types?: string; + /** @description use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ + with_watch_providers?: string; + without_companies?: string; + without_genres?: string; + without_keywords?: string; + without_watch_providers?: string; + /** @description possible values are: [0, 1, 2, 3, 4, 5, 6], can be a comma (`AND`) or pipe (`OR`) separated query */ + with_type?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ + backdrop_path?: string; + /** @example 2023-01-23 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 202250 + */ + id: number; + /** @example Dirty Linen */ + name?: string; + origin_country?: string[]; + /** @example tl */ + original_language?: string; + /** @example Dirty Linen */ + original_name?: string; + /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ + overview?: string; + /** + * @default 0 + * @example 2684.061 + */ + popularity: number; + /** @example /ujlkQtHAVShWyWTloGU2Vh5Jbo9.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 5 + */ + vote_average: number; + /** + * @default 0 + * @example 13 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 7414 + */ + total_pages: number; + /** + * @default 0 + * @example 148265 + */ + total_results: number; + }; + }; + }; + }; + }; + 'find-by-id': { + parameters: { + query: { + external_source: '' | 'imdb_id' | 'facebook_id' | 'instagram_id' | 'tvdb_id' | 'tiktok_id' | 'twitter_id' | 'wikidata_id' | 'youtube_id'; + language?: string; + }; + header?: never; + path: { + external_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + movie_results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 934433 + */ + id: number; + /** @example Scream VI */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Scream VI */ + original_title?: string; + /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ + overview?: string; + /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 853.917 + */ + popularity: number; + /** @example 2023-03-08 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.388 + */ + vote_average: number; + /** + * @default 0 + * @example 708 + */ + vote_count: number; + }[]; + person_results?: unknown[]; + tv_results?: unknown[]; + tv_episode_results?: unknown[]; + tv_season_results?: unknown[]; + }; + }; + }; + }; + }; + 'genre-movie-list': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + genres?: { + /** + * @default 0 + * @example 28 + */ + id: number; + /** @example Action */ + name?: string; + }[]; + }; + }; + }; + }; + }; + 'genre-tv-list': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + genres?: { + /** + * @default 0 + * @example 10759 + */ + id: number; + /** @example Action & Adventure */ + name?: string; + }[]; + }; + }; + }; + }; + }; + 'guest-session-rated-movies': { + parameters: { + query?: { + language?: string; + page?: number; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + guest_session_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /ikR2qy9xJCHX7M8i5rcvuNfdYXs.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 16 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Dancer in the Dark */ + original_title?: string; + /** @example Selma, a Czech immigrant on the verge of blindness, struggles to make ends meet for herself and her son, who has inherited the same genetic disorder and will suffer the same fate without an expensive operation. When life gets too difficult, Selma learns to cope through her love of musicals, escaping life's troubles - even if just for a moment - by dreaming up little numbers to the rhythmic beats of her surroundings. */ + overview?: string; + /** + * @default 0 + * @example 14.684 + */ + popularity: number; + /** @example /8Wdd3fQfbbQeoSfWpHrDfaFNhBU.jpg */ + poster_path?: string; + /** @example 2000-06-30 */ + release_date?: string; + /** @example Dancer in the Dark */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.885 + */ + vote_average: number; + /** + * @default 0 + * @example 1549 + */ + vote_count: number; + /** + * @default 0 + * @example 8.5 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + 'guest-session-rated-tv': { + parameters: { + query?: { + language?: string; + page?: number; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + guest_session_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /2OMB0ynKlyIenMJWI2Dy9IWT4c.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Game of Thrones */ + original_name?: string; + /** @example Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and icy horrors beyond. */ + overview?: string; + /** + * @default 0 + * @example 404.299 + */ + popularity: number; + /** @example /7WUHnWGx5OO145IRxPDUkQSh4C7.jpg */ + poster_path?: string; + /** @example 2011-04-17 */ + first_air_date?: string; + /** @example Game of Thrones */ + name?: string; + /** + * @default 0 + * @example 8.436 + */ + vote_average: number; + /** + * @default 0 + * @example 21025 + */ + vote_count: number; + /** + * @default 0 + * @example 8.5 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + 'guest-session-rated-tv-episodes': { + parameters: { + query?: { + language?: string; + page?: number; + sort_by?: 'created_at.asc' | 'created_at.desc'; + }; + header?: never; + path: { + guest_session_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example 2011-04-17 */ + air_date?: string; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + /** + * @default 0 + * @example 63056 + */ + id: number; + /** @example Winter Is Coming */ + name?: string; + /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ + overview?: string; + /** @example 101 */ + production_code?: string; + /** + * @default 0 + * @example 62 + */ + runtime: number; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 1399 + */ + show_id: number; + /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ + still_path?: string; + /** + * @default 0 + * @example 7.843 + */ + vote_average: number; + /** + * @default 0 + * @example 286 + */ + vote_count: number; + /** + * @default 0 + * @example 8.5 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + 'keyword-details': { + parameters: { + query?: never; + header?: never; + path: { + keyword_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1701 + */ + id: number; + /** @example hero */ + name?: string; + }; + }; + }; + }; + }; + 'keyword-movies': { + parameters: { + query?: { + include_adult?: boolean; + language?: string; + page?: number; + }; + header?: never; + path: { + keyword_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1701 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3CxUndGhUcZdt1Zggjdb2HkLLQX.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 640146 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + original_title?: string; + /** @example Das Superhelden-Duo Scott Lang und Hope Van Dyne erkundet zusammen mit Hopes Eltern Hank Pym und Janet Van Dyne das Quantenreich, interagiert mit seltsamen neuen Kreaturen und begibt sich auf ein Abenteuer, das sie über die Grenzen dessen hinaustreiben wird, was sie für möglich gehalten haben. */ + overview?: string; + /** + * @default 0 + * @example 9200.005 + */ + popularity: number; + /** @example /nA5otwVxAfpBP4PVgeuBk3qHcLY.jpg */ + poster_path?: string; + /** @example 2023-02-15 */ + release_date?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.5 + */ + vote_average: number; + /** + * @default 0 + * @example 2079 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 11 + */ + total_pages: number; + /** + * @default 0 + * @example 211 + */ + total_results: number; + }; + }; + }; + }; + }; + 'list-add-movie': { + parameters: { + query: { + session_id: string; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY?: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 12 + */ + status_code: number; + /** @example The item/record was updated successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + 'list-check-item-status': { + parameters: { + query?: { + language?: string; + movie_id?: number; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + id: number; + /** + * @default true + * @example true + */ + item_present: boolean; + }; + }; + }; + }; + }; + 'list-clear': { + parameters: { + query: { + session_id: string; + confirm: boolean; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 12 + */ + status_code: number; + /** @example The item/record was updated successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + 'list-create': { + parameters: { + query: { + session_id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example The item/record was created successfully. */ + status_message?: string; + /** + * @default true + * @example true + */ + success: boolean; + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** + * @default 0 + * @example 5861 + */ + list_id: number; + }; + }; + }; + }; + }; + 'list-details': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example travisbell */ + created_by?: string; + /** @example The idea behind this list is to collect the live action comic book movies from within the Marvel franchise. */ + description?: string; + /** + * @default 0 + * @example 0 + */ + favorite_count: number; + /** @example 1 */ + id?: string; + items?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /14QbnygCuTO0vl7CAFmPf1fgZfV.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 634649 + */ + id: number; + /** @example movie */ + media_type?: string; + /** @example en */ + original_language?: string; + /** @example Spider-Man: No Way Home */ + original_title?: string; + /** @example Peter Parker ist demaskiert und kann sein normales Leben nicht mehr von den hohen Einsätzen als Superheld trennen. Als er Doctor Strange um Hilfe bittet, wird die Lage noch gefährlicher und er muss entdecken, was es wirklich bedeutet, Spider-Man zu sein. */ + overview?: string; + /** + * @default 0 + * @example 398.217 + */ + popularity: number; + /** @example /iNKf4D0AzOj9GLq8ZyG3WZaqibL.jpg */ + poster_path?: string; + /** @example 2021-12-15 */ + release_date?: string; + /** @example Spider-Man: No Way Home */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8 + */ + vote_average: number; + /** + * @default 0 + * @example 17267 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 59 + */ + item_count: number; + /** @example en */ + iso_639_1?: string; + /** @example The Marvel Universe */ + name?: string; + /** @example /coJVIUEOToAEGViuhclM7pXC75R.jpg */ + poster_path?: string; + }; + }; + }; + }; + }; + 'list-delete': { + parameters: { + query: { + session_id: string; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 12 + */ + status_code: number; + /** @example The item/record was updated successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + 'list-remove-movie': { + parameters: { + query: { + session_id: string; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 13 + */ + status_code: number; + /** @example The item/record was deleted successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + 'movie-now-playing-list': { + parameters: { + query?: { + language?: string; + page?: number; + /** @description ISO-3166-1 code */ + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + dates?: { + /** @example 2023-05-03 */ + maximum?: string; + /** @example 2023-03-16 */ + minimum?: string; + }; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /iJQIbOPm81fPEGKt5BPuZmfnA54.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 502356 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example The Super Mario Bros. Movie */ + original_title?: string; + /** @example While working underground to fix a water main, Brooklyn plumbers—and brothers—Mario and Luigi are transported down a mysterious pipe and wander into a magical new world. But when the brothers are separated, Mario embarks on an epic quest to find Luigi. */ + overview?: string; + /** + * @default 0 + * @example 6572.614 + */ + popularity: number; + /** @example /qNBAXBIQlnOThrVvA6mA2B5ggV6.jpg */ + poster_path?: string; + /** @example 2023-04-05 */ + release_date?: string; + /** @example The Super Mario Bros. Movie */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.5 + */ + vote_average: number; + /** + * @default 0 + * @example 1456 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 87 + */ + total_pages: number; + /** + * @default 0 + * @example 1734 + */ + total_results: number; + }; + }; + }; + }; + }; + 'movie-popular-list': { + parameters: { + query?: { + language?: string; + page?: number; + /** @description ISO-3166-1 code */ + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /gMJngTNfaqCSCqGD4y8lVMZXKDn.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 640146 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + original_title?: string; + /** @example Super-Hero partners Scott Lang and Hope van Dyne, along with with Hope's parents Janet van Dyne and Hank Pym, and Scott's daughter Cassie Lang, find themselves exploring the Quantum Realm, interacting with strange new creatures and embarking on an adventure that will push them beyond the limits of what they thought possible. */ + overview?: string; + /** + * @default 0 + * @example 8567.865 + */ + popularity: number; + /** @example /ngl2FKBlU4fhbdsrtdom9LVLBXw.jpg */ + poster_path?: string; + /** @example 2023-02-15 */ + release_date?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.5 + */ + vote_average: number; + /** + * @default 0 + * @example 1886 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 38029 + */ + total_pages: number; + /** + * @default 0 + * @example 760569 + */ + total_results: number; + }; + }; + }; + }; + }; + 'movie-top-rated-list': { + parameters: { + query?: { + language?: string; + page?: number; + /** @description ISO-3166-1 code */ + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /tmU7GeKVybMWFButWEGl2M4GeiP.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 238 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example The Godfather */ + original_title?: string; + /** @example Spanning the years 1945 to 1955, a chronicle of the fictional Italian-American Corleone crime family. When organized crime family patriarch, Vito Corleone barely survives an attempt on his life, his youngest son, Michael steps in to take care of the would-be killers, launching a campaign of bloody revenge. */ + overview?: string; + /** + * @default 0 + * @example 100.932 + */ + popularity: number; + /** @example /3bhkrj58Vtu7enYsRolD1fZdja1.jpg */ + poster_path?: string; + /** @example 1972-03-14 */ + release_date?: string; + /** @example The Godfather */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.7 + */ + vote_average: number; + /** + * @default 0 + * @example 17806 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 552 + */ + total_pages: number; + /** + * @default 0 + * @example 11032 + */ + total_results: number; + }; + }; + }; + }; + }; + 'movie-upcoming-list': { + parameters: { + query?: { + language?: string; + page?: number; + /** @description ISO-3166-1 code */ + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + dates?: { + /** @example 2023-05-23 */ + maximum?: string; + /** @example 2023-05-04 */ + minimum?: string; + }; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /7bWxAsNPv9CXHOhZbJVlj2KxgfP.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 713704 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Evil Dead Rise */ + original_title?: string; + /** @example Two sisters find an ancient vinyl that gives birth to bloodthirsty demons that run amok in a Los Angeles apartment building and thrusts them into a primal battle for survival as they face the most nightmarish version of family imaginable. */ + overview?: string; + /** + * @default 0 + * @example 1696.367 + */ + popularity: number; + /** @example /mIBCtPvKZQlxubxKMeViO2UrP3q.jpg */ + poster_path?: string; + /** @example 2023-04-12 */ + release_date?: string; + /** @example Evil Dead Rise */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7 + */ + vote_average: number; + /** + * @default 0 + * @example 207 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 19 + */ + total_pages: number; + /** + * @default 0 + * @example 369 + */ + total_results: number; + }; + }; + }; + }; + }; + 'movie-details': { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ + backdrop_path?: string; + belongs_to_collection?: unknown; + /** + * @default 0 + * @example 63000000 + */ + budget: number; + genres?: { + /** + * @default 0 + * @example 18 + */ + id: number; + /** @example Drama */ + name?: string; + }[]; + /** @example http://www.foxmovies.com/movies/fight-club */ + homepage?: string; + /** + * @default 0 + * @example 550 + */ + id: number; + /** @example tt0137523 */ + imdb_id?: string; + /** @example en */ + original_language?: string; + /** @example Fight Club */ + original_title?: string; + /** @example A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground "fight clubs" forming in every town, until an eccentric gets in the way and ignites an out-of-control spiral toward oblivion. */ + overview?: string; + /** + * @default 0 + * @example 61.416 + */ + popularity: number; + /** @example /pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg */ + poster_path?: string; + production_companies?: { + /** + * @default 0 + * @example 508 + */ + id: number; + /** @example /7cxRWzi4LsVm4Utfpr1hfARNurT.png */ + logo_path?: string; + /** @example Regency Enterprises */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + production_countries?: { + /** @example US */ + iso_3166_1?: string; + /** @example United States of America */ + name?: string; + }[]; + /** @example 1999-10-15 */ + release_date?: string; + /** + * @default 0 + * @example 100853753 + */ + revenue: number; + /** + * @default 0 + * @example 139 + */ + runtime: number; + spoken_languages?: { + /** @example English */ + english_name?: string; + /** @example en */ + iso_639_1?: string; + /** @example English */ + name?: string; + }[]; + /** @example Released */ + status?: string; + /** @example Mischief. Mayhem. Soap. */ + tagline?: string; + /** @example Fight Club */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.433 + */ + vote_average: number; + /** + * @default 0 + * @example 26280 + */ + vote_count: number; + }; + }; + }; + }; + }; + 'movie-account-states': { + parameters: { + query?: { + session_id?: string; + guest_session_id?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default true + * @example true + */ + favorite: boolean; + rated?: { + /** + * @default 0 + * @example 9 + */ + value: number; + }; + /** + * @default true + * @example false + */ + watchlist: boolean; + }; + }; + }; + }; + }; + 'movie-alternative-titles': { + parameters: { + query?: { + /** @description specify a ISO-3166-1 value to filter the results */ + country?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + titles?: { + /** @example RS */ + iso_3166_1?: string; + /** @example Borilački klub */ + title?: string; + /** @example */ + type?: string; + }[]; + }; + }; + }; + }; + }; + 'movie-changes': { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + changes?: { + /** @example images */ + key?: string; + items?: { + /** @example 643197b96dea3a00d4377270 */ + id?: string; + /** @example added */ + action?: string; + /** @example 2023-04-08 16:35:05 UTC */ + time?: string; + /** @example */ + iso_639_1?: string; + /** @example */ + iso_3166_1?: string; + value?: { + poster?: { + /** @example /s9ZrHprviFCx3azfWNBtt1LPSnL.jpg */ + file_path?: string; + }; + }; + }[]; + }[]; + }; + }; + }; + }; + }; + 'movie-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 819 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Edward Norton */ + name?: string; + /** @example Edward Norton */ + original_name?: string; + /** + * @default 0 + * @example 26.99 + */ + popularity: number; + /** @example /8nytsqL59SFJTVYVrN72k6qkGgJ.jpg */ + profile_path?: string; + /** + * @default 0 + * @example 4 + */ + cast_id: number; + /** @example The Narrator */ + character?: string; + /** @example 52fe4250c3a36847f80149f3 */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 376 + */ + id: number; + /** @example Production */ + known_for_department?: string; + /** @example Arnon Milchan */ + name?: string; + /** @example Arnon Milchan */ + original_name?: string; + /** + * @default 0 + * @example 2.931 + */ + popularity: number; + /** @example /b2hBExX4NnczNAnLuTBF4kmNhZm.jpg */ + profile_path?: string; + /** @example 55731b8192514111610027d7 */ + credit_id?: string; + /** @example Production */ + department?: string; + /** @example Executive Producer */ + job?: string; + }[]; + }; + }; + }; + }; + }; + 'movie-external-ids': { + parameters: { + query?: never; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + /** @example tt0137523 */ + imdb_id?: string; + wikidata_id?: unknown; + /** @example FightClub */ + facebook_id?: string; + instagram_id?: unknown; + twitter_id?: unknown; + }; + }; + }; + }; + }; + 'movie-images': { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + backdrops?: { + /** + * @default 0 + * @example 1.778 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 800 + */ + height: number; + iso_639_1?: unknown; + /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.622 + */ + vote_average: number; + /** + * @default 0 + * @example 20 + */ + vote_count: number; + /** + * @default 0 + * @example 1422 + */ + width: number; + }[]; + /** + * @default 0 + * @example 550 + */ + id: number; + logos?: { + /** + * @default 0 + * @example 5.203 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 79 + */ + height: number; + /** @example he */ + iso_639_1?: string; + /** @example /c1KLulrIhUqY5fT42nmC5aERGCp.png */ + file_path?: string; + /** + * @default 0 + * @example 5.312 + */ + vote_average: number; + /** + * @default 0 + * @example 1 + */ + vote_count: number; + /** + * @default 0 + * @example 411 + */ + width: number; + }[]; + posters?: { + /** + * @default 0 + * @example 0.667 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 900 + */ + height: number; + /** @example pt */ + iso_639_1?: string; + /** @example /r3pPehX4ik8NLYPpbDRAh0YRtMb.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.258 + */ + vote_average: number; + /** + * @default 0 + * @example 6 + */ + vote_count: number; + /** + * @default 0 + * @example 600 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + 'movie-keywords': { + parameters: { + query?: never; + header?: never; + path: { + movie_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + keywords?: { + /** + * @default 0 + * @example 818 + */ + id: number; + /** @example based on novel or book */ + name?: string; + }[]; + }; + }; + }; + }; + }; + 'movie-latest-id': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example false + */ + adult: boolean; + backdrop_path?: unknown; + belongs_to_collection?: unknown; + /** + * @default 0 + * @example 0 + */ + budget: number; + genres?: unknown[]; + /** @example */ + homepage?: string; + /** + * @default 0 + * @example 1119232 + */ + id: number; + imdb_id?: unknown; + /** @example fr */ + original_language?: string; + /** @example König Charles III */ + original_title?: string; + /** @example */ + overview?: string; + /** + * @default 0 + * @example 0 + */ + popularity: number; + poster_path?: unknown; + production_companies?: unknown[]; + production_countries?: unknown[]; + /** @example */ + release_date?: string; + /** + * @default 0 + * @example 0 + */ + revenue: number; + /** + * @default 0 + * @example 0 + */ + runtime: number; + spoken_languages?: unknown[]; + /** @example Released */ + status?: string; + /** @example */ + tagline?: string; + /** @example König Charles III */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 0 + */ + vote_average: number; + /** + * @default 0 + * @example 0 + */ + vote_count: number; + }; + }; + }; + }; + }; + 'movie-lists': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example Movies I own */ + description?: string; + /** + * @default 0 + * @example 0 + */ + favorite_count: number; + /** + * @default 0 + * @example 8248696 + */ + id: number; + /** + * @default 0 + * @example 409 + */ + item_count: number; + /** @example en */ + iso_639_1?: string; + /** @example movie */ + list_type?: string; + /** @example My Movies */ + name?: string; + poster_path?: unknown; + }[]; + /** + * @default 0 + * @example 122 + */ + total_pages: number; + /** + * @default 0 + * @example 2422 + */ + total_results: number; + }; + }; + }; + }; + }; + 'movie-recommendations': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': Record; + }; + }; + }; + }; + 'movie-release-dates': { + parameters: { + query?: never; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + results?: { + /** @example BG */ + iso_3166_1?: string; + release_dates?: { + /** @example c */ + certification?: string; + descriptors?: unknown[]; + /** @example */ + iso_639_1?: string; + /** @example */ + note?: string; + /** @example 2012-08-28T00:00:00.000Z */ + release_date?: string; + /** + * @default 0 + * @example 3 + */ + type: number; + }[]; + }[]; + }; + }; + }; + }; + }; + 'movie-reviews': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example Goddard */ + author?: string; + author_details?: { + /** @example */ + name?: string; + /** @example Goddard */ + username?: string; + /** @example /https://secure.gravatar.com/avatar/f248ec34f953bc62cafcbdd81fddd6b6.jpg */ + avatar_path?: string; + rating?: unknown; + }; + /** @example Pretty awesome movie. It shows what one crazy person can convince other crazy people to do. Everyone needs something to believe in. I recommend Jesus Christ, but they want Tyler Durden. */ + content?: string; + /** @example 2018-06-09T17:51:53.359Z */ + created_at?: string; + /** @example 5b1c13b9c3a36848f2026384 */ + id?: string; + /** @example 2021-06-23T15:58:09.421Z */ + updated_at?: string; + /** @example https://www.themoviedb.org/review/5b1c13b9c3a36848f2026384 */ + url?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 8 + */ + total_results: number; + }; + }; + }; + }; + }; + 'movie-similar': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3YAldML4EDyoC6RBpzceALigrAZ.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 9300 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Orlando */ + original_title?: string; + /** @example England, 1600. Queen Elizabeth I promises Orlando, a young nobleman obsessed with poetry, that she will grant him land and fortune if he agrees to satisfy a very particular request. */ + overview?: string; + /** + * @default 0 + * @example 7.768 + */ + popularity: number; + /** @example /xvz0qZkXXMq3dH2Revxii8drxWc.jpg */ + poster_path?: string; + /** @example 1992-12-11 */ + release_date?: string; + /** @example Orlando */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.966 + */ + vote_average: number; + /** + * @default 0 + * @example 262 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 364 + */ + total_pages: number; + /** + * @default 0 + * @example 7269 + */ + total_results: number; + }; + }; + }; + }; + }; + 'movie-translations': { + parameters: { + query?: never; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + translations?: { + /** @example SA */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example */ + homepage?: string; + /** @example إدوارد يتعرض لضغوط حتى يصل به الحال إلى أنه لا يستطيع النوم لفتراتٍ طويلة، لكنه يجد بعض السلام في جلسات العلاج النفسي الجماعي، يتعرف إدوارد على أحد الأشخاص وهو (تايلر ديردن) الذي يحرره من تعلقه بالأشياء الذي تستعبده ،ثم يحرره من خوفه من الناس. يقومان معًا بإنشاء نادي القتال الذي يجذب الكثير من الأفراد المحبطين ،الذين يقومون بإخراج طاقة غضبهم وكرههم للعالم في القتال. */ + overview?: string; + /** + * @default 0 + * @example 0 + */ + runtime: number; + /** @example */ + tagline?: string; + /** @example */ + title?: string; + }; + }[]; + }; + }; + }; + }; + }; + 'movie-videos': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + results?: { + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Fight Club (1999) Trailer - Starring Brad Pitt, Edward Norton, Helena Bonham Carter */ + name?: string; + /** @example O-b2VfmmbyA */ + key?: string; + /** @example YouTube */ + site?: string; + /** + * @default 0 + * @example 720 + */ + size: number; + /** @example Trailer */ + type?: string; + /** + * @default true + * @example false + */ + official: boolean; + /** @example 2016-03-05T02:03:14.000Z */ + published_at?: string; + /** @example 639d5326be6d88007f170f44 */ + id?: string; + }[]; + }; + }; + }; + }; + }; + 'movie-watch-providers': { + parameters: { + query?: never; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + results?: { + AE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AE */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + AL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AL */ + link?: string; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + AR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AR */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + AT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AT */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + AU?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AU */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + BA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BA */ + link?: string; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + BB?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BB */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + BE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BE */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + BG?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BG */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + BH?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BH */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + BO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BO */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + BR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BR */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + BS?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BS */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + CA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CA */ + link?: string; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /sB5vHrmYmliwUvBwZe8HpXo9r8m.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 305 + */ + provider_id: number; + /** @example Crave Starz */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + CH?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CH */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /rVOOhp6V8FheEAKtFAJMLMbnaMZ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 150 + */ + provider_id: number; + /** @example blue TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /rVOOhp6V8FheEAKtFAJMLMbnaMZ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 150 + */ + provider_id: number; + /** @example blue TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + CL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CL */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + CO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CO */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + CR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CR */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + CV?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CV */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + CZ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CZ */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /wTF37o4jOkQfjnWe41gmeuASYZA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 308 + */ + provider_id: number; + /** @example O2 TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + DE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DE */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + DK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DK */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + DO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DO */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + EC?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EC */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + EE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EE */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + EG?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EG */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + ES?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ES */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + ads?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + FI?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FI */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + FJ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FJ */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + FR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FR */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + GB?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GB */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + GF?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GF */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + GI?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GI */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + GR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GR */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + GT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GT */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + HK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HK */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + HN?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HN */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + HR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HR */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + ads?: { + /** @example /xrHrIraInfRXnrz1zHhY1tXJowg.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 572 + */ + provider_id: number; + /** @example RTL Play */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + HU?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HU */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + ID?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ID */ + link?: string; + flatrate?: { + /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 122 + */ + provider_id: number; + /** @example Hotstar */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + IE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IE */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + IL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IL */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + IN?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IN */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + IQ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IQ */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + IS?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IS */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + IT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IT */ + link?: string; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + JM?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JM */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + JO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JO */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + JP?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JP */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /g8jqHtXJsMlc8B1Gb0Rt8AvUJMn.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 85 + */ + provider_id: number; + /** @example dTV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + KR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=KR */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /2ioan5BX5L9tz4fIGU93blTeFhv.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 356 + */ + provider_id: number; + /** @example wavve */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + KW?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=KW */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + LB?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LB */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + LI?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LI */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + LT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LT */ + link?: string; + rent?: { + /** @example /xTVM8uXT9QocigQ07LE7Irc65W2.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 553 + */ + provider_id: number; + /** @example Telia Play */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + LV?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LV */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + MD?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MD */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 26 + */ + display_priority: number; + }[]; + }; + MK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MK */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + MT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MT */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + MU?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MU */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + }; + MX?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MX */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + MY?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MY */ + link?: string; + flatrate?: { + /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 122 + */ + provider_id: number; + /** @example Hotstar */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + MZ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MZ */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 16 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 16 + */ + display_priority: number; + }[]; + }; + NL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NL */ + link?: string; + buy?: { + /** @example /llmnYOyknekZsXtkCaazKjhTLvG.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 71 + */ + provider_id: number; + /** @example Pathé Thuis */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + rent?: { + /** @example /llmnYOyknekZsXtkCaazKjhTLvG.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 71 + */ + provider_id: number; + /** @example Pathé Thuis */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + NO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NO */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + NZ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NZ */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + OM?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=OM */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PA */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PE */ + link?: string; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + PH?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PH */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PK */ + link?: string; + flatrate?: { + /** @example /t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 8 + */ + provider_id: number; + /** @example Netflix */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + PL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PL */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PS?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PS */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PT */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + rent?: { + /** @example /dUeHhim2WUZz8S7EWjv0Ws6anRP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 242 + */ + provider_id: number; + /** @example Meo */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PY?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PY */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + QA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=QA */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + RO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RO */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + RS?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RS */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + RU?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RU */ + link?: string; + rent?: { + /** @example /o9ExgOSLF3OTwR6T3DJOuwOKJgq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 113 + */ + provider_id: number; + /** @example Ivi */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + buy?: { + /** @example /o9ExgOSLF3OTwR6T3DJOuwOKJgq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 113 + */ + provider_id: number; + /** @example Ivi */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /zLM7f1w2L8TU2Fspzns72m6h3yY.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 501 + */ + provider_id: number; + /** @example Wink */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + SA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SA */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + SE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SE */ + link?: string; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + rent?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + SG?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SG */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + SI?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SI */ + link?: string; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + SK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SK */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + SM?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SM */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + SV?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SV */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + TH?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TH */ + link?: string; + flatrate?: { + /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 122 + */ + provider_id: number; + /** @example Hotstar */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + TR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TR */ + link?: string; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + TT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TT */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + TW?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TW */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + UG?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=UG */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 16 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 16 + */ + display_priority: number; + }[]; + }; + US?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=US */ + link?: string; + rent?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jPXksae158ukMLFhhlNvzsvaEyt.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 257 + */ + provider_id: number; + /** @example fuboTV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + UY?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=UY */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + VE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=VE */ + link?: string; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + YE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=YE */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + ZA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ZA */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + }; + }; + }; + }; + }; + }; + 'movie-add-rating': { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header: { + 'Content-Type': string; + }; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + 'movie-delete-rating': { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header?: { + 'Content-Type'?: string; + }; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 13 + */ + status_code: number; + /** @example The item/record was deleted successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + 'network-details': { + parameters: { + query?: never; + header?: never; + path: { + network_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example New York City, New York */ + headquarters?: string; + /** @example https://www.hbo.com */ + homepage?: string; + /** + * @default 0 + * @example 49 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }; + }; + }; + }; + }; + 'details-copy': { + parameters: { + query?: never; + header?: never; + path: { + network_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 49 + */ + id: number; + results?: { + /** @example Home Box Office */ + name?: string; + /** @example */ + type?: string; + }[]; + }; + }; + }; + }; + }; + 'alternative-names-copy': { + parameters: { + query?: never; + header?: never; + path: { + network_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 49 + */ + id: number; + logos?: { + /** + * @default 0 + * @example 2.425287356321839 + */ + aspect_ratio: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + file_path?: string; + /** + * @default 0 + * @example 174 + */ + height: number; + /** @example 5a7a67a40e0a26020a000091 */ + id?: string; + /** @example .svg */ + file_type?: string; + /** + * @default 0 + * @example 5.318 + */ + vote_average: number; + /** + * @default 0 + * @example 3 + */ + vote_count: number; + /** + * @default 0 + * @example 422 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + 'person-popular-list': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** + * @default 0 + * @example 224513 + */ + id: number; + known_for?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /ilRyazdMJwN05exqhwK4tMKBYZs.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 335984 + */ + id: number; + /** @example movie */ + media_type?: string; + /** @example en */ + original_language?: string; + /** @example Blade Runner 2049 */ + original_title?: string; + /** @example Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years. */ + overview?: string; + /** @example /gajva2L0rPYkEWjzgFlBXCAVBE5.jpg */ + poster_path?: string; + /** @example 2017-10-04 */ + release_date?: string; + /** @example Blade Runner 2049 */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.5 + */ + vote_average: number; + /** + * @default 0 + * @example 11771 + */ + vote_count: number; + }[]; + /** @example Acting */ + known_for_department?: string; + /** @example Ana de Armas */ + name?: string; + /** + * @default 0 + * @example 343.33 + */ + popularity: number; + /** @example /3vxvsmYLTf4jnr163SUlBIw51ee.jpg */ + profile_path?: string; + }[]; + /** + * @default 0 + * @example 500 + */ + total_pages: number; + /** + * @default 0 + * @example 10000 + */ + total_results: number; + }; + }; + }; + }; + }; + 'person-details': { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example false + */ + adult: boolean; + also_known_as?: string[]; + /** + * @example Thomas Jeffrey Hanks (born July 9, 1956) is an American actor and filmmaker. Known for both his comedic and dramatic roles, Hanks is one of the most popular and recognizable film stars worldwide, and is widely regarded as an American cultural icon. + * + * Hanks made his breakthrough with leading roles in the comedies Splash (1984) and Big (1988). He won two consecutive Academy Awards for Best Actor for starring as a gay lawyer suffering from AIDS in Philadelphia (1993) and a young man with below-average IQ in Forrest Gump (1994). Hanks collaborated with film director Steven Spielberg on five films: Saving Private Ryan (1998), Catch Me If You Can (2002), The Terminal (2004), Bridge of Spies (2015), and The Post (2017), as well as the 2001 miniseries Band of Brothers, which launched him as a director, producer, and screenwriter. + * + * Hanks' other notable films include the romantic comedies Sleepless in Seattle (1993) and You've Got Mail (1998); the dramas Apollo 13 (1995), The Green Mile (1999), Cast Away (2000), Road to Perdition (2002), and Cloud Atlas (2012); and the biographical dramas Saving Mr. Banks (2013), Captain Phillips (2013), Sully (2016), and A Beautiful Day in the Neighborhood (2019). He has also appeared as the title character in the Robert Langdon film series, and has voiced Sheriff Woody in the Toy Story film series. + * + * Description above from the Wikipedia article Tom Hanks, licensed under CC-BY-SA, full list of contributors on Wikipedia. + */ + biography?: string; + /** @example 1956-07-09 */ + birthday?: string; + deathday?: unknown; + /** + * @default 0 + * @example 2 + */ + gender: number; + homepage?: unknown; + /** + * @default 0 + * @example 31 + */ + id: number; + /** @example nm0000158 */ + imdb_id?: string; + /** @example Acting */ + known_for_department?: string; + /** @example Tom Hanks */ + name?: string; + /** @example Concord, California, USA */ + place_of_birth?: string; + /** + * @default 0 + * @example 82.989 + */ + popularity: number; + /** @example /xndWFsBlClOJFRdhSt4NBwiPq2o.jpg */ + profile_path?: string; + }; + }; + }; + }; + }; + 'person-changes': { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + changes?: { + /** @example biography */ + key?: string; + items?: { + /** @example 640469b113654500ba4e859a */ + id?: string; + /** @example added */ + action?: string; + /** @example 2023-03-05 10:06:41 UTC */ + time?: string; + /** @example ca */ + iso_639_1?: string; + /** @example ES */ + iso_3166_1?: string; + /** + * @example Thomas "Tom" Jeffrey Hanks (Concord, Califòrnia, 9 de juliol de 1956) és un actor de cinema i productor estatunidenc, guanyador dues vegades de l'Oscar al millor actor i considerat un dels més versàtils i talentosos del cinema actual. + * + * Hanks és l'actor que més diners ha guanyat de tota la història del cinema amb un total de gairebé sis mil milions de dòlars (setembre 2006). És també copropietari de Playtone, una companyia de producció de pel·lícules. + */ + value?: string; + }[]; + }[]; + }; + }; + }; + }; + }; + 'person-combined-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + person_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 13 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Forrest Gump */ + original_title?: string; + /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ + overview?: string; + /** + * @default 0 + * @example 62.225 + */ + popularity: number; + /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ + poster_path?: string; + /** @example 1994-06-23 */ + release_date?: string; + /** @example Forrest Gump */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.481 + */ + vote_average: number; + /** + * @default 0 + * @example 24535 + */ + vote_count: number; + /** @example Forrest Gump */ + character?: string; + /** @example 52fe420ec3a36847f800074f */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + /** @example movie */ + media_type?: string; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /tx3uj8GPWf5pzb0gWATJ4bokNHI.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 87061 + */ + id: number; + /** @example fr */ + original_language?: string; + /** @example Le Voyage extraordinaire */ + original_title?: string; + /** @example An account of the extraordinary life of film pioneer Georges Méliès (1861-1938) and the amazing story of the copy in color of his masterpiece “A Trip to the Moon” (1902), unexpectedly found in Spain and restored thanks to the heroic efforts of a group of true cinema lovers. */ + overview?: string; + /** + * @default 0 + * @example 6.007 + */ + popularity: number; + /** @example /zHNNT9gfiGsuadR6x38KYOp6ekq.jpg */ + poster_path?: string; + /** @example 2011-12-08 */ + release_date?: string; + /** @example The Extraordinary Voyage */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.6 + */ + vote_average: number; + /** + * @default 0 + * @example 47 + */ + vote_count: number; + /** @example 5d818a63d34eb3002c4f8fea */ + credit_id?: string; + /** @example Crew */ + department?: string; + /** @example Thanks */ + job?: string; + /** @example movie */ + media_type?: string; + }[]; + /** + * @default 0 + * @example 31 + */ + id: number; + }; + }; + }; + }; + }; + 'person-external-ids': { + parameters: { + query?: never; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 31 + */ + id: number; + /** @example /m/0bxtg */ + freebase_mid?: string; + /** @example /en/tom_hanks */ + freebase_id?: string; + /** @example nm0000158 */ + imdb_id?: string; + /** + * @default 0 + * @example 14293 + */ + tvrage_id: number; + /** @example Q2263 */ + wikidata_id?: string; + /** @example TomHanks */ + facebook_id?: string; + /** @example tomhanks */ + instagram_id?: string; + /** @example tomhanks */ + tiktok_id?: string; + /** @example tomhanks */ + twitter_id?: string; + youtube_id?: unknown; + }; + }; + }; + }; + }; + 'person-images': { + parameters: { + query?: never; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 287 + */ + id: number; + profiles?: { + /** + * @default 0 + * @example 0.666 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 980 + */ + height: number; + iso_639_1?: unknown; + /** @example /cckcYc2v0yh1tc9QjRelptcOBko.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.288 + */ + vote_average: number; + /** + * @default 0 + * @example 89 + */ + vote_count: number; + /** + * @default 0 + * @example 653 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + 'person-latest-id': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example false + */ + adult: boolean; + also_known_as?: unknown[]; + /** @example */ + biography?: string; + birthday?: unknown; + deathday?: unknown; + /** + * @default 0 + * @example 0 + */ + gender: number; + homepage?: unknown; + /** + * @default 0 + * @example 4064343 + */ + id: number; + imdb_id?: unknown; + known_for_department?: unknown; + /** @example Ángel Cruz */ + name?: string; + place_of_birth?: unknown; + /** + * @default 0 + * @example 0 + */ + popularity: number; + profile_path?: unknown; + }; + }; + }; + }; + }; + 'person-movie-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 13 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Forrest Gump */ + original_title?: string; + /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ + overview?: string; + /** + * @default 0 + * @example 62.225 + */ + popularity: number; + /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ + poster_path?: string; + /** @example 1994-06-23 */ + release_date?: string; + /** @example Forrest Gump */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.481 + */ + vote_average: number; + /** + * @default 0 + * @example 24535 + */ + vote_count: number; + /** @example Forrest Gump */ + character?: string; + /** @example 52fe420ec3a36847f800074f */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /tx3uj8GPWf5pzb0gWATJ4bokNHI.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 87061 + */ + id: number; + /** @example fr */ + original_language?: string; + /** @example Le Voyage extraordinaire */ + original_title?: string; + /** @example An account of the extraordinary life of film pioneer Georges Méliès (1861-1938) and the amazing story of the copy in color of his masterpiece “A Trip to the Moon” (1902), unexpectedly found in Spain and restored thanks to the heroic efforts of a group of true cinema lovers. */ + overview?: string; + /** + * @default 0 + * @example 6.007 + */ + popularity: number; + /** @example /zHNNT9gfiGsuadR6x38KYOp6ekq.jpg */ + poster_path?: string; + /** @example 2011-12-08 */ + release_date?: string; + /** @example The Extraordinary Voyage */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.6 + */ + vote_average: number; + /** + * @default 0 + * @example 47 + */ + vote_count: number; + /** @example 5d818a63d34eb3002c4f8fea */ + credit_id?: string; + /** @example Crew */ + department?: string; + /** @example Thanks */ + job?: string; + }[]; + /** + * @default 0 + * @example 31 + */ + id: number; + }; + }; + }; + }; + }; + 'person-tv-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /ttvojTMgaIN7U8gqB5LlNqO4vPN.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1900 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example LIVE with Kelly and Mark */ + original_name?: string; + /** @example A morning talk show with A-list celebrity guests, top-notch performances and one-of-a-kind segments that are unrivaled on daytime television, plus spontaneous, hilarious and unpredictable talk. */ + overview?: string; + /** + * @default 0 + * @example 700.508 + */ + popularity: number; + /** @example /l5y8egG27p2fSTyq8s21SQMmQLy.jpg */ + poster_path?: string; + /** @example 1988-09-05 */ + first_air_date?: string; + /** @example LIVE with Kelly and Mark */ + name?: string; + /** + * @default 0 + * @example 5.4 + */ + vote_average: number; + /** + * @default 0 + * @example 25 + */ + vote_count: number; + /** @example */ + character?: string; + /** @example 52571af019c29571140d5c92 */ + credit_id?: string; + /** + * @default 0 + * @example 1 + */ + episode_count: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /6uMA6EAiwcsCqQJwWgYwtORvE0v.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 2391 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Tales from the Crypt */ + original_name?: string; + /** @example Cadaverous scream legend the Crypt Keeper is your macabre host for these forays of fright and fun based on the classic E.C. Comics tales from back in the day. So shamble up to the bar and pick your poison. Will it be an insane Santa on a personal slay ride? Honeymooners out to fulfill the "til death do we part" vow ASAP? */ + overview?: string; + /** + * @default 0 + * @example 24.88 + */ + popularity: number; + /** @example /dDfXQH6Kg2JNASI0dqNALukjhk1.jpg */ + poster_path?: string; + /** @example 1989-06-10 */ + first_air_date?: string; + /** @example Tales from the Crypt */ + name?: string; + /** + * @default 0 + * @example 7.978 + */ + vote_average: number; + /** + * @default 0 + * @example 757 + */ + vote_count: number; + /** @example 525734f3760ee3776a397211 */ + credit_id?: string; + /** @example Directing */ + department?: string; + /** + * @default 0 + * @example 1 + */ + episode_count: number; + /** @example Director */ + job?: string; + }[]; + /** + * @default 0 + * @example 31 + */ + id: number; + }; + }; + }; + }; + }; + 'person-tagged-images': { + parameters: { + query?: { + page?: number; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 31 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default 0 + * @example 0.6666666666666666 + */ + aspect_ratio: number; + /** @example /1wY4psJ5NVEhCuOYROwLH2XExM2.jpg */ + file_path?: string; + /** + * @default 0 + * @example 1500 + */ + height: number; + /** @example 5b235d740e0a265b5d0031d9 */ + id?: string; + /** @example en */ + iso_639_1?: string; + /** + * @default 0 + * @example 5.456 + */ + vote_average: number; + /** + * @default 0 + * @example 7 + */ + vote_count: number; + /** + * @default 0 + * @example 1000 + */ + width: number; + /** @example poster */ + image_type?: string; + media?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /bdD39MpSVhKjxarTxLSfX6baoMP.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 857 + */ + id: number; + /** @example Saving Private Ryan */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Saving Private Ryan */ + original_title?: string; + /** @example As U.S. troops storm the beaches of Normandy, three brothers lie dead on the battlefield, with a fourth trapped behind enemy lines. Ranger captain John Miller and seven men are tasked with penetrating German-held territory and bringing the boy home. */ + overview?: string; + /** @example /uqx37cS8cpHg8U35f9U5IBlrCV3.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 70.45 + */ + popularity: number; + /** @example 1998-07-24 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.208 + */ + vote_average: number; + /** + * @default 0 + * @example 14134 + */ + vote_count: number; + }; + /** @example movie */ + media_type?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 13 + */ + total_results: number; + }; + }; + }; + }; + }; + translations: { + parameters: { + query?: never; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 31 + */ + id: number; + translations?: { + /** @example US */ + iso_3166_1?: string; + /** @example en */ + iso_639_1?: string; + /** @example English */ + name?: string; + /** @example English */ + english_name?: string; + data?: { + /** + * @example Thomas Jeffrey Hanks (born July 9, 1956) is an American actor and filmmaker. Known for both his comedic and dramatic roles, Hanks is one of the most popular and recognizable film stars worldwide, and is widely regarded as an American cultural icon. + * + * Hanks made his breakthrough with leading roles in the comedies Splash (1984) and Big (1988). He won two consecutive Academy Awards for Best Actor for starring as a gay lawyer suffering from AIDS in Philadelphia (1993) and a young man with below-average IQ in Forrest Gump (1994). Hanks collaborated with film director Steven Spielberg on five films: Saving Private Ryan (1998), Catch Me If You Can (2002), The Terminal (2004), Bridge of Spies (2015), and The Post (2017), as well as the 2001 miniseries Band of Brothers, which launched him as a director, producer, and screenwriter. + * + * Hanks' other notable films include the romantic comedies Sleepless in Seattle (1993) and You've Got Mail (1998); the dramas Apollo 13 (1995), The Green Mile (1999), Cast Away (2000), Road to Perdition (2002), and Cloud Atlas (2012); and the biographical dramas Saving Mr. Banks (2013), Captain Phillips (2013), Sully (2016), and A Beautiful Day in the Neighborhood (2019). He has also appeared as the title character in the Robert Langdon film series, and has voiced Sheriff Woody in the Toy Story film series. + * + * Description above from the Wikipedia article Tom Hanks, licensed under CC-BY-SA, full list of contributors on Wikipedia. + */ + biography?: string; + /** @example Tom Hanks */ + name?: string; + }; + }[]; + }; + }; + }; + }; + }; + 'review-details': { + parameters: { + query?: never; + header?: never; + path: { + review_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example 640b2aeecaaca20079decdcc */ + id?: string; + /** @example Ricardo Oliveira */ + author?: string; + author_details?: { + /** @example Ricardo Oliveira */ + name?: string; + /** @example RSOliveira */ + username?: string; + /** @example /23Cl7rhsknc7IIAcZZAGKzovjTu.jpg */ + avatar_path?: string; + /** + * @default 0 + * @example 9 + */ + rating: number; + }; + /** + * @example "The Last of Us" is a post-apocalyptic TV series based on the popular video game of the same name. The story follows the journey of Joel, a smuggler, and Ellie, a teenage girl who may be the key to finding a cure for a deadly fungal infection that has ravaged the world. + * + * The series features outstanding performances from Pedro Pascal as Joel, Bella Ramsey as Ellie, and Anna Torv as Tess. The chemistry between the main characters is excellent, and the casting is spot-on. + * + * The show's writing is superb, and it captures the essence of the video game while adding a fresh perspective. The narrative is engaging, and the pacing is just right, with each episode leaving you on the edge of your seat, eager to see what happens next. + * + * The show's production value is top-notch, with stunning visuals and cinematography that capture the bleak and haunting atmosphere of a post-apocalyptic world. The use of practical effects and makeup is impressive and adds to the overall immersion of the story. + * + * Overall, "The Last of Us" is an outstanding TV series that does justice to the source material. It's a must-watch for fans of the video game and anyone who enjoys gripping and emotional storytelling. I would rate it a 9 out of 10. + * + * + * + * Written and Reviewed by RSOliveira + */ + content?: string; + /** @example 2023-03-10T13:04:46.674Z */ + created_at?: string; + /** @example en */ + iso_639_1?: string; + /** + * @default 0 + * @example 100088 + */ + media_id: number; + /** @example The Last of Us */ + media_title?: string; + /** @example tv */ + media_type?: string; + /** @example 2023-03-10T13:04:46.734Z */ + updated_at?: string; + /** @example https://www.themoviedb.org/review/640b2aeecaaca20079decdcc */ + url?: string; + }; + }; + }; + }; + }; + 'search-collection': { + parameters: { + query: { + query: string; + include_adult?: boolean; + language?: string; + page?: number; + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /zuW6fOiusv4X9nnW3paHGfXcSll.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 86311 + */ + id: number; + /** @example The Avengers Collection */ + name?: string; + /** @example en */ + original_language?: string; + /** @example The Avengers Collection */ + original_name?: string; + /** @example A superhero film series produced by Marvel Studios based on the Marvel Comics superhero team of the same name, and part of the Marvel Cinematic Universe (MCU). The series features an ensemble cast from the Marvel Cinematic Universe series films, as they join forces for the peacekeeping organization S.H.I.E.L.D. led by Nick Fury. */ + overview?: string; + /** @example /yFSIUVTCvgYrpalUktulvk3Gi5Y.jpg */ + poster_path?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + 'search-company': { + parameters: { + query: { + query: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default 0 + * @example 3268 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + /** + * @default 0 + * @example 2 + */ + total_pages: number; + /** + * @default 0 + * @example 22 + */ + total_results: number; + }; + }; + }; + }; + }; + 'search-keyword': { + parameters: { + query: { + query: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default 0 + * @example 262419 + */ + id: number; + /** @example lost */ + name?: string; + }[]; + /** + * @default 0 + * @example 5 + */ + total_pages: number; + /** + * @default 0 + * @example 84 + */ + total_results: number; + }; + }; + }; + }; + }; + 'search-movie': { + parameters: { + query: { + query: string; + include_adult?: boolean; + language?: string; + primary_release_year?: string; + page?: number; + region?: string; + year?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 550 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Fight Club */ + original_title?: string; + /** @example A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground "fight clubs" forming in every town, until an eccentric gets in the way and ignites an out-of-control spiral toward oblivion. */ + overview?: string; + /** + * @default 0 + * @example 73.433 + */ + popularity: number; + /** @example /pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg */ + poster_path?: string; + /** @example 1999-10-15 */ + release_date?: string; + /** @example Fight Club */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.433 + */ + vote_average: number; + /** + * @default 0 + * @example 26279 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 2 + */ + total_pages: number; + /** + * @default 0 + * @example 39 + */ + total_results: number; + }; + }; + }; + }; + }; + 'search-multi': { + parameters: { + query: { + query: string; + include_adult?: boolean; + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /aDYSnJAK0BTVeE8osOy22Kz3SXY.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 11 + */ + id: number; + /** @example Star Wars */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Star Wars */ + original_title?: string; + /** @example Princess Leia is captured and held hostage by the evil Imperial forces in their effort to take over the galactic Empire. Venturesome Luke Skywalker and dashing captain Han Solo team together with the loveable robot duo R2-D2 and C-3PO to rescue the beautiful princess and restore peace and justice in the Empire. */ + overview?: string; + /** @example /6FfCtAuVAW8XJjZ7eWeLibRLWTw.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 78.047 + */ + popularity: number; + /** @example 1977-05-25 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.208 + */ + vote_average: number; + /** + * @default 0 + * @example 18528 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 11 + */ + total_pages: number; + /** + * @default 0 + * @example 201 + */ + total_results: number; + }; + }; + }; + }; + }; + 'search-person': { + parameters: { + query: { + query: string; + include_adult?: boolean; + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 31 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Tom Hanks */ + name?: string; + /** @example Tom Hanks */ + original_name?: string; + /** + * @default 0 + * @example 84.631 + */ + popularity: number; + /** @example /xndWFsBlClOJFRdhSt4NBwiPq2o.jpg */ + profile_path?: string; + known_for?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 13 + */ + id: number; + /** @example Forrest Gump */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Forrest Gump */ + original_title?: string; + /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ + overview?: string; + /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 67.209 + */ + popularity: number; + /** @example 1994-06-23 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.481 + */ + vote_average: number; + /** + * @default 0 + * @example 24525 + */ + vote_count: number; + }[]; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + 'search-tv': { + parameters: { + query: { + query: string; + /** @description Search only the first air date. Valid values are: 1000..9999 */ + first_air_date_year?: number; + include_adult?: boolean; + language?: string; + page?: number; + /** @description Search the first air date and all episode air dates. Valid values are: 1000..9999 */ + year?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1396 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Breaking Bad */ + original_name?: string; + /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ + overview?: string; + /** + * @default 0 + * @example 298.884 + */ + popularity: number; + /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ + poster_path?: string; + /** @example 2008-01-20 */ + first_air_date?: string; + /** @example Breaking Bad */ + name?: string; + /** + * @default 0 + * @example 8.879 + */ + vote_average: number; + /** + * @default 0 + * @example 11536 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + 'trending-all': { + parameters: { + query?: { + /** @description `ISO-639-1`-`ISO-3166-1` code */ + language?: string; + }; + header?: never; + path: { + time_window: 'day' | 'week'; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 934433 + */ + id: number; + /** @example Scream VI */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Scream VI */ + original_title?: string; + /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ + overview?: string; + /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 609.941 + */ + popularity: number; + /** @example 2023-03-08 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.374 + */ + vote_average: number; + /** + * @default 0 + * @example 684 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 1000 + */ + total_pages: number; + /** + * @default 0 + * @example 20000 + */ + total_results: number; + }; + }; + }; + }; + }; + 'trending-movies': { + parameters: { + query?: { + /** @description `ISO-639-1`-`ISO-3166-1` code */ + language?: string; + }; + header?: never; + path: { + time_window: 'day' | 'week'; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 934433 + */ + id: number; + /** @example Scream VI */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Scream VI */ + original_title?: string; + /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ + overview?: string; + /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 609.941 + */ + popularity: number; + /** @example 2023-03-08 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.374 + */ + vote_average: number; + /** + * @default 0 + * @example 684 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 1000 + */ + total_pages: number; + /** + * @default 0 + * @example 20000 + */ + total_results: number; + }; + }; + }; + }; + }; + 'trending-people': { + parameters: { + query?: { + /** @description `ISO-639-1`-`ISO-3166-1` code */ + language?: string; + }; + header?: never; + path: { + time_window: 'day' | 'week'; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 224513 + */ + id: number; + /** @example Ana de Armas */ + name?: string; + /** @example Ana de Armas */ + original_name?: string; + /** @example person */ + media_type?: string; + /** + * @default 0 + * @example 349.766 + */ + popularity: number; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** @example Acting */ + known_for_department?: string; + /** @example /3vxvsmYLTf4jnr163SUlBIw51ee.jpg */ + profile_path?: string; + known_for?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /ilRyazdMJwN05exqhwK4tMKBYZs.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 335984 + */ + id: number; + /** @example Blade Runner 2049 */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Blade Runner 2049 */ + original_title?: string; + /** @example Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years. */ + overview?: string; + /** @example /gajva2L0rPYkEWjzgFlBXCAVBE5.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 79.571 + */ + popularity: number; + /** @example 2017-10-04 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.531 + */ + vote_average: number; + /** + * @default 0 + * @example 11771 + */ + vote_count: number; + }[]; + }[]; + /** + * @default 0 + * @example 1000 + */ + total_pages: number; + /** + * @default 0 + * @example 20000 + */ + total_results: number; + }; + }; + }; + }; + }; + 'trending-tv': { + parameters: { + query?: { + /** @description `ISO-639-1`-`ISO-3166-1` code */ + language?: string; + }; + header?: never; + path: { + time_window: 'day' | 'week'; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /8P15FsYcTwQZ4G5rRMd1TKD14Aq.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 103768 + */ + id: number; + /** @example Sweet Tooth */ + name?: string; + /** @example en */ + original_language?: string; + /** @example Sweet Tooth */ + original_name?: string; + /** @example On a perilous adventure across a post-apocalyptic world, a lovable boy who's half-human and half-deer searches for a new beginning with a gruff protector. */ + overview?: string; + /** @example /dBxxtfhC4vYrxB2fLsSxOTY2dQc.jpg */ + poster_path?: string; + /** @example tv */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 137.498 + */ + popularity: number; + /** @example 2021-06-04 */ + first_air_date?: string; + /** + * @default 0 + * @example 7.928 + */ + vote_average: number; + /** + * @default 0 + * @example 1094 + */ + vote_count: number; + origin_country?: string[]; + }[]; + /** + * @default 0 + * @example 1000 + */ + total_pages: number; + /** + * @default 0 + * @example 20000 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-airing-today-list': { + parameters: { + query?: { + language?: string; + page?: number; + timezone?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ + backdrop_path?: string; + /** @example 2023-01-23 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 202250 + */ + id: number; + /** @example Dirty Linen */ + name?: string; + origin_country?: string[]; + /** @example tl */ + original_language?: string; + /** @example Dirty Linen */ + original_name?: string; + /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ + overview?: string; + /** + * @default 0 + * @example 2797.914 + */ + popularity: number; + /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 5 + */ + vote_average: number; + /** + * @default 0 + * @example 13 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 14 + */ + total_pages: number; + /** + * @default 0 + * @example 265 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-on-the-air-list': { + parameters: { + query?: { + language?: string; + page?: number; + timezone?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ + backdrop_path?: string; + /** @example 2023-01-23 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 202250 + */ + id: number; + /** @example Dirty Linen */ + name?: string; + origin_country?: string[]; + /** @example tl */ + original_language?: string; + /** @example Dirty Linen */ + original_name?: string; + /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ + overview?: string; + /** + * @default 0 + * @example 2797.914 + */ + popularity: number; + /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 5 + */ + vote_average: number; + /** + * @default 0 + * @example 13 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 58 + */ + total_pages: number; + /** + * @default 0 + * @example 1151 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-popular-list': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ + backdrop_path?: string; + /** @example 2023-01-23 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 202250 + */ + id: number; + /** @example Dirty Linen */ + name?: string; + origin_country?: string[]; + /** @example tl */ + original_language?: string; + /** @example Dirty Linen */ + original_name?: string; + /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ + overview?: string; + /** + * @default 0 + * @example 2797.914 + */ + popularity: number; + /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 5 + */ + vote_average: number; + /** + * @default 0 + * @example 13 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 7416 + */ + total_pages: number; + /** + * @default 0 + * @example 148302 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-top-rated-list': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /99vBORZixICa32Pwdwj0lWcr8K.jpg */ + backdrop_path?: string; + /** @example 2021-09-03 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 130392 + */ + id: number; + /** @example The D'Amelio Show */ + name?: string; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example The D'Amelio Show */ + original_name?: string; + /** @example From relative obscurity and a seemingly normal life, to overnight success and thrust into the Hollywood limelight overnight, the D’Amelios are faced with new challenges and opportunities they could not have imagined. */ + overview?: string; + /** + * @default 0 + * @example 12.459 + */ + popularity: number; + /** @example /phv2Jc4H8cvRzvTKb9X1uKMboTu.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 8.9 + */ + vote_average: number; + /** + * @default 0 + * @example 3190 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 142 + */ + total_pages: number; + /** + * @default 0 + * @example 2833 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-details': { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /6LWy0jvMpmjoS9fojNgHIKoWL05.jpg */ + backdrop_path?: string; + created_by?: { + /** + * @default 0 + * @example 9813 + */ + id: number; + /** @example 5256c8c219c2956ff604858a */ + credit_id?: string; + /** @example David Benioff */ + name?: string; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** @example /xvNN5huL0X8yJ7h3IZfGG4O2zBD.jpg */ + profile_path?: string; + }[]; + episode_run_time?: number[]; + /** @example 2011-04-17 */ + first_air_date?: string; + genres?: { + /** + * @default 0 + * @example 10765 + */ + id: number; + /** @example Sci-Fi & Fantasy */ + name?: string; + }[]; + /** @example http://www.hbo.com/game-of-thrones */ + homepage?: string; + /** + * @default 0 + * @example 1399 + */ + id: number; + /** + * @default true + * @example false + */ + in_production: boolean; + languages?: string[]; + /** @example 2019-05-19 */ + last_air_date?: string; + last_episode_to_air?: { + /** + * @default 0 + * @example 1551830 + */ + id: number; + /** @example The Iron Throne */ + name?: string; + /** @example In the aftermath of the devastating attack on King's Landing, Daenerys must face the survivors. */ + overview?: string; + /** + * @default 0 + * @example 4.809 + */ + vote_average: number; + /** + * @default 0 + * @example 241 + */ + vote_count: number; + /** @example 2019-05-19 */ + air_date?: string; + /** + * @default 0 + * @example 6 + */ + episode_number: number; + /** @example 806 */ + production_code?: string; + /** + * @default 0 + * @example 80 + */ + runtime: number; + /** + * @default 0 + * @example 8 + */ + season_number: number; + /** + * @default 0 + * @example 1399 + */ + show_id: number; + /** @example /zBi2O5EJfgTS6Ae0HdAYLm9o2nf.jpg */ + still_path?: string; + }; + /** @example Game of Thrones */ + name?: string; + next_episode_to_air?: unknown; + networks?: { + /** + * @default 0 + * @example 49 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + /** + * @default 0 + * @example 73 + */ + number_of_episodes: number; + /** + * @default 0 + * @example 8 + */ + number_of_seasons: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Game of Thrones */ + original_name?: string; + /** @example Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and icy horrors beyond. */ + overview?: string; + /** + * @default 0 + * @example 346.098 + */ + popularity: number; + /** @example /1XS1oqL89opfnbLl8WnZY1O1uJx.jpg */ + poster_path?: string; + production_companies?: { + /** + * @default 0 + * @example 76043 + */ + id: number; + /** @example /9RO2vbQ67otPrBLXCaC8UMp3Qat.png */ + logo_path?: string; + /** @example Revolution Sun Studios */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + production_countries?: { + /** @example GB */ + iso_3166_1?: string; + /** @example United Kingdom */ + name?: string; + }[]; + seasons?: { + /** @example 2010-12-05 */ + air_date?: string; + /** + * @default 0 + * @example 272 + */ + episode_count: number; + /** + * @default 0 + * @example 3627 + */ + id: number; + /** @example Specials */ + name?: string; + /** @example */ + overview?: string; + /** @example /kMTcwNRfFKCZ0O2OaBZS0nZ2AIe.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 0 + */ + season_number: number; + /** + * @default 0 + * @example 0 + */ + vote_average: number; + }[]; + spoken_languages?: { + /** @example English */ + english_name?: string; + /** @example en */ + iso_639_1?: string; + /** @example English */ + name?: string; + }[]; + /** @example Ended */ + status?: string; + /** @example Winter Is Coming */ + tagline?: string; + /** @example Scripted */ + type?: string; + /** + * @default 0 + * @example 8.438 + */ + vote_average: number; + /** + * @default 0 + * @example 21390 + */ + vote_count: number; + }; + }; + }; + }; + }; + 'tv-series-account-states': { + parameters: { + query?: { + session_id?: string; + guest_session_id?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default true + * @example true + */ + favorite: boolean; + rated?: { + /** + * @default 0 + * @example 9 + */ + value: number; + }; + /** + * @default true + * @example false + */ + watchlist: boolean; + }; + }; + }; + }; + }; + 'tv-series-aggregate-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** + * @default 0 + * @example 1223786 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Emilia Clarke */ + name?: string; + /** @example Emilia Clarke */ + original_name?: string; + /** + * @default 0 + * @example 42.737 + */ + popularity: number; + /** @example /u59kTmNHXzaGZqokivxLPiBVIML.jpg */ + profile_path?: string; + roles?: { + /** @example 5256c8af19c2956ff60479f6 */ + credit_id?: string; + /** @example Daenerys Targaryen */ + character?: string; + /** + * @default 0 + * @example 78 + */ + episode_count: number; + }[]; + /** + * @default 0 + * @example 78 + */ + total_episode_count: number; + /** + * @default 0 + * @example 6 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** + * @default 0 + * @example 6411 + */ + id: number; + /** @example Art */ + known_for_department?: string; + /** @example Deborah Riley */ + name?: string; + /** @example Deborah Riley */ + original_name?: string; + /** + * @default 0 + * @example 1.4 + */ + popularity: number; + /** @example /cjhADpqdrnwB1PdDUKaBnWrIj2Q.jpg */ + profile_path?: string; + jobs?: { + /** @example 54eee9e5c3a3686d5800584e */ + credit_id?: string; + /** @example Production Design */ + job?: string; + /** + * @default 0 + * @example 43 + */ + episode_count: number; + }[]; + /** @example Art */ + department?: string; + /** + * @default 0 + * @example 43 + */ + total_episode_count: number; + }[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + }; + }; + }; + }; + }; + 'tv-series-alternative-titles': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + /** @example AL */ + iso_3166_1?: string; + /** @example Froni i shpatave */ + title?: string; + /** @example */ + type?: string; + }[]; + }; + }; + }; + }; + }; + 'tv-series-changes': { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + changes?: { + /** @example images */ + key?: string; + items?: { + /** @example 640435cf021cee0084710972 */ + id?: string; + /** @example updated */ + action?: string; + /** @example 2023-03-05 06:25:19 UTC */ + time?: string; + /** @example en */ + iso_639_1?: string; + /** @example */ + iso_3166_1?: string; + value?: { + poster?: { + /** @example /ouudK6RCNnsbT1CSXrlATXQIQTG.jpg */ + file_path?: string; + /** @example en */ + iso_639_1?: string; + }; + }; + original_value?: { + poster?: { + /** @example /ouudK6RCNnsbT1CSXrlATXQIQTG.jpg */ + file_path?: string; + /** @example fr */ + iso_639_1?: string; + }; + }; + }[]; + }[]; + }; + }; + }; + }; + }; + 'tv-series-content-ratings': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + results?: { + descriptors?: unknown[]; + /** @example DE */ + iso_3166_1?: string; + /** @example 16 */ + rating?: string; + }[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + }; + }; + }; + }; + }; + 'tv-series-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 22970 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Peter Dinklage */ + name?: string; + /** @example Peter Dinklage */ + original_name?: string; + /** + * @default 0 + * @example 30.6 + */ + popularity: number; + /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ + profile_path?: string; + /** @example Tyrion Lannister */ + character?: string; + /** @example 5256c8b219c2956ff6047cd8 */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 1406855 + */ + id: number; + /** @example Production */ + known_for_department?: string; + /** @example Duncan Muggoch */ + name?: string; + /** @example Duncan Muggoch */ + original_name?: string; + /** + * @default 0 + * @example 1.592 + */ + popularity: number; + /** @example /ukGjJ62Ejd4cFziald03G34Fsrp.jpg */ + profile_path?: string; + /** @example 5ceab029c3a3682e93217a85 */ + credit_id?: string; + /** @example Production */ + department?: string; + /** @example Producer */ + job?: string; + }[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + }; + }; + }; + }; + }; + 'tv-series-episode-groups': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + results?: { + /** @example */ + description?: string; + /** + * @default 0 + * @example 102 + */ + episode_count: number; + /** + * @default 0 + * @example 9 + */ + group_count: number; + /** @example 5e9077d2e640d600151f32bd */ + id?: string; + /** @example Aired Order */ + name?: string; + network?: { + /** + * @default 0 + * @example 49 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }; + /** + * @default 0 + * @example 1 + */ + type: number; + }[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + }; + }; + }; + }; + }; + 'tv-series-external-ids': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + /** @example tt0944947 */ + imdb_id?: string; + /** @example /m/0524b41 */ + freebase_mid?: string; + /** @example /en/game_of_thrones */ + freebase_id?: string; + /** + * @default 0 + * @example 121361 + */ + tvdb_id: number; + /** + * @default 0 + * @example 24493 + */ + tvrage_id: number; + /** @example Q23572 */ + wikidata_id?: string; + /** @example GameOfThrones */ + facebook_id?: string; + /** @example gameofthrones */ + instagram_id?: string; + /** @example GameOfThrones */ + twitter_id?: string; + }; + }; + }; + }; + }; + 'tv-series-images': { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + backdrops?: { + /** + * @default 0 + * @example 1.778 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 800 + */ + height: number; + iso_639_1?: unknown; + /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.622 + */ + vote_average: number; + /** + * @default 0 + * @example 20 + */ + vote_count: number; + /** + * @default 0 + * @example 1422 + */ + width: number; + }[]; + /** + * @default 0 + * @example 550 + */ + id: number; + logos?: { + /** + * @default 0 + * @example 5.203 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 79 + */ + height: number; + /** @example he */ + iso_639_1?: string; + /** @example /c1KLulrIhUqY5fT42nmC5aERGCp.png */ + file_path?: string; + /** + * @default 0 + * @example 5.312 + */ + vote_average: number; + /** + * @default 0 + * @example 1 + */ + vote_count: number; + /** + * @default 0 + * @example 411 + */ + width: number; + }[]; + posters?: { + /** + * @default 0 + * @example 0.667 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 900 + */ + height: number; + /** @example pt */ + iso_639_1?: string; + /** @example /r3pPehX4ik8NLYPpbDRAh0YRtMb.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.258 + */ + vote_average: number; + /** + * @default 0 + * @example 6 + */ + vote_count: number; + /** + * @default 0 + * @example 600 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + 'tv-series-keywords': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + /** @example based on novel or book */ + name?: string; + /** + * @default 0 + * @example 818 + */ + id: number; + }[]; + }; + }; + }; + }; + }; + 'tv-series-latest-id': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default true + * @example false + */ + adult: boolean; + backdrop_path?: unknown; + created_by?: unknown[]; + episode_run_time?: unknown[]; + /** @example */ + first_air_date?: string; + genres?: unknown[]; + /** @example */ + homepage?: string; + /** + * @default 0 + * @example 225491 + */ + id: number; + /** + * @default true + * @example true + */ + in_production: boolean; + languages?: unknown[]; + /** @example 2023-04-21 */ + last_air_date?: string; + last_episode_to_air?: { + /** + * @default 0 + * @example 4398801 + */ + id: number; + /** @example Episode 8 */ + name?: string; + /** @example */ + overview?: string; + /** + * @default 0 + * @example 0 + */ + vote_average: number; + /** + * @default 0 + * @example 0 + */ + vote_count: number; + /** @example 2023-04-21 */ + air_date?: string; + /** + * @default 0 + * @example 8 + */ + episode_number: number; + /** @example */ + production_code?: string; + runtime?: unknown; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 225491 + */ + show_id: number; + still_path?: unknown; + }; + /** @example 妖怪传 */ + name?: string; + next_episode_to_air?: unknown; + networks?: unknown[]; + /** + * @default 0 + * @example 1 + */ + number_of_episodes: number; + /** + * @default 0 + * @example 1 + */ + number_of_seasons: number; + origin_country?: string[]; + /** @example zh */ + original_language?: string; + /** @example 妖怪传 */ + original_name?: string; + /** @example */ + overview?: string; + /** + * @default 0 + * @example 0 + */ + popularity: number; + poster_path?: unknown; + production_companies?: unknown[]; + production_countries?: unknown[]; + seasons?: { + air_date?: unknown; + /** + * @default 0 + * @example 1 + */ + episode_count: number; + /** + * @default 0 + * @example 338956 + */ + id: number; + /** @example Season 1 */ + name?: string; + /** @example */ + overview?: string; + poster_path?: unknown; + /** + * @default 0 + * @example 1 + */ + season_number: number; + }[]; + spoken_languages?: unknown[]; + /** @example Returning Series */ + status?: string; + /** @example */ + tagline?: string; + /** @example Scripted */ + type?: string; + /** + * @default 0 + * @example 0 + */ + vote_average: number; + /** + * @default 0 + * @example 0 + */ + vote_count: number; + }; + }; + }; + }; + }; + 'lists-copy': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example */ + description?: string; + /** + * @default 0 + * @example 0 + */ + favorite_count: number; + /** + * @default 0 + * @example 8257231 + */ + id: number; + /** + * @default 0 + * @example 182 + */ + item_count: number; + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Done */ + name?: string; + poster_path?: unknown; + }[]; + /** + * @default 0 + * @example 96 + */ + total_pages: number; + /** + * @default 0 + * @example 1906 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-recommendations': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 1396 + */ + id: number; + /** @example Breaking Bad */ + name?: string; + /** @example en */ + original_language?: string; + /** @example Breaking Bad */ + original_name?: string; + /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ + overview?: string; + /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ + poster_path?: string; + /** @example tv */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 292.904 + */ + popularity: number; + /** @example 2008-01-20 */ + first_air_date?: string; + /** + * @default 0 + * @example 8.878 + */ + vote_average: number; + /** + * @default 0 + * @example 11544 + */ + vote_count: number; + origin_country?: string[]; + }[]; + /** + * @default 0 + * @example 2 + */ + total_pages: number; + /** + * @default 0 + * @example 40 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-reviews': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example lmao7 */ + author?: string; + author_details?: { + /** @example lmao7 */ + name?: string; + /** @example lmao7 */ + username?: string; + /** @example /ekmYOUU4tfx9zGGadjRdE7UPce.jpg */ + avatar_path?: string; + /** + * @default 0 + * @example 9 + */ + rating: number; + }; + /** + * @example I started watching when it came out as I heard that fans of LOTR also liked this. I stopped watching after Season 1 as I was devastated lol kinda. Only 2015 I decided to continue watching and got addicted like it seemed complicated at first, too many stories and characters. I even used a guide from internet like family tree per house while watching or GOT wiki so I can have more background on the characters. For a TV series, this show can really take you to a different world and never knowing what will happen. It is very daring that any time anybody can just die (I learned not to be attached and have accepted that they will all die so I won't be devastated hehe). I have never read the books but the show is entertaining and you will really root for your faves and really hate on those you hate. + * + * Fantasy, action, drama, comedy, love...and lots of surprises! + */ + content?: string; + /** @example 2017-02-20T05:47:28.872Z */ + created_at?: string; + /** @example 58aa82f09251416f92006a3a */ + id?: string; + /** @example 2021-06-23T15:57:54.649Z */ + updated_at?: string; + /** @example https://www.themoviedb.org/review/58aa82f09251416f92006a3a */ + url?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 11 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-screened-theatrically': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + /** + * @default 0 + * @example 1159054 + */ + id: number; + /** + * @default 0 + * @example 10 + */ + episode_number: number; + /** + * @default 0 + * @example 5 + */ + season_number: number; + }[]; + }; + }; + }; + }; + }; + 'tv-series-similar': { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + series_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /zcFSvWa34nDn2NcqOPuthyOIBWT.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 197063 + */ + id: number; + origin_country?: string[]; + /** @example ko */ + original_language?: string; + /** @example 종이달 */ + original_name?: string; + /** @example A thriller drama about Yoo I-hwa, a stay-at-home mom living her comfortable and contented life without desires, but to her husband's indifference. While working as a bank contract employee, she unexpectedly touches money from VIP clients and gradually falls into an irreversible collapse. */ + overview?: string; + /** + * @default 0 + * @example 12.299 + */ + popularity: number; + /** @example /xXWynVdMGyJXBUDvIN27AXM3iJJ.jpg */ + poster_path?: string; + /** @example 2023-04-10 */ + first_air_date?: string; + /** @example Pale Moon */ + name?: string; + /** + * @default 0 + * @example 7 + */ + vote_average: number; + /** + * @default 0 + * @example 2 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 82 + */ + total_pages: number; + /** + * @default 0 + * @example 1639 + */ + total_results: number; + }; + }; + }; + }; + }; + 'tv-series-translations': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + translations?: { + /** @example SA */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example صراع العروش */ + name?: string; + /** @example تتقاتل سبع عائلات نبيلة من أجل السيطرة على أرض - ويستيروس - الأسطورية. الاحتكاك بين العوائل يؤدي إلى حرب واسعة النطاق. في حين يستيقظ الشر القديم في أقصى الشمال. وفي خضم الحرب، نظام عسكري مهمَل - حرس الليل - هم كل ما يقف بين عالم الإنسان والأهوال الجليدية. */ + overview?: string; + /** @example */ + homepage?: string; + /** @example الشتاء قادم */ + tagline?: string; + }; + }[]; + }; + }; + }; + }; + }; + 'tv-series-videos': { + parameters: { + query?: { + /** @description filter the list results by language, supports more than one value by using a comma */ + include_video_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Inside Game of Thrones: A Story in Camera Work – BTS (HBO) */ + name?: string; + /** @example y2ZJ3lTaREY */ + key?: string; + /** @example YouTube */ + site?: string; + /** + * @default 0 + * @example 1080 + */ + size: number; + /** @example Behind the Scenes */ + type?: string; + /** + * @default true + * @example true + */ + official: boolean; + /** @example 2019-03-25T14:00:06.000Z */ + published_at?: string; + /** @example 5c999b48c3a36863b73b9d42 */ + id?: string; + }[]; + }; + }; + }; + }; + }; + 'tv-series-watch-providers': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + AE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AE */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + AR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AR */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + AT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AT */ + link?: string; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /y0kyIFElN5sJAsmW8Txj69wzrD2.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 321 + */ + provider_id: number; + /** @example Sky X */ + provider_name?: string; + /** + * @default 0 + * @example 23 + */ + display_priority: number; + }[]; + }; + AU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AU */ + link?: string; + flatrate?: { + /** @example /d3ixI1no0EpTj2i7u0Sd2DBXVlG.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 385 + */ + provider_id: number; + /** @example BINGE */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + BA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BA */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + BB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BB */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + BE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BE */ + link?: string; + flatrate?: { + /** @example /pq8p1umEnJjdFAP1nFvNArTR61X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 311 + */ + provider_id: number; + /** @example Be TV Go */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + BG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BG */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + }; + BO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + BR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BR */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + BS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BS */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + CA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CA */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /gJ3yVMWouaVj6iHd59TISJ1TlM5.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 230 + */ + provider_id: number; + /** @example Crave */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + CH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CH */ + link?: string; + flatrate?: { + /** @example /sHP8XLo4Ac4WMbziRyAdRQdb76q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 210 + */ + provider_id: number; + /** @example Sky */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + CI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CI */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + CL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CL */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + CO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + CR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CR */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + CZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CZ */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 22 + */ + display_priority: number; + }[]; + }; + DE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DE */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /MiVcYLkztM6qqLeVSYWHFCUcXx.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 30 + */ + provider_id: number; + /** @example WOW */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + DK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DK */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + DO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + DZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DZ */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + EC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EC */ + link?: string; + flatrate?: { + /** @example /cDzkhgvozSr4GW2aRdV22uDuFpw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 339 + */ + provider_id: number; + /** @example Movistar Play */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + EG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EG */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + ES?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ES */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + FI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FI */ + link?: string; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + FR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FR */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /loOaayvNiLnD0zKl70TO2L5vlAL.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1870 + */ + provider_id: number; + /** @example Pass Warner Amazon Channel */ + provider_name?: string; + /** + * @default 0 + * @example 95 + */ + display_priority: number; + }[]; + }; + GB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GB */ + link?: string; + flatrate?: { + /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + GF?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GF */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + GH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GH */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + GQ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GQ */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + GT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GT */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + HK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HK */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 40 + */ + display_priority: number; + }[]; + }; + HN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HN */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + HR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HR */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 34 + */ + display_priority: number; + }[]; + }; + HU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HU */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 22 + */ + display_priority: number; + }[]; + }; + ID?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ID */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 14 + */ + display_priority: number; + }[]; + }; + IE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IE */ + link?: string; + flatrate?: { + /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /2pCbao1J9s0DMak2KKnEzmzHni8.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 130 + */ + provider_id: number; + /** @example Sky Store */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + IL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IL */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + IQ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IQ */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + IT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IT */ + link?: string; + buy?: { + /** @example /cksgBjTHV3rzAVaO2zUyS1mH4Ke.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 40 + */ + provider_id: number; + /** @example Chili */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + JM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JM */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + JP?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JP */ + link?: string; + flatrate?: { + /** @example /npg1OiBidQSndMsBZwgEPOYU6Jq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 84 + */ + provider_id: number; + /** @example U-NEXT */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + KE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KE */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + KR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KR */ + link?: string; + flatrate?: { + /** @example /2ioan5BX5L9tz4fIGU93blTeFhv.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 356 + */ + provider_id: number; + /** @example wavve */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + LB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LB */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + LT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LT */ + link?: string; + flatrate?: { + /** @example /xTVM8uXT9QocigQ07LE7Irc65W2.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 553 + */ + provider_id: number; + /** @example Telia Play */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + }; + LY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LY */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + MD?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MD */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 26 + */ + display_priority: number; + }[]; + }; + MK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MK */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + MU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MU */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + MX?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MX */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + MY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MY */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 14 + */ + display_priority: number; + }[]; + }; + MZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MZ */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + NE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NE */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + NG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NG */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + NL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NL */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 47 + */ + display_priority: number; + }[]; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + NO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + NZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NZ */ + link?: string; + flatrate?: { + /** @example /od4YNSSLgOP3p8EtQTnEYfrPa77.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 273 + */ + provider_id: number; + /** @example Neon TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + PA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PA */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + PE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PE */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + PH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PH */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + PL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PL */ + link?: string; + flatrate?: { + /** @example /l5Wxbsgral716BOtZsGyPVNn8GC.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 250 + */ + provider_id: number; + /** @example Horizon */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + rent?: { + /** @example /bZNXgd8fwVTD68aAGlElkpAtu7b.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 549 + */ + provider_id: number; + /** @example IPLA */ + provider_name?: string; + /** + * @default 0 + * @example 17 + */ + display_priority: number; + }[]; + }; + PS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PS */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + PT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PT */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + PY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PY */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + RO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 17 + */ + display_priority: number; + }[]; + }; + RS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RS */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 32 + */ + display_priority: number; + }[]; + }; + RU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RU */ + link?: string; + flatrate?: { + /** @example /w1T8s7FqakcfucR8cgOvbe6UeXN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 115 + */ + provider_id: number; + /** @example Okko */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + ads?: { + /** @example /3jJtMOIwtvcrCyeRMUvv4wsfhJk.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 577 + */ + provider_id: number; + /** @example TvIgle */ + provider_name?: string; + /** + * @default 0 + * @example 22 + */ + display_priority: number; + }[]; + }; + SA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SA */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + SC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SC */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + SE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SE */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + SG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SG */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + SI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SI */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + SK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SK */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 37 + */ + display_priority: number; + }[]; + }; + SN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SN */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + SV?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SV */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + TH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TH */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + TR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TR */ + link?: string; + flatrate?: { + /** @example /z3XAGCCbDD3KTZFvc96Ytr3XR56.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 341 + */ + provider_id: number; + /** @example blutv */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + TT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TT */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + TW?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TW */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 40 + */ + display_priority: number; + }[]; + }; + TZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TZ */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + UG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UG */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + US?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=US */ + link?: string; + free?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + UY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UY */ + link?: string; + flatrate?: { + /** @example /kV8XFGI5OLJKl72dI8DtnKplfFr.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 467 + */ + provider_id: number; + /** @example DIRECTV GO */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + VE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=VE */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + ZA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZA */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + ZM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZM */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + }; + }; + }; + }; + }; + }; + 'tv-series-add-rating': { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header: { + 'Content-Type': string; + }; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + 'tv-series-delete-rating': { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header?: { + 'Content-Type'?: string; + }; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 13 + */ + status_code: number; + /** @example The item/record was deleted successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + 'tv-season-details': { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example 5256c89f19c2956ff6046d47 */ + _id?: string; + /** @example 2011-04-17 */ + air_date?: string; + episodes?: { + /** @example 2011-04-17 */ + air_date?: string; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + /** @example standard */ + episode_type?: string; + /** + * @default 0 + * @example 63056 + */ + id: number; + /** @example Winter Is Coming */ + name?: string; + /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ + overview?: string; + /** @example 101 */ + production_code?: string; + /** + * @default 0 + * @example 62 + */ + runtime: number; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 1399 + */ + show_id: number; + /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ + still_path?: string; + /** + * @default 0 + * @example 8.1 + */ + vote_average: number; + /** + * @default 0 + * @example 396 + */ + vote_count: number; + crew?: { + /** @example Directing */ + department?: string; + /** @example Director */ + job?: string; + /** @example 5256c8a219c2956ff6046e77 */ + credit_id?: string; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 44797 + */ + id: number; + /** @example Directing */ + known_for_department?: string; + /** @example Tim Van Patten */ + name?: string; + /** @example Tim Van Patten */ + original_name?: string; + /** + * @default 0 + * @example 0.8004 + */ + popularity: number; + /** @example /vwcARZBg4PEzOwnPsXdjRWeUVrZ.jpg */ + profile_path?: string; + }[]; + guest_stars?: { + /** @example Benjen Stark */ + character?: string; + /** @example 5256c8b919c2956ff604836a */ + credit_id?: string; + /** + * @default 0 + * @example 61 + */ + order: number; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 119783 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Joseph Mawle */ + name?: string; + /** @example Joseph Mawle */ + original_name?: string; + /** + * @default 0 + * @example 0.8932 + */ + popularity: number; + /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ + profile_path?: string; + }[]; + }[]; + /** @example Season 1 */ + name?: string; + networks?: { + /** + * @default 0 + * @example 49 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + /** @example Trouble is brewing in the Seven Kingdoms of Westeros. For the driven inhabitants of this visionary world, control of Westeros' Iron Throne holds the lure of great power. But in a land where the seasons can last a lifetime, winter is coming...and beyond the Great Wall that protects them, an ancient evil has returned. In Season One, the story centers on three primary areas: the Stark and the Lannister families, whose designs on controlling the throne threaten a tenuous peace; the dragon princess Daenerys, heir to the former dynasty, who waits just over the Narrow Sea with her malevolent brother Viserys; and the Great Wall--a massive barrier of ice where a forgotten danger is stirring. */ + overview?: string; + /** + * @default 0 + * @example 3624 + */ + id: number; + /** @example /wgfKiqzuMrFIkU1M68DDDY8kGC1.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 8.4 + */ + vote_average: number; + }; + }; + }; + }; + }; + 'tv-season-account-states': { + parameters: { + query?: { + session_id?: string; + guest_session_id?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 3624 + */ + id: number; + results?: { + /** + * @default 0 + * @example 63056 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + rated?: { + /** + * @default 0 + * @example 9 + */ + value: number; + }; + }[]; + }; + }; + }; + }; + }; + 'tv-season-aggregate-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 22970 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Peter Dinklage */ + name?: string; + /** @example Peter Dinklage */ + original_name?: string; + /** + * @default 0 + * @example 30.6 + */ + popularity: number; + /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ + profile_path?: string; + roles?: { + /** @example 5256c8b219c2956ff6047cd8 */ + credit_id?: string; + /** @example Tyrion Lannister */ + character?: string; + /** + * @default 0 + * @example 10 + */ + episode_count: number; + }[]; + /** + * @default 0 + * @example 10 + */ + total_episode_count: number; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** + * @default 0 + * @example 9153 + */ + id: number; + /** @example Art */ + known_for_department?: string; + /** @example Gemma Jackson */ + name?: string; + /** @example Gemma Jackson */ + original_name?: string; + /** + * @default 0 + * @example 0.995 + */ + popularity: number; + profile_path?: unknown; + jobs?: { + /** @example 54eee8b8c3a3686d5e005430 */ + credit_id?: string; + /** @example Production Design */ + job?: string; + /** + * @default 0 + * @example 10 + */ + episode_count: number; + }[]; + /** @example Art */ + department?: string; + /** + * @default 0 + * @example 10 + */ + total_episode_count: number; + }[]; + /** + * @default 0 + * @example 3624 + */ + id: number; + }; + }; + }; + }; + }; + 'tv-season-changes-by-id': { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path: { + season_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + changes?: { + /** @example episode */ + key?: string; + items?: { + /** @example 5717c8c69251414cfd00250f */ + id?: string; + /** @example updated */ + action?: string; + /** @example 2016-04-20 18:21:58 UTC */ + time?: string; + value?: { + /** + * @default 0 + * @example 63056 + */ + episode_id: number; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + }; + }[]; + }[]; + }; + }; + }; + }; + }; + 'tv-season-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 22970 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Peter Dinklage */ + name?: string; + /** @example Peter Dinklage */ + original_name?: string; + /** + * @default 0 + * @example 30.6 + */ + popularity: number; + /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ + profile_path?: string; + /** @example Tyrion Lannister */ + character?: string; + /** @example 5256c8b219c2956ff6047cd8 */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 0 + */ + gender: number; + /** + * @default 0 + * @example 1223796 + */ + id: number; + /** @example Production */ + known_for_department?: string; + /** @example Frank Doelger */ + name?: string; + /** @example Frank Doelger */ + original_name?: string; + /** + * @default 0 + * @example 0.694 + */ + popularity: number; + profile_path?: unknown; + /** @example 5256c8c419c2956ff604867c */ + credit_id?: string; + /** @example Production */ + department?: string; + /** @example Producer */ + job?: string; + }[]; + /** + * @default 0 + * @example 3624 + */ + id: number; + }; + }; + }; + }; + }; + 'tv-season-external-ids': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 3624 + */ + id: number; + /** @example /m/0gmd1gd */ + freebase_mid?: string; + /** @example /m/0gmd1gd */ + freebase_id?: string; + /** + * @default 0 + * @example 364731 + */ + tvdb_id: number; + tvrage_id?: unknown; + /** @example Q1658029 */ + wikidata_id?: string; + }; + }; + }; + }; + }; + 'tv-season-images': { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 3624 + */ + id: number; + posters?: { + /** + * @default 0 + * @example 0.667 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 1500 + */ + height: number; + /** @example en */ + iso_639_1?: string; + /** @example /wgfKiqzuMrFIkU1M68DDDY8kGC1.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.514 + */ + vote_average: number; + /** + * @default 0 + * @example 18 + */ + vote_count: number; + /** + * @default 0 + * @example 1000 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + 'tv-season-translations': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 3624 + */ + id: number; + translations?: { + /** @example SA */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example */ + name?: string; + /** @example سلسلة درامية مبنية على سلسلة روايات لـ جورج آر آر مارتن بعنوان "إيه سونغ أوف آيس أن فاير" والتي حققت مبيعات كبيرة وتتمحور حول الصراعات التي كانت تحدث في العصور الوسطى بين العائلات النبيلة للسيطرة على عرش وستيروس. */ + overview?: string; + }; + }[]; + }; + }; + }; + }; + }; + 'tv-season-videos': { + parameters: { + query?: { + /** @description filter the list results by language, supports more than one value by using a comma */ + include_video_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 3624 + */ + id: number; + results?: { + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Game Of Thrones - Season 1 Recap - Official HBO UK */ + name?: string; + /** @example e0Y8KpQpW8c */ + key?: string; + /** @example YouTube */ + site?: string; + /** + * @default 0 + * @example 1080 + */ + size: number; + /** @example Recap */ + type?: string; + /** + * @default true + * @example true + */ + official: boolean; + /** @example 2015-05-19T16:31:23.000Z */ + published_at?: string; + /** @example 5ce71a920e0a265ac0cfe497 */ + id?: string; + }[]; + }; + }; + }; + }; + }; + 'tv-season-watch-providers': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 3624 + */ + id: number; + results?: { + AD?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AD */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 24 + */ + display_priority: number; + }[]; + }; + AE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AE */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + AG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AG */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + AR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AR */ + link?: string; + flatrate?: { + /** @example /nr5UBW4IGKgBwmhpTMOfcvnX2vX.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 467 + */ + provider_id: number; + /** @example DIRECTV GO */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + AT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AT */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /kAZkQcIxMxTmlwdgSB05fqtymp0.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + AU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AU */ + link?: string; + flatrate?: { + /** @example /fejdSG7TwNQ5E0p6u7A6LVs280R.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 134 + */ + provider_id: number; + /** @example Foxtel Now */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + BA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BA */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + BB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BB */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 23 + */ + display_priority: number; + }[]; + }; + BE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BE */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 33 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /kwftIxtjuCAROIcdd53UEjzSmca.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1857 + */ + provider_id: number; + /** @example Telenet */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + BG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BG */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 21 + */ + display_priority: number; + }[]; + }; + BH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BH */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + BO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BO */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + BR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BR */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + BS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BS */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 24 + */ + display_priority: number; + }[]; + }; + BZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BZ */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + CA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CA */ + link?: string; + flatrate?: { + /** @example /ewOptMVIYcOadMGGJz8DJueH2bH.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 230 + */ + provider_id: number; + /** @example Crave */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + CH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CH */ + link?: string; + buy?: { + /** @example /8z7rC8uIDaTM91X0ZfkRf04ydj2.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /ytApMa9fThUQUFTn696AeNBrB8f.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 210 + */ + provider_id: number; + /** @example Sky */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + CI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CI */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 19 + */ + display_priority: number; + }[]; + }; + CL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CL */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + CM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CM */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + CO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CO */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + CR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CR */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + CZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CZ */ + link?: string; + flatrate?: { + /** @example /489t5n9o1KhH7voGNQkrXT7vBKV.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1939 + */ + provider_id: number; + /** @example Lepsi TV */ + provider_name?: string; + /** + * @default 0 + * @example 26 + */ + display_priority: number; + }[]; + }; + DE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DE */ + link?: string; + flatrate?: { + /** @example /kAZkQcIxMxTmlwdgSB05fqtymp0.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + DK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DK */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 39 + */ + display_priority: number; + }[]; + }; + DO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DO */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + EC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EC */ + link?: string; + flatrate?: { + /** @example /tRNA2CRgA4XHvd7Mx9dH3sFtDVb.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 339 + */ + provider_id: number; + /** @example MovistarTV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + EG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EG */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 20 + */ + display_priority: number; + }[]; + }; + ES?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ES */ + link?: string; + flatrate?: { + /** @example /f6TRLB3H4jDpFEZ0z2KWSSvu1SB.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 149 + */ + provider_id: number; + /** @example Movistar Plus+ Ficción Total */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 32 + */ + display_priority: number; + }[]; + }; + FI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FI */ + link?: string; + flatrate?: { + /** @example /eglAxQEXSO13p6gNf3HKymrIu7y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 540 + */ + provider_id: number; + /** @example Elisa Viihde */ + provider_name?: string; + /** + * @default 0 + * @example 18 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 54 + */ + display_priority: number; + }[]; + }; + FR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FR */ + link?: string; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 78 + */ + display_priority: number; + }[]; + }; + GB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GB */ + link?: string; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 39 + */ + provider_id: number; + /** @example Now TV */ + provider_name?: string; + /** + * @default 0 + * @example 43 + */ + display_priority: number; + }[]; + }; + GG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GG */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 84 + */ + display_priority: number; + }[]; + }; + GQ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GQ */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + GT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GT */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + GY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GY */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + HK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HK */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 38 + */ + display_priority: number; + }[]; + }; + HN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HN */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + HR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HR */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 33 + */ + display_priority: number; + }[]; + }; + HU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HU */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + ID?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ID */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 39 + */ + display_priority: number; + }[]; + }; + IE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IE */ + link?: string; + flatrate?: { + /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 39 + */ + provider_id: number; + /** @example Now TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + buy?: { + /** @example /6AKbY2ayaEuH4zKg2prqoVQ9iaY.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 130 + */ + provider_id: number; + /** @example Sky Store */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + IN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IN */ + link?: string; + flatrate?: { + /** @example /kVqjgpcwvDJOhCupjcLzwwtOp52.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2336 + */ + provider_id: number; + /** @example JioHotstar */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + IQ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IQ */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + IT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IT */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 33 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 39 + */ + provider_id: number; + /** @example Now TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + JM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JM */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 22 + */ + display_priority: number; + }[]; + }; + JO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JO */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + JP?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JP */ + link?: string; + flatrate?: { + /** @example /a5T7vNaGvoeckYO6rQkHolvyYf4.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 84 + */ + provider_id: number; + /** @example U-NEXT */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + rent?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + KE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KE */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + LB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LB */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + LC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LC */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + MC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MC */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + MD?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MD */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + ME?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ME */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + MG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MG */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + MK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MK */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 26 + */ + display_priority: number; + }[]; + }; + ML?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ML */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + MU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MU */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + MX?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MX */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + MY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MY */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + MZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MZ */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + NE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NE */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 19 + */ + display_priority: number; + }[]; + }; + NG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NG */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 21 + */ + display_priority: number; + }[]; + }; + NI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NI */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + NL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NL */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 34 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 48 + */ + display_priority: number; + }[]; + }; + NO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NO */ + link?: string; + flatrate?: { + /** @example /3ZigBD8WTEPcEHAvMWiJGUsv5u4.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 578 + */ + provider_id: number; + /** @example Strim */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + NZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NZ */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 59 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /iscLKFDwQlr0BAgVDBcuRapLiwC.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 273 + */ + provider_id: number; + /** @example Neon TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + OM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=OM */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + PA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PA */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + PE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PE */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + PH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PH */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 32 + */ + display_priority: number; + }[]; + }; + PL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PL */ + link?: string; + flatrate?: { + /** @example /jhMNVBV2UocEGepRkr9oFPD7Gpb.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 505 + */ + provider_id: number; + /** @example Player */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + PT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PT */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 43 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 32 + */ + display_priority: number; + }[]; + }; + PY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PY */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + QA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=QA */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + RO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RO */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 23 + */ + display_priority: number; + }[]; + }; + RS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RS */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + RU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RU */ + link?: string; + flatrate?: { + /** @example /5z8dpQN27kybhn21EVLZcJPpMEo.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 115 + */ + provider_id: number; + /** @example Okko */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + SA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SA */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 20 + */ + display_priority: number; + }[]; + }; + SC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SC */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + SE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SE */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 39 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 44 + */ + display_priority: number; + }[]; + }; + SG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SG */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + SI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SI */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + SK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SK */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 37 + */ + display_priority: number; + }[]; + }; + SN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SN */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + SV?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SV */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + TC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TC */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + TD?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TD */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + TH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TH */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + TR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TR */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + TT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TT */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + TW?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TW */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 38 + */ + display_priority: number; + }[]; + }; + US?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=US */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + UY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UY */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + VE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=VE */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + ZA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZA */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + ZM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZM */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + ZW?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZW */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + }; + }; + }; + }; + }; + }; + 'tv-episode-details': { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example 2011-04-17 */ + air_date?: string; + crew?: { + /** @example Directing */ + department?: string; + /** @example Director */ + job?: string; + /** @example 5256c8a219c2956ff6046e77 */ + credit_id?: string; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 44797 + */ + id: number; + /** @example Directing */ + known_for_department?: string; + /** @example Timothy Van Patten */ + name?: string; + /** @example Timothy Van Patten */ + original_name?: string; + /** + * @default 0 + * @example 7.775 + */ + popularity: number; + /** @example /MzSOFrd99HRdr6pkSRSctk3kBR.jpg */ + profile_path?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + guest_stars?: { + /** @example Benjen Stark */ + character?: string; + /** @example 5256c8b919c2956ff604836a */ + credit_id?: string; + /** + * @default 0 + * @example 62 + */ + order: number; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 119783 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Joseph Mawle */ + name?: string; + /** @example Joseph Mawle */ + original_name?: string; + /** + * @default 0 + * @example 6.758 + */ + popularity: number; + /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ + profile_path?: string; + }[]; + /** @example Winter Is Coming */ + name?: string; + /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ + overview?: string; + /** + * @default 0 + * @example 63056 + */ + id: number; + /** @example 101 */ + production_code?: string; + /** + * @default 0 + * @example 62 + */ + runtime: number; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ + still_path?: string; + /** + * @default 0 + * @example 7.8 + */ + vote_average: number; + /** + * @default 0 + * @example 286 + */ + vote_count: number; + }; + }; + }; + }; + }; + 'tv-episode-account-states': { + parameters: { + query?: { + session_id?: string; + guest_session_id?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default true + * @example true + */ + favorite: boolean; + rated?: { + /** + * @default 0 + * @example 9 + */ + value: number; + }; + /** + * @default true + * @example false + */ + watchlist: boolean; + }; + }; + }; + }; + }; + 'tv-episode-changes-by-id': { + parameters: { + query?: never; + header?: never; + path: { + episode_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + changes?: { + /** @example production_code */ + key?: string; + items?: { + /** @example 54bd9ed7c3a3686c6b00da66 */ + id?: string; + /** @example added */ + action?: string; + /** @example 2015-01-20 00:18:31 UTC */ + time?: string; + /** @example 101 */ + value?: string; + }[]; + }[]; + }; + }; + }; + }; + }; + 'tv-episode-credits': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 22970 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Peter Dinklage */ + name?: string; + /** @example Peter Dinklage */ + original_name?: string; + /** + * @default 0 + * @example 30.6 + */ + popularity: number; + /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ + profile_path?: string; + /** @example Tyrion Lannister */ + character?: string; + /** @example 5256c8b219c2956ff6047cd8 */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** @example Directing */ + department?: string; + /** @example Director */ + job?: string; + /** @example 5256c8a219c2956ff6046e77 */ + credit_id?: string; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 44797 + */ + id: number; + /** @example Directing */ + known_for_department?: string; + /** @example Timothy Van Patten */ + name?: string; + /** @example Timothy Van Patten */ + original_name?: string; + /** + * @default 0 + * @example 8.292 + */ + popularity: number; + /** @example /MzSOFrd99HRdr6pkSRSctk3kBR.jpg */ + profile_path?: string; + }[]; + guest_stars?: { + /** @example Benjen Stark */ + character?: string; + /** @example 5256c8b919c2956ff604836a */ + credit_id?: string; + /** + * @default 0 + * @example 62 + */ + order: number; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 119783 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Joseph Mawle */ + name?: string; + /** @example Joseph Mawle */ + original_name?: string; + /** + * @default 0 + * @example 8.559 + */ + popularity: number; + /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ + profile_path?: string; + }[]; + /** + * @default 0 + * @example 63056 + */ + id: number; + }; + }; + }; + }; + }; + 'tv-episode-external-ids': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 63056 + */ + id: number; + /** @example tt1480055 */ + imdb_id?: string; + /** @example /m/0gmc6ph */ + freebase_mid?: string; + /** @example /en/winter_is_coming */ + freebase_id?: string; + /** + * @default 0 + * @example 3254641 + */ + tvdb_id: number; + /** + * @default 0 + * @example 1065008299 + */ + tvrage_id: number; + /** @example Q2614622 */ + wikidata_id?: string; + }; + }; + }; + }; + }; + 'tv-episode-images': { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 63056 + */ + id: number; + stills?: { + /** + * @default 0 + * @example 1.778 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 1080 + */ + height: number; + iso_639_1?: unknown; + /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.454 + */ + vote_average: number; + /** + * @default 0 + * @example 3 + */ + vote_count: number; + /** + * @default 0 + * @example 1920 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + 'tv-episode-translations': { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 63056 + */ + id: number; + translations?: { + /** @example SA */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example */ + name?: string; + /** @example خلف باب واسع من الجليد في شمالي وستيروس هناك شيء يحدث. تتلقى عائلة ستارك التي من وينترفيل زيارة من العائلة المالكة، بينما يشكل أمير عائلة تارغارين المنفي تحالفاً جديداً للسيطرة على العرش من جديد. */ + overview?: string; + }; + }[]; + }; + }; + }; + }; + }; + 'tv-episode-videos': { + parameters: { + query?: { + /** @description filter the list results by language, supports more than one value by using a comma */ + include_video_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 3624 + */ + id: number; + results?: { + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Game Of Thrones - Season 1 Recap - Official HBO UK */ + name?: string; + /** @example e0Y8KpQpW8c */ + key?: string; + /** @example YouTube */ + site?: string; + /** + * @default 0 + * @example 1080 + */ + size: number; + /** @example Recap */ + type?: string; + /** + * @default true + * @example true + */ + official: boolean; + /** @example 2015-05-19T16:31:23.000Z */ + published_at?: string; + /** @example 5ce71a920e0a265ac0cfe497 */ + id?: string; + }[]; + }; + }; + }; + }; + }; + 'tv-episode-add-rating': { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header: { + 'Content-Type': string; + }; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + 'application/json': { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + 'tv-episode-delete-rating': { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header?: { + 'Content-Type'?: string; + }; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** + * @default 0 + * @example 13 + */ + status_code: number; + /** @example The item/record was deleted successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + 'tv-episode-group-details': { + parameters: { + query?: never; + header?: never; + path: { + tv_episode_group_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + /** @example Comedians in Cars organized in Netflix's collections. */ + description?: string; + /** + * @default 0 + * @example 83 + */ + episode_count: number; + /** + * @default 0 + * @example 6 + */ + group_count: number; + groups?: { + /** @example 5acf93efc3a368739a0000a9 */ + id?: string; + /** @example First Cup */ + name?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + episodes?: { + /** @example 2015-06-17 */ + air_date?: string; + /** + * @default 0 + * @example 3 + */ + episode_number: number; + /** + * @default 0 + * @example 1078262 + */ + id: number; + /** @example Jim Carrey: We Love Breathing What You're Burning, Baby */ + name?: string; + /** @example Jerry’s full of testosterone as he steps into a ‘76 Lamborghini Countach with Jim Carrey, who’s between a three-week cleanse and a five-day silent retreat. After coffee, it’s off to Carrey’s studio to study a portrait of a gorilla with a machine gun. Wow. */ + overview?: string; + /** @example */ + production_code?: string; + runtime?: unknown; + /** + * @default 0 + * @example 6 + */ + season_number: number; + /** + * @default 0 + * @example 59717 + */ + show_id: number; + /** @example /aOyE420zuFq9zWtEWjIccAiTrzU.jpg */ + still_path?: string; + /** + * @default 0 + * @example 7.4 + */ + vote_average: number; + /** + * @default 0 + * @example 5 + */ + vote_count: number; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + /** + * @default true + * @example true + */ + locked: boolean; + }[]; + /** @example 5acf93e60e0a26346d0000ce */ + id?: string; + /** @example Netflix Collections */ + name?: string; + network?: { + /** + * @default 0 + * @example 213 + */ + id: number; + /** @example /wwemzKWzjKYJFfCeiB57q3r4Bcm.png */ + logo_path?: string; + /** @example Netflix */ + name?: string; + /** @example */ + origin_country?: string; + }; + /** + * @default 0 + * @example 4 + */ + type: number; + }; + }; + }; + }; + }; + 'watch-providers-available-regions': { + parameters: { + query?: { + language?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + results?: { + /** @example AD */ + iso_3166_1?: string; + /** @example Andorra */ + english_name?: string; + /** @example Andorra */ + native_name?: string; + }[]; + }; + }; + }; + }; + }; + 'watch-providers-movie-list': { + parameters: { + query?: { + language?: string; + watch_region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + results?: { + display_priorities?: { + /** + * @default 0 + * @example 6 + */ + CA: number; + /** + * @default 0 + * @example 1 + */ + AE: number; + /** + * @default 0 + * @example 3 + */ + AR: number; + /** + * @default 0 + * @example 4 + */ + AT: number; + /** + * @default 0 + * @example 10 + */ + AU: number; + /** + * @default 0 + * @example 6 + */ + BE: number; + /** + * @default 0 + * @example 6 + */ + BO: number; + /** + * @default 0 + * @example 8 + */ + BR: number; + /** + * @default 0 + * @example 2 + */ + BG: number; + /** + * @default 0 + * @example 4 + */ + CH: number; + /** + * @default 0 + * @example 3 + */ + CL: number; + /** + * @default 0 + * @example 4 + */ + CO: number; + /** + * @default 0 + * @example 5 + */ + CR: number; + /** + * @default 0 + * @example 3 + */ + CZ: number; + /** + * @default 0 + * @example 4 + */ + DE: number; + /** + * @default 0 + * @example 7 + */ + DK: number; + /** + * @default 0 + * @example 7 + */ + EC: number; + /** + * @default 0 + * @example 3 + */ + EE: number; + /** + * @default 0 + * @example 2 + */ + EG: number; + /** + * @default 0 + * @example 4 + */ + ES: number; + /** + * @default 0 + * @example 10 + */ + FI: number; + /** + * @default 0 + * @example 5 + */ + FR: number; + /** + * @default 0 + * @example 5 + */ + GB: number; + /** + * @default 0 + * @example 2 + */ + GR: number; + /** + * @default 0 + * @example 7 + */ + GT: number; + /** + * @default 0 + * @example 5 + */ + HK: number; + /** + * @default 0 + * @example 7 + */ + HN: number; + /** + * @default 0 + * @example 3 + */ + HU: number; + /** + * @default 0 + * @example 4 + */ + ID: number; + /** + * @default 0 + * @example 4 + */ + IE: number; + /** + * @default 0 + * @example 8 + */ + IN: number; + /** + * @default 0 + * @example 4 + */ + IT: number; + /** + * @default 0 + * @example 7 + */ + JP: number; + /** + * @default 0 + * @example 3 + */ + LT: number; + /** + * @default 0 + * @example 3 + */ + LV: number; + /** + * @default 0 + * @example 4 + */ + MX: number; + /** + * @default 0 + * @example 4 + */ + MY: number; + /** + * @default 0 + * @example 8 + */ + NL: number; + /** + * @default 0 + * @example 6 + */ + NO: number; + /** + * @default 0 + * @example 4 + */ + NZ: number; + /** + * @default 0 + * @example 3 + */ + PE: number; + /** + * @default 0 + * @example 4 + */ + PH: number; + /** + * @default 0 + * @example 1 + */ + PL: number; + /** + * @default 0 + * @example 4 + */ + PT: number; + /** + * @default 0 + * @example 7 + */ + PY: number; + /** + * @default 0 + * @example 2 + */ + RU: number; + /** + * @default 0 + * @example 1 + */ + SA: number; + /** + * @default 0 + * @example 8 + */ + SE: number; + /** + * @default 0 + * @example 5 + */ + SG: number; + /** + * @default 0 + * @example 3 + */ + SK: number; + /** + * @default 0 + * @example 4 + */ + TH: number; + /** + * @default 0 + * @example 6 + */ + TR: number; + /** + * @default 0 + * @example 7 + */ + TW: number; + /** + * @default 0 + * @example 4 + */ + US: number; + /** + * @default 0 + * @example 4 + */ + VE: number; + /** + * @default 0 + * @example 2 + */ + ZA: number; + /** + * @default 0 + * @example 31 + */ + SI: number; + /** + * @default 0 + * @example 13 + */ + CV: number; + /** + * @default 0 + * @example 17 + */ + GH: number; + /** + * @default 0 + * @example 15 + */ + MU: number; + /** + * @default 0 + * @example 16 + */ + MZ: number; + /** + * @default 0 + * @example 16 + */ + UG: number; + /** + * @default 0 + * @example 28 + */ + IL: number; + }; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + }[]; + }; + }; + }; + }; + }; + 'watch-provider-tv-list': { + parameters: { + query?: { + language?: string; + watch_region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': { + results?: { + display_priorities?: { + /** + * @default 0 + * @example 6 + */ + CA: number; + /** + * @default 0 + * @example 1 + */ + AE: number; + /** + * @default 0 + * @example 3 + */ + AR: number; + /** + * @default 0 + * @example 4 + */ + AT: number; + /** + * @default 0 + * @example 10 + */ + AU: number; + /** + * @default 0 + * @example 6 + */ + BE: number; + /** + * @default 0 + * @example 6 + */ + BO: number; + /** + * @default 0 + * @example 8 + */ + BR: number; + /** + * @default 0 + * @example 2 + */ + BG: number; + /** + * @default 0 + * @example 4 + */ + CH: number; + /** + * @default 0 + * @example 3 + */ + CL: number; + /** + * @default 0 + * @example 4 + */ + CO: number; + /** + * @default 0 + * @example 5 + */ + CR: number; + /** + * @default 0 + * @example 3 + */ + CZ: number; + /** + * @default 0 + * @example 4 + */ + DE: number; + /** + * @default 0 + * @example 7 + */ + DK: number; + /** + * @default 0 + * @example 7 + */ + EC: number; + /** + * @default 0 + * @example 3 + */ + EE: number; + /** + * @default 0 + * @example 2 + */ + EG: number; + /** + * @default 0 + * @example 4 + */ + ES: number; + /** + * @default 0 + * @example 10 + */ + FI: number; + /** + * @default 0 + * @example 5 + */ + FR: number; + /** + * @default 0 + * @example 5 + */ + GB: number; + /** + * @default 0 + * @example 2 + */ + GR: number; + /** + * @default 0 + * @example 7 + */ + GT: number; + /** + * @default 0 + * @example 5 + */ + HK: number; + /** + * @default 0 + * @example 7 + */ + HN: number; + /** + * @default 0 + * @example 3 + */ + HU: number; + /** + * @default 0 + * @example 4 + */ + ID: number; + /** + * @default 0 + * @example 4 + */ + IE: number; + /** + * @default 0 + * @example 8 + */ + IN: number; + /** + * @default 0 + * @example 4 + */ + IT: number; + /** + * @default 0 + * @example 7 + */ + JP: number; + /** + * @default 0 + * @example 3 + */ + LT: number; + /** + * @default 0 + * @example 3 + */ + LV: number; + /** + * @default 0 + * @example 4 + */ + MX: number; + /** + * @default 0 + * @example 4 + */ + MY: number; + /** + * @default 0 + * @example 8 + */ + NL: number; + /** + * @default 0 + * @example 6 + */ + NO: number; + /** + * @default 0 + * @example 4 + */ + NZ: number; + /** + * @default 0 + * @example 3 + */ + PE: number; + /** + * @default 0 + * @example 4 + */ + PH: number; + /** + * @default 0 + * @example 1 + */ + PL: number; + /** + * @default 0 + * @example 4 + */ + PT: number; + /** + * @default 0 + * @example 7 + */ + PY: number; + /** + * @default 0 + * @example 2 + */ + RU: number; + /** + * @default 0 + * @example 1 + */ + SA: number; + /** + * @default 0 + * @example 8 + */ + SE: number; + /** + * @default 0 + * @example 5 + */ + SG: number; + /** + * @default 0 + * @example 3 + */ + SK: number; + /** + * @default 0 + * @example 4 + */ + TH: number; + /** + * @default 0 + * @example 6 + */ + TR: number; + /** + * @default 0 + * @example 7 + */ + TW: number; + /** + * @default 0 + * @example 4 + */ + US: number; + /** + * @default 0 + * @example 4 + */ + VE: number; + /** + * @default 0 + * @example 2 + */ + ZA: number; + /** + * @default 0 + * @example 31 + */ + SI: number; + /** + * @default 0 + * @example 13 + */ + CV: number; + /** + * @default 0 + * @example 17 + */ + GH: number; + /** + * @default 0 + * @example 15 + */ + MU: number; + /** + * @default 0 + * @example 16 + */ + MZ: number; + /** + * @default 0 + * @example 16 + */ + UG: number; + /** + * @default 0 + * @example 28 + */ + IL: number; + }; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + }[]; + }; + }; + }; + }; + }; +} diff --git a/src/main.ts b/src/main.ts index 394ffb7..93784e8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,10 @@ -import { MarkdownView, Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder } from 'obsidian'; +import type { TFile } from 'obsidian'; +import { MarkdownView, Notice, parseYaml, Plugin, stringifyYaml, TFolder } from 'obsidian'; +import { requestUrl, normalizePath } from 'obsidian'; import type { MediaType } from 'src/utils/MediaType'; import { APIManager } from './api/APIManager'; import { BoardGameGeekAPI } from './api/apis/BoardGameGeekAPI'; +import { ComicVineAPI } from './api/apis/ComicVineAPI'; import { GiantBombAPI } from './api/apis/GiantBombAPI'; import { MALAPI } from './api/apis/MALAPI'; import { MALAPIManga } from './api/apis/MALAPIManga'; @@ -10,21 +13,27 @@ import { MusicBrainzAPI } from './api/apis/MusicBrainzAPI'; import { OMDbAPI } from './api/apis/OMDbAPI'; import { OpenLibraryAPI } from './api/apis/OpenLibraryAPI'; import { SteamAPI } from './api/apis/SteamAPI'; +import { TMDBSeriesAPI } from './api/apis/TMDBSeriesAPI'; +import { TMDBSeasonAPI } from './api/apis/TMDBSeasonAPI'; +import { TMDBMovieAPI } from './api/apis/TMDBMovieAPI'; import { WikipediaAPI } from './api/apis/WikipediaAPI'; import { ComicVineAPI } from './api/apis/ComicVineAPI'; import { VNDBAPI } from './api/apis/VNDBAPI'; import { MediaDbFolderImportModal } from './modals/MediaDbFolderImportModal'; +import { ConfirmOverwriteModal } from './modals/ConfirmOverwriteModal'; +import { MediaDbSeasonSelectModal } from './modals/MediaDbSeasonSelectModal'; import type { MediaTypeModel } from './models/MediaTypeModel'; import { PropertyMapper } from './settings/PropertyMapper'; import { PropertyMapping, PropertyMappingModel } from './settings/PropertyMapping'; import type { MediaDbPluginSettings } from './settings/Settings'; import { getDefaultSettings, MediaDbSettingTab } from './settings/Settings'; +import { BulkImportHelper } from './utils/BulkImportHelper'; import { DateFormatter } from './utils/DateFormatter'; import { MEDIA_TYPES, MediaTypeManager } from './utils/MediaTypeManager'; import type { SearchModalOptions } from './utils/ModalHelper'; -import { ModalHelper, ModalResultCode } from './utils/ModalHelper'; +import { ModalHelper } from './utils/ModalHelper'; import type { CreateNoteOptions } from './utils/Utils'; -import { dateTimeToString, markdownTable, replaceIllegalFileNameCharactersInString, unCamelCase, hasTemplaterPlugin, useTemplaterPluginInFile } from './utils/Utils'; +import { replaceIllegalFileNameCharactersInString, unCamelCase, hasTemplaterPlugin, useTemplaterPluginInFile } from './utils/Utils'; export type Metadata = Record; @@ -40,6 +49,7 @@ export default class MediaDbPlugin extends Plugin { mediaTypeManager!: MediaTypeManager; modelPropertyMapper!: PropertyMapper; modalHelper!: ModalHelper; + bulkImportHelper!: BulkImportHelper; dateFormatter!: DateFormatter; frontMatterRexExpPattern: string = '^(---)\\n[\\s\\S]*?\\n---'; @@ -53,17 +63,20 @@ export default class MediaDbPlugin extends Plugin { this.apiManager.registerAPI(new WikipediaAPI(this)); this.apiManager.registerAPI(new MusicBrainzAPI(this)); this.apiManager.registerAPI(new SteamAPI(this)); + this.apiManager.registerAPI(new TMDBSeriesAPI(this)); + this.apiManager.registerAPI(new TMDBSeasonAPI(this)); + this.apiManager.registerAPI(new TMDBMovieAPI(this)); this.apiManager.registerAPI(new BoardGameGeekAPI(this)); this.apiManager.registerAPI(new OpenLibraryAPI(this)); this.apiManager.registerAPI(new ComicVineAPI(this)); this.apiManager.registerAPI(new MobyGamesAPI(this)); this.apiManager.registerAPI(new GiantBombAPI(this)); this.apiManager.registerAPI(new VNDBAPI(this)); - // this.apiManager.registerAPI(new LocGovAPI(this)); // TODO: parse data this.mediaTypeManager = new MediaTypeManager(); this.modelPropertyMapper = new PropertyMapper(this); this.modalHelper = new ModalHelper(this); + this.bulkImportHelper = new BulkImportHelper(this); this.dateFormatter = new DateFormatter(); await this.loadSettings(); @@ -84,7 +97,7 @@ export default class MediaDbPlugin extends Plugin { menu.addItem(item => { item.setTitle('Import folder as Media DB entries') .setIcon('database') - .onClick(() => this.createEntriesFromFolder(file)); + .onClick(() => this.bulkImportHelper.import(file)); }); } }), @@ -123,7 +136,7 @@ export default class MediaDbPlugin extends Plugin { return false; } if (!checking) { - this.updateActiveNote(false); + void this.updateActiveNote(false); } return true; }, @@ -136,7 +149,7 @@ export default class MediaDbPlugin extends Plugin { return false; } if (!checking) { - this.updateActiveNote(true); + void this.updateActiveNote(true); } return true; }, @@ -150,19 +163,13 @@ export default class MediaDbPlugin extends Plugin { return false; } if (!checking) { - this.createLinkWithSearchModal(); + void this.createLinkWithSearchModal(); } return true; }, }); } - /** - * first very simple approach - * TODO: - * - replace the detail query - * - maybe custom link syntax - */ async createLinkWithSearchModal(): Promise { const apiSearchResults = await this.modalHelper.openAdvancedSearchModal({}, async advancedSearchModalData => { return await this.apiManager.query(advancedSearchModalData.query, advancedSearchModalData.apis); @@ -213,25 +220,110 @@ export default class MediaDbPlugin extends Plugin { apiSearchResults = apiSearchResults.filter(x => types.contains(x.type)); let selectResults: MediaTypeModel[]; - let proceed: boolean = false; + const proceed: boolean = false; while (!proceed) { - selectResults = - (await this.modalHelper.openSelectModal({ elements: apiSearchResults }, async selectModalData => { - return await this.queryDetails(selectModalData.selected); - })) ?? []; - if (!selectResults) { + if (types.length === 1 && types[0] === 'season') { + selectResults = + (await this.modalHelper.openSelectModal( + { + elements: apiSearchResults, + description: 'Select one search result to proceed.', + submitButtonText: 'Ok', + }, + async selectModalData => { + return selectModalData.selected; + }, + )) ?? []; + } else { + selectResults = + (await this.modalHelper.openSelectModal( + { + elements: apiSearchResults, + }, + async selectModalData => { + return await this.queryDetails(selectModalData.selected); + }, + )) ?? []; + } + if (!selectResults || selectResults.length < 1) { return; } - proceed = await this.modalHelper.openPreviewModal({ elements: selectResults }, async previewModalData => { + // Only show the season select modal if the user searches for seasons + if (await this.handleSeasonSelectModal(types, selectResults)) { + return; + } + + const confirmed = await this.modalHelper.openPreviewModal({ elements: selectResults }, async previewModalData => { return previewModalData.confirmed; }); + if (!confirmed) { + return; + } + break; } await this.createMediaDbNotes(selectResults!); } + // Season select modal + private async handleSeasonSelectModal(types: string[], selectResults: MediaTypeModel[]): Promise { + if (types.length === 1 && types[0] === 'season' && selectResults.length === 1 && selectResults[0].dataSource === 'TMDBSeasonAPI') { + // Use static import for the modal + const tmdbSeasonAPI = this.apiManager.getApiByName('TMDBSeasonAPI') as import('./api/apis/TMDBSeasonAPI').TMDBSeasonAPI; + if (!tmdbSeasonAPI) { + new Notice('TMDBSeasonAPI not found.'); + return true; + } + // Fetch all seasons for the selected series + const allSeasons = await tmdbSeasonAPI.getSeasonsForSeries(selectResults[0].id); + if (!allSeasons || allSeasons.length === 0) { + new Notice('No seasons found for this series.'); + return true; + } + // Pass the original series title from the search result + const seriesName = selectResults[0]?.englishTitle || selectResults[0]?.title || ''; + const modal = new MediaDbSeasonSelectModal( + this, + allSeasons.map(s => ({ + season_number: s.seasonNumber, + name: s.seasonTitle || s.title, + episode_count: s.episodes || 0, + air_date: s.year, + poster_path: s.image, + })), + true, + seriesName, + ); + const selectedSeasons: any[] = await new Promise(resolve => { + modal.setSubmitCallback(resolve); + modal.open(); + }); + if (!selectedSeasons || selectedSeasons.length === 0) { + return true; + } + // Fetch full metadata for each selected season and create the note + await Promise.all( + selectedSeasons.map(async season => { + const orig = allSeasons.find(s => s.seasonNumber === season.season_number); + if (orig) { + // Fetch full metadata using getById + const tmdbSeasonAPI = this.apiManager.getApiByName('TMDBSeasonAPI') as import('./api/apis/TMDBSeasonAPI').TMDBSeasonAPI; + if (tmdbSeasonAPI) { + const fullMeta = await tmdbSeasonAPI.getById(orig.id); + await this.createMediaDbNotes([fullMeta]); + } else { + await this.createMediaDbNotes([orig]); + } + } + }), + ); + return true; + } + return false; + } + async createEntryWithAdvancedSearchModal(): Promise { const apiSearchResults = await this.modalHelper.openAdvancedSearchModal({}, async advancedSearchModalData => { return await this.apiManager.query(advancedSearchModalData.query, advancedSearchModalData.apis); @@ -243,20 +335,24 @@ export default class MediaDbPlugin extends Plugin { } let selectResults: MediaTypeModel[]; - let proceed: boolean = false; + const proceed: boolean = false; while (!proceed) { selectResults = (await this.modalHelper.openSelectModal({ elements: apiSearchResults }, async selectModalData => { return await this.queryDetails(selectModalData.selected); })) ?? []; - if (!selectResults) { + if (!selectResults || selectResults.length < 1) { return; } - proceed = await this.modalHelper.openPreviewModal({ elements: selectResults }, async previewModalData => { + const confirmed = await this.modalHelper.openPreviewModal({ elements: selectResults }, async previewModalData => { return previewModalData.confirmed; }); + if (!confirmed) { + return; + } + break; } await this.createMediaDbNotes(selectResults!); @@ -308,11 +404,13 @@ export default class MediaDbPlugin extends Plugin { options.openNote = this.settings.openNoteInNewTab; + if (this.settings.imageDownload) { + await this.downloadImageForMediaModel(mediaTypeModel); + } + const fileContent = await this.generateMediaDbNoteContents(mediaTypeModel, options); - if (!options.folder) { - options.folder = await this.mediaTypeManager.getFolder(mediaTypeModel, this.app); - } + options.folder ??= await this.mediaTypeManager.getFolder(mediaTypeModel, this.app); const targetFile = await this.createNote(this.mediaTypeManager.getFileName(mediaTypeModel), fileContent, options); @@ -325,6 +423,40 @@ export default class MediaDbPlugin extends Plugin { } } + /** + * Tries to download the image for a media model. + * + * @param mediaTypeModel + * @returns true if the image was downloaded, false otherwise + */ + private async downloadImageForMediaModel(mediaTypeModel: MediaTypeModel): Promise { + if (mediaTypeModel.image && typeof mediaTypeModel.image === 'string' && mediaTypeModel.image.startsWith('http')) { + try { + const imageUrl = mediaTypeModel.image; + const imageExt = imageUrl.split('.').pop()?.split(/#|\?/)[0] ?? 'jpg'; + const imageFileName = `${replaceIllegalFileNameCharactersInString(`${mediaTypeModel.type}_${mediaTypeModel.title} (${mediaTypeModel.year})`)}.${imageExt}`; + const imagePath = normalizePath(`${this.settings.imageFolder}/${imageFileName}`); + + if (!this.app.vault.getAbstractFileByPath(this.settings.imageFolder)) { + await this.app.vault.createFolder(this.settings.imageFolder); + } + + if (!this.app.vault.getAbstractFileByPath(imagePath)) { + const response = await requestUrl({ url: imageUrl, method: 'GET' }); + await this.app.vault.createBinary(imagePath, response.arrayBuffer); + } + + // Update model to use local image path + mediaTypeModel.image = `[[${imagePath}]]`; + return true; + } catch (e) { + console.warn('MDB | Failed to download image:', e); + } + } + + return false; + } + generateMediaDbNoteFrontmatterPreview(mediaTypeModel: MediaTypeModel): string { const fileMetadata = this.modelPropertyMapper.convertObject(mediaTypeModel.toMetaDataObject()); return stringifyYaml(fileMetadata); @@ -337,18 +469,7 @@ export default class MediaDbPlugin extends Plugin { * @param options */ async generateMediaDbNoteContents(mediaTypeModel: MediaTypeModel, options: CreateNoteOptions): Promise { - const template = await this.mediaTypeManager.getTemplate(mediaTypeModel, this.app); - - return this.generateContentWithDefaultFrontMatter(mediaTypeModel, options, template); - - // if (this.settings.useDefaultFrontMatter || !template) { - // return this.generateContentWithDefaultFrontMatter(mediaTypeModel, options, template); - // } else { - // return this.generateContentWithCustomFrontMatter(mediaTypeModel, options, template); - // } - } - - async generateContentWithDefaultFrontMatter(mediaTypeModel: MediaTypeModel, options: CreateNoteOptions, template?: string): Promise { + let template = await this.mediaTypeManager.getTemplate(mediaTypeModel, this.app); let fileMetadata: Record; if (this.settings.useDefaultFrontMatter) { @@ -377,62 +498,12 @@ export default class MediaDbPlugin extends Plugin { return fileContent; } - async generateContentWithCustomFrontMatter(mediaTypeModel: MediaTypeModel, options: CreateNoteOptions, template: string): Promise { - const regExp = new RegExp(this.frontMatterRexExpPattern); - - const frontMatter = this.getMetaDataFromFileContent(template); - let fileContent: string = template.replace(regExp, ''); - - // Updating a previous file - if (options.attachFile) { - const previousMetadata = this.app.metadataCache.getFileCache(options.attachFile)?.frontmatter ?? {}; - - // Use contents (below front matter) from previous file - fileContent = await this.app.vault.read(options.attachFile); - - fileContent = fileContent.replace(regExp, ''); - fileContent = fileContent.startsWith('\n') ? fileContent.substring(1) : fileContent; - - // Update updated front matter with entries from the old front matter, if it isn't defined in the new front matter - Object.keys(previousMetadata).forEach(key => { - const value = previousMetadata[key]; - - if (!frontMatter[key] && value) { - frontMatter[key] = value; - } - }); - } - - // Ensure that id, type, and dataSource are defined - if (!frontMatter.id) { - frontMatter.id = mediaTypeModel.id; - } - - if (!frontMatter.type) { - frontMatter.type = mediaTypeModel.type; - } - - if (!frontMatter.dataSource) { - frontMatter.dataSource = mediaTypeModel.dataSource; - } - - if (this.settings.enableTemplaterIntegration && hasTemplaterPlugin(this.app)) { - // Only support stringifyYaml for templater plugin - // Include the media variable in all templater commands by using a top level JavaScript execution command. - fileContent = `---\n<%* const media = ${JSON.stringify(mediaTypeModel)} %>\n${stringifyYaml(frontMatter)}---\n${fileContent}`; - } else { - fileContent = `---\n${stringifyYaml(frontMatter)}---\n${fileContent}`; - } - - return fileContent; - } - async attachFile(fileMetadata: Metadata, fileContent: string, fileToAttach?: TFile): Promise<{ fileMetadata: Metadata; fileContent: string }> { if (!fileToAttach) { return { fileMetadata: fileMetadata, fileContent: fileContent }; } - const attachFileMetadata: any = this.getMetadataFromFileCache(fileToAttach); + const attachFileMetadata = this.getMetadataFromFileCache(fileToAttach); // TODO: better object merging fileMetadata = Object.assign(attachFileMetadata, fileMetadata); @@ -450,7 +521,7 @@ export default class MediaDbPlugin extends Plugin { return { fileMetadata: fileMetadata, fileContent: fileContent }; } - const templateMetadata: Metadata = this.getMetaDataFromFileContent(template); + const templateMetadata = this.getMetaDataFromFileContent(template); // TODO: better object merging fileMetadata = Object.assign(templateMetadata, fileMetadata); @@ -476,7 +547,7 @@ export default class MediaDbPlugin extends Plugin { frontMatter = frontMatter.substring(4); frontMatter = frontMatter.substring(0, frontMatter.length - 3); - metadata = parseYaml(frontMatter); + metadata = parseYaml(frontMatter) as Metadata; if (!metadata) { metadata = {}; @@ -510,9 +581,17 @@ export default class MediaDbPlugin extends Plugin { fileName = replaceIllegalFileNameCharactersInString(fileName); const filePath = `${folder.path}/${fileName}.md`; - // find and delete file with the same name + // look if file already exists and ask if it should be overwritten const file = this.app.vault.getAbstractFileByPath(filePath); if (file) { + const shouldOverwrite = await new Promise(resolve => { + new ConfirmOverwriteModal(this.app, fileName, resolve).open(); + }); + + if (!shouldOverwrite) { + throw new Error('MDB | file creation cancelled by user'); + } + await this.app.vault.delete(file); } @@ -520,7 +599,7 @@ export default class MediaDbPlugin extends Plugin { const targetFile = await this.app.vault.create(filePath, fileContent); console.debug(`MDB | created new file at ${filePath}`); - // open newly crated file + // open newly created file if (options.openNote) { const activeLeaf = this.app.workspace.getUnpinnedLeaf(); if (!activeLeaf) { @@ -573,95 +652,9 @@ export default class MediaDbPlugin extends Plugin { } } - async createEntriesFromFolder(folder: TFolder): Promise { - const erroredFiles: { filePath: string; error: string }[] = []; - let canceled: boolean = false; - - const { selectedAPI, titleFieldName, appendContent } = await new Promise<{ selectedAPI: string; titleFieldName: string; appendContent: boolean }>(resolve => { - new MediaDbFolderImportModal(this.app, this, (selectedAPI: string, titleFieldName: string, appendContent: boolean) => { - resolve({ selectedAPI, titleFieldName, appendContent }); - }).open(); - }); - - for (const child of folder.children) { - if (child instanceof TFile) { - const file: TFile = child; - if (canceled) { - erroredFiles.push({ filePath: file.path, error: 'user canceled' }); - continue; - } - - const metadata: any = this.getMetadataFromFileCache(file); - - const title = metadata[titleFieldName]; - if (!title) { - erroredFiles.push({ filePath: file.path, error: `metadata field '${titleFieldName}' not found or empty` }); - continue; - } - - let results: MediaTypeModel[] = []; - try { - results = await this.apiManager.query(title, [selectedAPI]); - } catch (e) { - erroredFiles.push({ filePath: file.path, error: `${e}` }); - continue; - } - if (!results || results.length === 0) { - erroredFiles.push({ filePath: file.path, error: `no search results` }); - continue; - } - - const { selectModalResult, selectModal } = await this.modalHelper.createSelectModal({ elements: results, skipButton: true, modalTitle: `Results for '${title}'` }); - - if (selectModalResult.code === ModalResultCode.ERROR) { - erroredFiles.push({ filePath: file.path, error: selectModalResult.error.message }); - selectModal.close(); - continue; - } - - if (selectModalResult.code === ModalResultCode.CLOSE) { - erroredFiles.push({ filePath: file.path, error: 'user canceled' }); - selectModal.close(); - canceled = true; - continue; - } - - if (selectModalResult.code === ModalResultCode.SKIP) { - erroredFiles.push({ filePath: file.path, error: 'user skipped' }); - selectModal.close(); - continue; - } - - if (selectModalResult.data.selected.length === 0) { - erroredFiles.push({ filePath: file.path, error: `no search results selected` }); - continue; - } - - const detailedResults = await this.queryDetails(selectModalResult.data.selected); - await this.createMediaDbNotes(detailedResults, appendContent ? file : undefined); - - selectModal.close(); - } - } - - if (erroredFiles.length > 0) { - await this.createErroredFilesReport(erroredFiles); - } - } - - async createErroredFilesReport(erroredFiles: { filePath: string; error: string }[]): Promise { - const title = `MDB - bulk import error report ${dateTimeToString(new Date())}`; - const filePath = `${title}.md`; - - const table = [['file', 'error']].concat(erroredFiles.map(x => [x.filePath, x.error])); - - const fileContent = `# ${title}\n\n${markdownTable(table)}`; - await this.app.vault.create(filePath, fileContent); - } - async loadSettings(): Promise { // console.log(DEFAULT_SETTINGS); - const diskSettings: MediaDbPluginSettings = await this.loadData(); + const diskSettings: MediaDbPluginSettings = (await this.loadData()) as MediaDbPluginSettings; const defaultSettings: MediaDbPluginSettings = getDefaultSettings(this); const loadedSettings: MediaDbPluginSettings = Object.assign({}, defaultSettings, diskSettings); @@ -683,7 +676,9 @@ export default class MediaDbPlugin extends Plugin { newProperties.push(defaultProperty); } else { // newProperty is just an object and take locked status from default property - newProperties.push(new PropertyMapping(newProperty.property, newProperty.newProperty, newProperty.mapping, defaultProperty.locked)); + newProperties.push( + new PropertyMapping(newProperty.property, newProperty.newProperty, newProperty.mapping, defaultProperty.locked, newProperty.wikilink ?? false), + ); } } diff --git a/src/modals/ConfirmOverwriteModal.ts b/src/modals/ConfirmOverwriteModal.ts new file mode 100644 index 0000000..e300c32 --- /dev/null +++ b/src/modals/ConfirmOverwriteModal.ts @@ -0,0 +1,44 @@ +import type { App } from 'obsidian'; +import { Modal, Setting } from 'obsidian'; + +export class ConfirmOverwriteModal extends Modal { + result: boolean = false; + onSubmit: (result: boolean) => void; + fileName: string; + + constructor(app: App, fileName: string, onSubmit: (result: boolean) => void) { + super(app); + this.fileName = fileName; + this.onSubmit = onSubmit; + } + + onOpen(): void { + const { contentEl } = this; + contentEl.createEl('h2', { text: 'File already exists' }); + contentEl.createEl('p', { text: `The file "${this.fileName}" already exists. Do you want to overwrite it?` }); + + contentEl.createDiv({ cls: 'media-db-plugin-spacer' }); + + const bottomSettingRow = new Setting(contentEl); + bottomSettingRow.addButton(btn => { + btn.setButtonText('No'); + btn.onClick(() => this.close()); + btn.buttonEl.addClass('media-db-plugin-button'); + }); + bottomSettingRow.addButton(btn => { + btn.setButtonText('Yes'); + btn.setCta(); + btn.onClick(() => { + this.result = true; + this.close(); + }); + btn.buttonEl.addClass('media-db-plugin-button'); + }); + } + + onClose(): void { + const { contentEl } = this; + contentEl.empty(); + this.onSubmit(this.result); + } +} diff --git a/src/modals/MediaDbAdvancedSearchModal.ts b/src/modals/MediaDbAdvancedSearchModal.ts index d6aa564..7a9a6f7 100644 --- a/src/modals/MediaDbAdvancedSearchModal.ts +++ b/src/modals/MediaDbAdvancedSearchModal.ts @@ -1,7 +1,6 @@ import type { ButtonComponent } from 'obsidian'; import { Modal, Notice, Setting, TextComponent, ToggleComponent } from 'obsidian'; import type MediaDbPlugin from '../main'; -import type { MediaTypeModel } from '../models/MediaTypeModel'; import type { AdvancedSearchModalData, AdvancedSearchModalOptions } from '../utils/ModalHelper'; import { ADVANCED_SEARCH_MODAL_DEFAULT_OPTIONS } from '../utils/ModalHelper'; @@ -39,7 +38,7 @@ export class MediaDbAdvancedSearchModal extends Modal { keyPressCallback(event: KeyboardEvent): void { if (event.key === 'Enter') { - this.search(); + void this.search(); } } @@ -119,7 +118,7 @@ export class MediaDbAdvancedSearchModal extends Modal { btn.setButtonText('Ok'); btn.setCta(); btn.onClick(() => { - this.search(); + void this.search(); }); btn.buttonEl.addClass('media-db-plugin-button'); this.searchBtn = btn; diff --git a/src/modals/MediaDbBulkImportModal.ts b/src/modals/MediaDbBulkImportModal.ts new file mode 100644 index 0000000..1aee8ee --- /dev/null +++ b/src/modals/MediaDbBulkImportModal.ts @@ -0,0 +1,134 @@ +import type { ButtonComponent } from 'obsidian'; +import { DropdownComponent, Modal, Setting, TextComponent, ToggleComponent } from 'obsidian'; +import type { APIModel } from 'src/api/APIModel'; +import { BulkImportLookupMethod } from 'src/utils/BulkImportHelper'; +import type MediaDbPlugin from '../main'; + +export class MediaDbBulkImportModal extends Modal { + plugin: MediaDbPlugin; + onSubmit: (selectedAPI: string, lookupMethod: BulkImportLookupMethod, fieldName: string, appendContent: boolean) => void; + selectedApi: string; + searchBtn?: ButtonComponent; + lookupMethod: BulkImportLookupMethod; + fieldName: string; + appendContent: boolean; + + constructor(plugin: MediaDbPlugin, onSubmit: (selectedAPI: string, lookupMethod: BulkImportLookupMethod, fieldName: string, appendContent: boolean) => void) { + super(plugin.app); + this.plugin = plugin; + this.onSubmit = onSubmit; + this.selectedApi = plugin.apiManager.apis[0].apiName; + this.lookupMethod = BulkImportLookupMethod.TITLE; + this.fieldName = ''; + this.appendContent = false; + } + + submit(): void { + this.onSubmit(this.selectedApi, this.lookupMethod, this.fieldName, this.appendContent); + this.close(); + } + + onOpen(): void { + const { contentEl } = this; + + contentEl.createEl('h2', { text: 'Import folder as Media DB entries' }); + + this.createDropdownEl( + contentEl, + 'API to search', + (value: string) => { + this.selectedApi = value; + }, + this.plugin.apiManager.apis.map((api: APIModel) => { + return { value: api.apiName, display: api.apiName }; + }), + ); + + contentEl.createDiv({ cls: 'media-db-plugin-spacer' }); + contentEl.createEl('h3', { text: 'Append note content to Media DB entry?' }); + + const appendContentToggleElementWrapper = contentEl.createEl('div', { cls: 'media-db-plugin-list-wrapper' }); + const appendContentToggleTextWrapper = appendContentToggleElementWrapper.createEl('div', { cls: 'media-db-plugin-list-text-wrapper' }); + appendContentToggleTextWrapper.createEl('span', { + text: 'If this is enabled, the plugin will override metadata fields with the same name.', + cls: 'media-db-plugin-list-text', + }); + + const appendContentToggleComponentWrapper = appendContentToggleElementWrapper.createEl('div', { cls: 'media-db-plugin-list-toggle' }); + + const appendContentToggle = new ToggleComponent(appendContentToggleElementWrapper); + appendContentToggle.setValue(false); + appendContentToggle.onChange(value => (this.appendContent = value)); + appendContentToggleComponentWrapper.appendChild(appendContentToggle.toggleEl); + + contentEl.createDiv({ cls: 'media-db-plugin-spacer' }); + contentEl.createEl('h3', { text: 'Media lookup method' }); + contentEl.createEl('p', { + text: 'Choose whether to search the API by title (can return multiple results) or lookup directly using an ID (returns at most one result), and specify the name of the frontmatter property which contains the title or ID of the media.', + }); + + this.createDropdownEl( + contentEl, + 'Lookup media by', + (value: string) => { + this.lookupMethod = value as BulkImportLookupMethod; + }, + [ + { value: BulkImportLookupMethod.TITLE, display: 'Title' }, + { value: BulkImportLookupMethod.ID, display: 'ID' }, + ], + ); + + contentEl.createDiv({ cls: 'media-db-plugin-spacer' }); + + const fieldNameWrapperEl = contentEl.createEl('div', { cls: 'media-db-plugin-list-wrapper' }); + const fieldNameLabelWrapperEl = fieldNameWrapperEl.createEl('div', { cls: 'media-db-plugin-list-text-wrapper' }); + fieldNameLabelWrapperEl.createEl('span', { text: 'Using the property named', cls: 'media-db-plugin-list-text' }); + + const fieldNameComponent = new TextComponent(fieldNameWrapperEl); + fieldNameComponent.setPlaceholder('title / id'); + fieldNameComponent.onChange(value => (this.fieldName = value)); + fieldNameComponent.inputEl.addEventListener('keydown', ke => { + if (ke.key === 'Enter') { + this.submit(); + } + }); + contentEl.appendChild(fieldNameWrapperEl); + + contentEl.createDiv({ cls: 'media-db-plugin-spacer' }); + + new Setting(contentEl) + .addButton(btn => { + btn.setButtonText('Cancel'); + btn.onClick(() => this.close()); + btn.buttonEl.addClass('media-db-plugin-button'); + }) + .addButton(btn => { + btn.setButtonText('Ok'); + btn.setCta(); + btn.onClick(() => { + this.submit(); + }); + btn.buttonEl.addClass('media-db-plugin-button'); + this.searchBtn = btn; + }); + } + + createDropdownEl(parentEl: HTMLElement, label: string, onChange: (value: string) => void, options: { value: string; display: string }[]): void { + const wrapperEl = parentEl.createEl('div', { cls: 'media-db-plugin-list-wrapper' }); + const labelWrapperEl = wrapperEl.createEl('div', { cls: 'media-db-plugin-list-text-wrapper' }); + labelWrapperEl.createEl('span', { text: label, cls: 'media-db-plugin-list-text' }); + + const dropDownComponent = new DropdownComponent(wrapperEl); + dropDownComponent.onChange(onChange); + for (const option of options) { + dropDownComponent.addOption(option.value, option.display); + } + wrapperEl.appendChild(dropDownComponent.selectEl); + } + + onClose(): void { + const { contentEl } = this; + contentEl.empty(); + } +} diff --git a/src/modals/MediaDbFolderImportModal.ts b/src/modals/MediaDbFolderImportModal.ts deleted file mode 100644 index 995df1a..0000000 --- a/src/modals/MediaDbFolderImportModal.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type { App, ButtonComponent } from 'obsidian'; -import { DropdownComponent, Modal, Setting, TextComponent, ToggleComponent } from 'obsidian'; -import type MediaDbPlugin from '../main'; - -export class MediaDbFolderImportModal extends Modal { - plugin: MediaDbPlugin; - onSubmit: (selectedAPI: string, titleFieldName: string, appendContent: boolean) => void; - selectedApi: string; - searchBtn?: ButtonComponent; - titleFieldName: string; - appendContent: boolean; - - constructor(app: App, plugin: MediaDbPlugin, onSubmit: (selectedAPI: string, titleFieldName: string, appendContent: boolean) => void) { - super(app); - this.plugin = plugin; - this.onSubmit = onSubmit; - this.selectedApi = plugin.apiManager.apis[0].apiName; - this.titleFieldName = ''; - this.appendContent = false; - } - - submit(): void { - this.onSubmit(this.selectedApi, this.titleFieldName, this.appendContent); - this.close(); - } - - onOpen(): void { - const { contentEl } = this; - - contentEl.createEl('h2', { text: 'Import folder as Media DB entries' }); - - const apiSelectorWrapper = contentEl.createEl('div', { cls: 'media-db-plugin-list-wrapper' }); - const apiSelectorTextWrapper = apiSelectorWrapper.createEl('div', { cls: 'media-db-plugin-list-text-wrapper' }); - apiSelectorTextWrapper.createEl('span', { text: 'API to search', cls: 'media-db-plugin-list-text' }); - - const apiSelectorComponent = new DropdownComponent(apiSelectorWrapper); - apiSelectorComponent.onChange((value: string) => { - this.selectedApi = value; - }); - for (const api of this.plugin.apiManager.apis) { - apiSelectorComponent.addOption(api.apiName, api.apiName); - } - apiSelectorWrapper.appendChild(apiSelectorComponent.selectEl); - - contentEl.createDiv({ cls: 'media-db-plugin-spacer' }); - contentEl.createEl('h3', { text: 'Append note content to Media DB entry.' }); - - const appendContentToggleElementWrapper = contentEl.createEl('div', { cls: 'media-db-plugin-list-wrapper' }); - const appendContentToggleTextWrapper = appendContentToggleElementWrapper.createEl('div', { cls: 'media-db-plugin-list-text-wrapper' }); - appendContentToggleTextWrapper.createEl('span', { - text: 'If this is enabled, the plugin will override metadata fields with the same name.', - cls: 'media-db-plugin-list-text', - }); - - const appendContentToggleComponentWrapper = appendContentToggleElementWrapper.createEl('div', { cls: 'media-db-plugin-list-toggle' }); - - const appendContentToggle = new ToggleComponent(appendContentToggleElementWrapper); - appendContentToggle.setValue(false); - appendContentToggle.onChange(value => (this.appendContent = value)); - appendContentToggleComponentWrapper.appendChild(appendContentToggle.toggleEl); - - contentEl.createDiv({ cls: 'media-db-plugin-spacer' }); - contentEl.createEl('h3', { text: 'The name of the metadata field that should be used as the title to query.' }); - - const placeholder = 'title'; - const titleFieldNameComponent = new TextComponent(contentEl); - titleFieldNameComponent.inputEl.style.width = '100%'; - titleFieldNameComponent.setPlaceholder(placeholder); - titleFieldNameComponent.onChange(value => (this.titleFieldName = value)); - titleFieldNameComponent.inputEl.addEventListener('keydown', ke => { - if (ke.key === 'Enter') { - this.submit(); - } - }); - contentEl.appendChild(titleFieldNameComponent.inputEl); - - contentEl.createDiv({ cls: 'media-db-plugin-spacer' }); - - new Setting(contentEl) - .addButton(btn => { - btn.setButtonText('Cancel'); - btn.onClick(() => this.close()); - btn.buttonEl.addClass('media-db-plugin-button'); - }) - .addButton(btn => { - btn.setButtonText('Ok'); - btn.setCta(); - btn.onClick(() => { - this.submit(); - }); - btn.buttonEl.addClass('media-db-plugin-button'); - this.searchBtn = btn; - }); - } - - onClose(): void { - const { contentEl } = this; - contentEl.empty(); - } -} diff --git a/src/modals/MediaDbIdSearchModal.ts b/src/modals/MediaDbIdSearchModal.ts index e7ee81c..c3bc3d4 100644 --- a/src/modals/MediaDbIdSearchModal.ts +++ b/src/modals/MediaDbIdSearchModal.ts @@ -1,7 +1,6 @@ import type { ButtonComponent } from 'obsidian'; import { DropdownComponent, Modal, Notice, Setting, TextComponent } from 'obsidian'; import type MediaDbPlugin from '../main'; -import type { MediaTypeModel } from '../models/MediaTypeModel'; import type { IdSearchModalData, IdSearchModalOptions } from '../utils/ModalHelper'; import { ID_SEARCH_MODAL_DEFAULT_OPTIONS } from '../utils/ModalHelper'; @@ -24,7 +23,7 @@ export class MediaDbIdSearchModal extends Modal { this.plugin = plugin; this.title = idSearchModalOptions.modalTitle ?? ''; - this.selectedApi = idSearchModalOptions.preselectedAPI || plugin.apiManager.apis[0].apiName; + this.selectedApi = idSearchModalOptions.preselectedAPI ?? plugin.apiManager.apis[0].apiName; this.query = ''; this.isBusy = false; } @@ -39,7 +38,7 @@ export class MediaDbIdSearchModal extends Modal { keyPressCallback(event: KeyboardEvent): void { if (event.key === 'Enter') { - this.search(); + void this.search(); } } @@ -105,7 +104,7 @@ export class MediaDbIdSearchModal extends Modal { btn.setButtonText('Ok'); btn.setCta(); btn.onClick(() => { - this.search(); + void this.search(); }); btn.buttonEl.addClass('media-db-plugin-button'); this.searchBtn = btn; diff --git a/src/modals/MediaDbPreviewModal.ts b/src/modals/MediaDbPreviewModal.ts index aa7f707..533730e 100644 --- a/src/modals/MediaDbPreviewModal.ts +++ b/src/modals/MediaDbPreviewModal.ts @@ -1,4 +1,3 @@ -import type { ButtonComponent } from 'obsidian'; import { Component, MarkdownRenderer, Modal, Setting } from 'obsidian'; import type MediaDbPlugin from 'src/main'; import type { MediaTypeModel } from 'src/models/MediaTypeModel'; diff --git a/src/modals/MediaDbSearchModal.ts b/src/modals/MediaDbSearchModal.ts index f7f6d8a..c4bb7d6 100644 --- a/src/modals/MediaDbSearchModal.ts +++ b/src/modals/MediaDbSearchModal.ts @@ -1,7 +1,6 @@ import type { ButtonComponent } from 'obsidian'; import { Modal, Notice, Setting, TextComponent, ToggleComponent } from 'obsidian'; import type MediaDbPlugin from '../main'; -import type { MediaTypeModel } from '../models/MediaTypeModel'; import type { MediaType } from '../utils/MediaType'; import { MEDIA_TYPES } from '../utils/MediaTypeManager'; import type { SearchModalData, SearchModalOptions } from '../utils/ModalHelper'; @@ -42,7 +41,7 @@ export class MediaDbSearchModal extends Modal { keyPressCallback(event: KeyboardEvent): void { if (event.key === 'Enter') { - this.search(); + void this.search(); } } @@ -131,7 +130,7 @@ export class MediaDbSearchModal extends Modal { btn.setButtonText('Ok'); btn.setCta(); btn.onClick(() => { - this.search(); + void this.search(); }); btn.buttonEl.addClass('media-db-plugin-button'); this.searchBtn = btn; diff --git a/src/modals/MediaDbSearchResultModal.ts b/src/modals/MediaDbSearchResultModal.ts index b33d886..1f34444 100644 --- a/src/modals/MediaDbSearchResultModal.ts +++ b/src/modals/MediaDbSearchResultModal.ts @@ -1,7 +1,7 @@ import type MediaDbPlugin from '../main'; import type { MediaTypeModel } from '../models/MediaTypeModel'; import type { SelectModalData, SelectModalOptions } from '../utils/ModalHelper'; -import { SELECT_MODAL_OPTIONS_DEFAULT } from '../utils/ModalHelper'; +import { SELECTMODALOPTIONSDEFAULT } from '../utils/ModalHelper'; import { SelectModal } from './SelectModal'; export class MediaDbSearchResultModal extends SelectModal { @@ -13,18 +13,17 @@ export class MediaDbSearchResultModal extends SelectModal { submitCallback?: (res: SelectModalData) => void; closeCallback?: (err?: Error) => void; skipCallback?: () => void; + submitButtonText: string; constructor(plugin: MediaDbPlugin, selectModalOptions: SelectModalOptions) { - selectModalOptions = Object.assign({}, SELECT_MODAL_OPTIONS_DEFAULT, selectModalOptions); + selectModalOptions = Object.assign({}, SELECTMODALOPTIONSDEFAULT, selectModalOptions); super(plugin.app, selectModalOptions.elements ?? [], selectModalOptions.multiSelect); this.plugin = plugin; - this.title = selectModalOptions.modalTitle ?? ''; - this.description = 'Select one or multiple search results.'; + this.description = selectModalOptions.description ?? 'Select one or multiple search results.'; this.addSkipButton = selectModalOptions.skipButton ?? false; - + this.submitButtonText = selectModalOptions.submitButtonText ?? 'Ok'; this.busy = false; - this.sendCallback = false; } diff --git a/src/modals/MediaDbSeasonSelectModal.ts b/src/modals/MediaDbSeasonSelectModal.ts new file mode 100644 index 0000000..ca05d0e --- /dev/null +++ b/src/modals/MediaDbSeasonSelectModal.ts @@ -0,0 +1,50 @@ +import type MediaDbPlugin from '../main'; +import { SelectModal } from './SelectModal'; + +export interface SeasonSelectModalElement { + season_number: number; + name: string; + air_date?: string; + poster_path?: string; +} + +export class MediaDbSeasonSelectModal extends SelectModal { + plugin: MediaDbPlugin; + submitCallback?: (selectedSeasons: SeasonSelectModalElement[]) => void; + closeCallback?: (err?: Error) => void; + seriesName?: string; + + constructor(plugin: MediaDbPlugin, seasons: SeasonSelectModalElement[], multiSelect = true, seriesName?: string) { + super(plugin.app, seasons, multiSelect); + this.plugin = plugin; + this.seriesName = seriesName; + this.title = `Select seasons for${seriesName ? ` ${seriesName}` : ''}`; + this.description = 'Select one or more seasons to create notes for.'; + this.submitButtonText = 'Create Entry'; + } + + renderElement(season: SeasonSelectModalElement, el: HTMLElement): void { + el.createEl('div', { text: `${season.name}` }); + if (season.air_date) { + el.createEl('small', { text: `Air date: ${season.air_date}` }); + } + } + + submit(): void { + const selected = this.selectModalElements.filter(x => x.isActive()).map(x => x.value); + this.submitCallback?.(selected); + this.close(); + } + + skip(): void { + this.close(); + } + + setSubmitCallback(cb: (selectedSeasons: SeasonSelectModalElement[]) => void): void { + this.submitCallback = cb; + } + + setCloseCallback(cb: (err?: Error) => void): void { + this.closeCallback = cb; + } +} diff --git a/src/modals/SelectModal.ts b/src/modals/SelectModal.ts index 596cb15..d54b5f9 100644 --- a/src/modals/SelectModal.ts +++ b/src/modals/SelectModal.ts @@ -12,6 +12,7 @@ export abstract class SelectModal extends Modal { cancelButton?: ButtonComponent; skipButton?: ButtonComponent; submitButton?: ButtonComponent; + submitButtonText: string; elementWrapper?: HTMLDivElement; @@ -25,6 +26,7 @@ export abstract class SelectModal extends Modal { this.title = ''; this.description = ''; this.addSkipButton = false; + this.submitButtonText = 'Ok'; this.cancelButton = undefined; this.skipButton = undefined; this.submitButton = undefined; @@ -54,7 +56,7 @@ export abstract class SelectModal extends Modal { this.scope.register([], 'Enter', () => this.submit()); } - abstract renderElement(value: T, el: HTMLElement): any; + abstract renderElement(value: T, el: HTMLElement): void; abstract submit(): void; @@ -76,7 +78,7 @@ export abstract class SelectModal extends Modal { } } - async onOpen(): Promise { + onOpen(): void { const { contentEl, titleEl } = this; titleEl.createEl('h2', { text: this.title }); @@ -115,7 +117,7 @@ export abstract class SelectModal extends Modal { }); } bottomSettingRow.addButton(btn => { - btn.setButtonText('Ok'); + btn.setButtonText(this.submitButtonText); btn.setCta(); btn.onClick(() => this.submit()); btn.buttonEl.addClass('media-db-plugin-button'); diff --git a/src/models/BoardGameModel.ts b/src/models/BoardGameModel.ts index 57fdaa9..e782137 100644 --- a/src/models/BoardGameModel.ts +++ b/src/models/BoardGameModel.ts @@ -43,7 +43,7 @@ export class BoardGameModel extends MediaTypeModel { migrateObject(this, obj, this); - if (!obj.hasOwnProperty('userData')) { + if (!Object.hasOwn(obj, 'userData')) { migrateObject(this.userData, obj, this.userData); } diff --git a/src/models/BookModel.ts b/src/models/BookModel.ts index 3f9149f..e75da93 100644 --- a/src/models/BookModel.ts +++ b/src/models/BookModel.ts @@ -43,7 +43,7 @@ export class BookModel extends MediaTypeModel { migrateObject(this, obj, this); - if (!obj.hasOwnProperty('userData')) { + if (!Object.hasOwn(obj, 'userData')) { migrateObject(this.userData, obj, this.userData); } diff --git a/src/models/ComicMangaModel.ts b/src/models/ComicMangaModel.ts index 5677d72..46f1deb 100644 --- a/src/models/ComicMangaModel.ts +++ b/src/models/ComicMangaModel.ts @@ -53,7 +53,7 @@ export class ComicMangaModel extends MediaTypeModel { migrateObject(this, obj, this); - if (!obj.hasOwnProperty('userData')) { + if (!Object.hasOwn(obj, 'userData')) { migrateObject(this.userData, obj, this.userData); } diff --git a/src/models/GameModel.ts b/src/models/GameModel.ts index 35fb3b1..5661f6e 100644 --- a/src/models/GameModel.ts +++ b/src/models/GameModel.ts @@ -39,7 +39,7 @@ export class GameModel extends MediaTypeModel { migrateObject(this, obj, this); - if (!obj.hasOwnProperty('userData')) { + if (!Object.hasOwn(obj, 'userData')) { migrateObject(this.userData, obj, this.userData); } diff --git a/src/models/MediaTypeModel.ts b/src/models/MediaTypeModel.ts index 51c6378..e4d03a0 100644 --- a/src/models/MediaTypeModel.ts +++ b/src/models/MediaTypeModel.ts @@ -9,6 +9,7 @@ export abstract class MediaTypeModel { dataSource: string; url: string; id: string; + image?: string; userData: object; @@ -21,6 +22,8 @@ export abstract class MediaTypeModel { this.dataSource = ''; this.url = ''; this.id = ''; + this.image = ''; + this.userData = {}; } diff --git a/src/models/MovieModel.ts b/src/models/MovieModel.ts index bbf7cb5..c91c2d4 100644 --- a/src/models/MovieModel.ts +++ b/src/models/MovieModel.ts @@ -17,6 +17,9 @@ export class MovieModel extends MediaTypeModel { image: string; released: boolean; + country: string[]; + boxOffice: string; + ageRating: string; streamingServices: string[]; premiere: string; @@ -40,6 +43,9 @@ export class MovieModel extends MediaTypeModel { this.image = ''; this.released = false; + this.country = []; + this.boxOffice = ''; + this.ageRating = ''; this.streamingServices = []; this.premiere = ''; @@ -51,7 +57,7 @@ export class MovieModel extends MediaTypeModel { migrateObject(this, obj, this); - if (!obj.hasOwnProperty('userData')) { + if (!Object.hasOwn(obj, 'userData')) { migrateObject(this.userData, obj, this.userData); } diff --git a/src/models/MusicReleaseModel.ts b/src/models/MusicReleaseModel.ts index 24f6816..38427a9 100644 --- a/src/models/MusicReleaseModel.ts +++ b/src/models/MusicReleaseModel.ts @@ -8,8 +8,18 @@ export type MusicReleaseData = ModelToData; export class MusicReleaseModel extends MediaTypeModel { genres: string[]; artists: string[]; + language: string; image: string; rating: number; + releaseDate: string; + albumDuration: string; + trackCount: number; + tracks: { + number: number; + title: string; + duration: string; + featuredArtists: string[]; + }[]; userData: { personalRating: number; @@ -22,17 +32,23 @@ export class MusicReleaseModel extends MediaTypeModel { this.artists = []; this.image = ''; this.rating = 0; + this.releaseDate = ''; + this.userData = { personalRating: 0, }; migrateObject(this, obj, this); - if (!obj.hasOwnProperty('userData')) { + if (!Object.hasOwn(obj, 'userData')) { migrateObject(this.userData, obj, this.userData); } this.type = this.getMediaType(); + this.albumDuration = obj.albumDuration ?? '0:00'; + this.trackCount = obj.trackCount ?? 0; + this.tracks = obj.tracks ?? []; + this.language = obj.language ?? ''; } getTags(): string[] { diff --git a/src/models/SeasonModel.ts b/src/models/SeasonModel.ts new file mode 100644 index 0000000..07f9626 --- /dev/null +++ b/src/models/SeasonModel.ts @@ -0,0 +1,80 @@ +import { MediaType } from '../utils/MediaType'; +import type { ModelToData } from '../utils/Utils'; +import { mediaDbTag, migrateObject } from '../utils/Utils'; +import { MediaTypeModel } from './MediaTypeModel'; + +export type SeasonData = ModelToData; + +export class SeasonModel extends MediaTypeModel { + seasonNumber: number; + seasonTitle: string; + episodes: number; + + plot: string; + genres: string[]; + writer: string[]; + studio: string[]; + duration: string; + onlineRating: number; + actors: string[]; + image: string; + + released: boolean; + streamingServices: string[]; + airing: boolean; + airedFrom: string; + airedTo: string; + + userData: { + watched: boolean; + lastWatched: string; + personalRating: number; + }; + + constructor(obj: SeasonData) { + super(); + this.seasonTitle = ''; + this.seasonNumber = 0; + this.episodes = 0; + this.plot = ''; + this.genres = []; + this.writer = []; + this.studio = []; + this.duration = ''; + this.onlineRating = 0; + this.actors = []; + this.image = ''; + + this.released = false; + this.streamingServices = []; + this.airing = false; + this.airedFrom = ''; + this.airedTo = ''; + + this.userData = { + watched: false, + lastWatched: '', + personalRating: 0, + }; + + migrateObject(this, obj, this); + + if (!obj.hasOwnProperty('userData')) { + migrateObject(this.userData, obj, this.userData); + } + + this.type = this.getMediaType(); + } + + getTags(): string[] { + return [mediaDbTag, 'tv', 'season']; + } + + getMediaType(): MediaType { + return MediaType.Season; + } + + getSummary(): string { + return this.seasonNumber + ' seasons'; + } +} diff --git a/src/models/SeriesModel.ts b/src/models/SeriesModel.ts index c13d90d..4489629 100644 --- a/src/models/SeriesModel.ts +++ b/src/models/SeriesModel.ts @@ -17,6 +17,8 @@ export class SeriesModel extends MediaTypeModel { image: string; released: boolean; + country: string[]; + ageRating: string; streamingServices: string[]; airing: boolean; airedFrom: string; @@ -42,6 +44,8 @@ export class SeriesModel extends MediaTypeModel { this.image = ''; this.released = false; + this.country = []; + this.ageRating = ''; this.streamingServices = []; this.airing = false; this.airedFrom = ''; @@ -55,7 +59,7 @@ export class SeriesModel extends MediaTypeModel { migrateObject(this, obj, this); - if (!obj.hasOwnProperty('userData')) { + if (!Object.hasOwn(obj, 'userData')) { migrateObject(this.userData, obj, this.userData); } diff --git a/src/models/WikiModel.ts b/src/models/WikiModel.ts index a192ff6..ee49c2d 100644 --- a/src/models/WikiModel.ts +++ b/src/models/WikiModel.ts @@ -24,7 +24,7 @@ export class WikiModel extends MediaTypeModel { migrateObject(this, obj, this); - if (!obj.hasOwnProperty('userData')) { + if (!Object.hasOwn(obj, 'userData')) { migrateObject(this.userData, obj, this.userData); } diff --git a/src/settings/PropertyMapper.ts b/src/settings/PropertyMapper.ts index e3be2c5..9ca5e0c 100644 --- a/src/settings/PropertyMapper.ts +++ b/src/settings/PropertyMapper.ts @@ -1,3 +1,4 @@ +import type { MediaType } from 'src/utils/MediaType'; import type MediaDbPlugin from '../main'; import { MEDIA_TYPES } from '../utils/MediaTypeManager'; import { PropertyMappingOption } from './PropertyMapping'; @@ -16,7 +17,7 @@ export class PropertyMapper { * @param obj */ convertObject(obj: Record): Record { - if (!obj.hasOwnProperty('type')) { + if (!Object.hasOwn(obj, 'type')) { return obj; } @@ -34,14 +35,23 @@ export class PropertyMapper { for (const [key, value] of Object.entries(obj)) { for (const propertyMapping of propertyMappings) { if (propertyMapping.property === key) { + let finalValue = value; + if (propertyMapping.wikilink) { + if (typeof value === 'string') { + finalValue = `[[${value}]]`; + } else if (Array.isArray(value)) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + finalValue = value.map(v => (typeof v === 'string' ? `[[${v}]]` : v)); + } + } if (propertyMapping.mapping === PropertyMappingOption.Map) { // @ts-ignore - newObj[propertyMapping.newProperty] = value; + newObj[propertyMapping.newProperty] = finalValue; } else if (propertyMapping.mapping === PropertyMappingOption.Remove) { // do nothing } else if (propertyMapping.mapping === PropertyMappingOption.Default) { // @ts-ignore - newObj[key] = value; + newObj[key] = finalValue; } break; } @@ -58,7 +68,7 @@ export class PropertyMapper { * @param obj */ convertObjectBack(obj: Record): Record { - if (!obj.hasOwnProperty('type')) { + if (!Object.hasOwn(obj, 'type')) { return obj; } @@ -66,7 +76,7 @@ export class PropertyMapper { obj.type = 'comicManga'; console.debug(`MDB | updated metadata type`, obj.type); } - if (MEDIA_TYPES.contains(obj.type as any)) { + if (MEDIA_TYPES.contains(obj.type as MediaType)) { return obj; } diff --git a/src/settings/PropertyMapping.ts b/src/settings/PropertyMapping.ts index bad0369..730b579 100644 --- a/src/settings/PropertyMapping.ts +++ b/src/settings/PropertyMapping.ts @@ -75,7 +75,7 @@ export class PropertyMappingModel { copy(): PropertyMappingModel { const copy = new PropertyMappingModel(this.type); for (const property of this.properties) { - const propertyCopy = new PropertyMapping(property.property, property.newProperty, property.mapping, property.locked); + const propertyCopy = new PropertyMapping(property.property, property.newProperty, property.mapping, property.locked, property.wikilink); copy.properties.push(propertyCopy); } return copy; @@ -87,12 +87,14 @@ export class PropertyMapping { newProperty: string; locked: boolean; mapping: PropertyMappingOption; + wikilink: boolean; - constructor(property: string, newProperty: string, mapping: PropertyMappingOption, locked?: boolean) { + constructor(property: string, newProperty: string, mapping: PropertyMappingOption, locked?: boolean, wikilink?: boolean) { this.property = property; this.newProperty = newProperty; this.mapping = mapping; this.locked = locked ?? false; + this.wikilink = wikilink ?? false; } validate(): { res: boolean; err?: Error } { diff --git a/src/settings/PropertyMappingModelComponent.svelte b/src/settings/PropertyMappingModelComponent.svelte index 0018d75..0fcb95f 100644 --- a/src/settings/PropertyMappingModelComponent.svelte +++ b/src/settings/PropertyMappingModelComponent.svelte @@ -1,6 +1,4 @@
{capitalizeFirstLetter(model.type)}
-
- {#each model.properties as property} -
-
-
{property.property}
-
- {#if property.locked} -
property cannot be remapped
- {:else} - - {#if property.mapping === PropertyMappingOption.Map} - -
- -
+ + + + + + + + + + + {#each model.properties as property} + + + + {#if property.locked} + + {:else} + + + + + {/if} - {/if} - - {/each} - + + {/each} + +
PropertyMappingNew nameWikilink
+ {property.property} + +
property cannot be remapped
+
+ + + {#if property.mapping === PropertyMappingOption.Map} +
+ + +
+ {:else} + + {/if} +
+ {#if !validationResult?.res}
{validationResult?.err?.message}
{/if} +
diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index f880a35..09d6f3b 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -1,10 +1,11 @@ import type { App } from 'obsidian'; import { Notice, PluginSettingTab, Setting } from 'obsidian'; +import type { MediaType } from 'src/utils/MediaType'; import { mount } from 'svelte'; import type MediaDbPlugin from '../main'; import type { MediaTypeModel } from '../models/MediaTypeModel'; import { MEDIA_TYPES } from '../utils/MediaTypeManager'; -import { fragWithHTML } from '../utils/Utils'; +import { fragWithHTML, unCamelCase } from '../utils/Utils'; import { PropertyMapping, PropertyMappingModel, PropertyMappingOption } from './PropertyMapping'; import PropertyMappingModelsComponent from './PropertyMappingModelsComponent.svelte'; import { FileSuggest } from './suggesters/FileSuggest'; @@ -12,35 +13,34 @@ import { FolderSuggest } from './suggesters/FolderSuggest'; export interface MediaDbPluginSettings { OMDbKey: string; + TMDBKey: string; MobyGamesKey: string; GiantBombKey: string; ComicVineKey: string; + BoardgameGeekKey: string; sfwFilter: boolean; templates: boolean; customDateFormat: string; openNoteInNewTab: boolean; useDefaultFrontMatter: boolean; enableTemplaterIntegration: boolean; - // TODO: disabled for now, as i currently don't have the time to fix this from the original PR that introduced it (#133) - // apiToggle: { - // OMDbAPI: { - // movie: boolean; - // series: boolean; - // game: boolean; - // }; - // MALAPI: { - // movie: boolean; - // series: boolean; - // }; - // SteamAPI: { - // game: boolean; - // }; - // MobyGamesAPI: { - // game: boolean; - // }; - // }; + OMDbAPI_disabledMediaTypes: MediaType[]; + TMDBSeriesAPI_disabledMediaTypes: MediaType[]; + TMDBSeasonAPI_disabledMediaTypes: MediaType[]; + TMDBMovieAPI_disabledMediaTypes: MediaType[]; + MALAPI_disabledMediaTypes: MediaType[]; + MALAPIManga_disabledMediaTypes: MediaType[]; + ComicVineAPI_disabledMediaTypes: MediaType[]; + SteamAPI_disabledMediaTypes: MediaType[]; + MobyGamesAPI_disabledMediaTypes: MediaType[]; + GiantBombAPI_disabledMediaTypes: MediaType[]; + WikipediaAPI_disabledMediaTypes: MediaType[]; + BoardgameGeekAPI_disabledMediaTypes: MediaType[]; + MusicBrainzAPI_disabledMediaTypes: MediaType[]; + OpenLibraryAPI_disabledMediaTypes: MediaType[]; movieTemplate: string; seriesTemplate: string; + seasonTemplate: string; mangaTemplate: string; gameTemplate: string; wikiTemplate: string; @@ -50,6 +50,7 @@ export interface MediaDbPluginSettings { movieFileNameTemplate: string; seriesFileNameTemplate: string; + seasonFileNameTemplate: string; mangaFileNameTemplate: string; gameFileNameTemplate: string; wikiFileNameTemplate: string; @@ -59,6 +60,7 @@ export interface MediaDbPluginSettings { moviePropertyConversionRules: string; seriesPropertyConversionRules: string; + seasonPropertyConversionRules: string; mangaPropertyConversionRules: string; gamePropertyConversionRules: string; wikiPropertyConversionRules: string; @@ -68,6 +70,7 @@ export interface MediaDbPluginSettings { movieFolder: string; seriesFolder: string; + seasonFolder: string; mangaFolder: string; gameFolder: string; wikiFolder: string; @@ -75,39 +78,41 @@ export interface MediaDbPluginSettings { boardgameFolder: string; bookFolder: string; + imageDownload: boolean; + imageFolder: string; propertyMappingModels: PropertyMappingModel[]; } const DEFAULT_SETTINGS: MediaDbPluginSettings = { OMDbKey: '', + TMDBKey: '', MobyGamesKey: '', GiantBombKey: '', ComicVineKey: '', + BoardgameGeekKey: '', sfwFilter: true, templates: true, customDateFormat: 'L', openNoteInNewTab: true, useDefaultFrontMatter: true, enableTemplaterIntegration: false, - // apiToggle: { - // OMDbAPI: { - // movie: true, - // series: true, - // game: true, - // }, - // MALAPI: { - // movie: true, - // series: true, - // }, - // SteamAPI: { - // game: true, - // }, - // MobyGamesAPI: { - // game: true, - // }, - // }, + OMDbAPI_disabledMediaTypes: [], + TMDBSeriesAPI_disabledMediaTypes: [], + TMDBSeasonAPI_disabledMediaTypes: [], + TMDBMovieAPI_disabledMediaTypes: [], + MALAPI_disabledMediaTypes: [], + MALAPIManga_disabledMediaTypes: [], + ComicVineAPI_disabledMediaTypes: [], + SteamAPI_disabledMediaTypes: [], + MobyGamesAPI_disabledMediaTypes: [], + GiantBombAPI_disabledMediaTypes: [], + WikipediaAPI_disabledMediaTypes: [], + BoardgameGeekAPI_disabledMediaTypes: [], + MusicBrainzAPI_disabledMediaTypes: [], + OpenLibraryAPI_disabledMediaTypes: [], movieTemplate: '', seriesTemplate: '', + seasonTemplate: '', mangaTemplate: '', gameTemplate: '', wikiTemplate: '', @@ -117,6 +122,7 @@ const DEFAULT_SETTINGS: MediaDbPluginSettings = { movieFileNameTemplate: '{{ title }} ({{ year }})', seriesFileNameTemplate: '{{ title }} ({{ year }})', + seasonFileNameTemplate: '{{ title }} ({{ year }})', mangaFileNameTemplate: '{{ title }} ({{ year }})', gameFileNameTemplate: '{{ title }} ({{ year }})', wikiFileNameTemplate: '{{ title }}', @@ -126,6 +132,7 @@ const DEFAULT_SETTINGS: MediaDbPluginSettings = { moviePropertyConversionRules: '', seriesPropertyConversionRules: '', + seasonPropertyConversionRules: '', mangaPropertyConversionRules: '', gamePropertyConversionRules: '', wikiPropertyConversionRules: '', @@ -135,6 +142,7 @@ const DEFAULT_SETTINGS: MediaDbPluginSettings = { movieFolder: 'Media DB/movies', seriesFolder: 'Media DB/series', + seasonFolder: 'Media DB/series', mangaFolder: 'Media DB/comics', gameFolder: 'Media DB/games', wikiFolder: 'Media DB/wiki', @@ -142,6 +150,8 @@ const DEFAULT_SETTINGS: MediaDbPluginSettings = { boardgameFolder: 'Media DB/boardgames', bookFolder: 'Media DB/books', + imageDownload: false, + imageFolder: 'Media DB/images', propertyMappingModels: [], }; @@ -161,16 +171,54 @@ export function getDefaultSettings(plugin: MediaDbPlugin): MediaDbPluginSettings const propertyMappingModel: PropertyMappingModel = new PropertyMappingModel(mediaType); for (const key of Object.keys(metadataObj)) { - propertyMappingModel.properties.push(new PropertyMapping(key, '', PropertyMappingOption.Default, lockedPropertyMappings.contains(key))); + propertyMappingModel.properties.push( + new PropertyMapping( + key, + '', + PropertyMappingOption.Default, + lockedPropertyMappings.contains(key), + false, // wikilink default + ), + ); } propertyMappingModels.push(propertyMappingModel); } + // MIGRATION: Ensure all property mappings have wikilink defined (for settings loaded from disk) + if (defaultSettings.propertyMappingModels && Array.isArray(defaultSettings.propertyMappingModels)) { + for (const model of defaultSettings.propertyMappingModels) { + if (model.properties && Array.isArray(model.properties)) { + for (const prop of model.properties) { + if (typeof prop.wikilink === 'undefined') { + prop.wikilink = false; + } + } + } + } + } + defaultSettings.propertyMappingModels = propertyMappingModels; return defaultSettings; } +/** + * Ensures all property mappings in loaded settings have the wikilink property defined. + */ +export function ensureWikilinkOnPropertyMappings(settings: MediaDbPluginSettings): void { + if (settings.propertyMappingModels && Array.isArray(settings.propertyMappingModels)) { + for (const model of settings.propertyMappingModels) { + if (model.properties && Array.isArray(model.properties)) { + for (const prop of model.properties) { + if (typeof prop.wikilink === 'undefined') { + prop.wikilink = false; + } + } + } + } + } +} + export class MediaDbSettingTab extends PluginSettingTab { plugin: MediaDbPlugin; @@ -195,6 +243,17 @@ export class MediaDbSettingTab extends PluginSettingTab { void this.plugin.saveSettings(); }); }); + new Setting(containerEl) + .setName('TMDB API key') + .setDesc('API key for "https://www.themoviedb.org".') + .addText(cb => { + cb.setPlaceholder('API key') + .setValue(this.plugin.settings.TMDBKey) + .onChange(data => { + this.plugin.settings.TMDBKey = data; + void this.plugin.saveSettings(); + }); + }); new Setting(containerEl) .setName('Moby Games key') @@ -230,6 +289,17 @@ export class MediaDbSettingTab extends PluginSettingTab { void this.plugin.saveSettings(); }); }); + new Setting(containerEl) + .setName('Boardgame Geek Key') + .setDesc('API key for "www.boardgamegeek.com".') + .addText(cb => { + cb.setPlaceholder('API key') + .setValue(this.plugin.settings.BoardgameGeekKey) + .onChange(data => { + this.plugin.settings.BoardgameGeekKey = data; + void this.plugin.saveSettings(); + }); + }); new Setting(containerEl) .setName('SFW filter') @@ -310,89 +380,91 @@ export class MediaDbSettingTab extends PluginSettingTab { }); }); - // containerEl.createEl('h3', { text: 'APIs per media type' }); - // containerEl.createEl('h5', { text: 'Movies' }); - // new Setting(containerEl) - // .setName('OMDb API') - // .setDesc('Use OMDb API for movies.') - // .addToggle(cb => { - // cb.setValue(this.plugin.settings.apiToggle.OMDbAPI.movie).onChange(data => { - // this.plugin.settings.apiToggle.OMDbAPI.movie = data; - // void this.plugin.saveSettings(); - // }); - // }); - // new Setting(containerEl) - // .setName('MAL API') - // .setDesc('Use MAL API for movies.') - // .addToggle(cb => { - // cb.setValue(this.plugin.settings.apiToggle.MALAPI.movie).onChange(data => { - // this.plugin.settings.apiToggle.MALAPI.movie = data; - // void this.plugin.saveSettings(); - // }); - // }); - // containerEl.createEl('h5', { text: 'Series' }); - // new Setting(containerEl) - // .setName('OMDb API') - // .setDesc('Use OMDb API for series.') - // .addToggle(cb => { - // cb.setValue(this.plugin.settings.apiToggle.OMDbAPI.series).onChange(data => { - // this.plugin.settings.apiToggle.OMDbAPI.series = data; - // void this.plugin.saveSettings(); - // }); - // }); - // new Setting(containerEl) - // .setName('MAL API') - // .setDesc('Use MAL API for series.') - // .addToggle(cb => { - // cb.setValue(this.plugin.settings.apiToggle.MALAPI.series).onChange(data => { - // this.plugin.settings.apiToggle.MALAPI.series = data; - // void this.plugin.saveSettings(); - // }); - // }); - // containerEl.createEl('h5', { text: 'Games' }); - // new Setting(containerEl) - // .setName('OMDb API') - // .setDesc('Use OMDb API for games.') - // .addToggle(cb => { - // cb.setValue(this.plugin.settings.apiToggle.OMDbAPI.game).onChange(data => { - // this.plugin.settings.apiToggle.OMDbAPI.game = data; - // void this.plugin.saveSettings(); - // }); - // }); - // new Setting(containerEl) - // .setName('Steam API') - // .setDesc('Use OMDb API for games.') - // .addToggle(cb => { - // cb.setValue(this.plugin.settings.apiToggle.SteamAPI.game).onChange(data => { - // this.plugin.settings.apiToggle.SteamAPI.game = data; - // void this.plugin.saveSettings(); - // }); - // }); - // new Setting(containerEl) - // .setName('MobyGames API') - // .setDesc('Use MobyGames API for games.') - // .addToggle(cb => { - // cb.setValue(this.plugin.settings.apiToggle.MobyGamesAPI.game).onChange(data => { - // this.plugin.settings.apiToggle.MobyGamesAPI.game = data; - // void this.plugin.saveSettings(); - // }); - // }); - // new Setting(containerEl) - // .setName('Giantbomb API') - // .setDesc('Use Giantbomb API for games.') - // .addToggle(cb => { - // cb.setValue(this.plugin.settings.apiToggle.GiantBombAPI.game).onChange(data => { - // this.plugin.settings.apiToggle.GiantBombAPI.game = data; - // void this.plugin.saveSettings(); - // }); - // }); + new Setting(containerEl) + .setName('Download images') + .setDesc('Downloads images for new notes in the folder below') + .addToggle(cb => { + cb.setValue(this.plugin.settings.imageDownload).onChange(data => { + this.plugin.settings.imageDownload = data; + void this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('Image folder') + .setDesc('Where downloaded images should be stored.') + .addSearch(cb => { + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.imageFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); + cb.setPlaceholder(DEFAULT_SETTINGS.imageFolder) + .setValue(this.plugin.settings.imageFolder) + .onChange(data => { + this.plugin.settings.imageFolder = data; + void this.plugin.saveSettings(); + }); + }); + + // Create a map to store APIs for each media type + const mediaTypeApiMap = new Map(); + + // Populate the map with APIs for each media type dynamically + for (const api of this.plugin.apiManager.apis) { + for (const mediaType of api.types) { + if (!mediaTypeApiMap.has(mediaType)) { + mediaTypeApiMap.set(mediaType, []); + } + mediaTypeApiMap.get(mediaType)!.push(api.apiName); + } + } + + // Filter out media types with only one API + const filteredMediaTypes = Array.from(mediaTypeApiMap.entries()).filter(([_, apis]) => apis.length > 1); + + // Dynamically create settings based on the filtered media types and their APIs + for (const [mediaType, apis] of filteredMediaTypes) { + new Setting(containerEl).setName(`Select APIs for ${unCamelCase(mediaType)}`).setHeading(); + for (const apiName of apis) { + const api = this.plugin.apiManager.apis.find(api => api.apiName === apiName); + if (api) { + const disabledMediaTypes = api.getDisabledMediaTypes(); + new Setting(containerEl) + .setName(apiName) + .setDesc(`Use ${apiName} API for ${unCamelCase(mediaType)}.`) + .addToggle(cb => { + cb.setValue(!disabledMediaTypes.includes(mediaType)).onChange(data => { + if (data) { + const index = disabledMediaTypes.indexOf(mediaType); + if (index > -1) { + disabledMediaTypes.splice(index, 1); + } + } else { + disabledMediaTypes.push(mediaType); + } + void this.plugin.saveSettings(); + }); + }); + } + } + } + new Setting(containerEl).setName('New file location').setHeading(); // region new file location new Setting(containerEl) .setName('Movie folder') .setDesc('Where newly imported movies should be placed.') .addSearch(cb => { - new FolderSuggest(this.app, cb.inputEl); + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.movieFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder(DEFAULT_SETTINGS.movieFolder) .setValue(this.plugin.settings.movieFolder) .onChange(data => { @@ -405,7 +477,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Series folder') .setDesc('Where newly imported series should be placed.') .addSearch(cb => { - new FolderSuggest(this.app, cb.inputEl); + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.seriesFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder(DEFAULT_SETTINGS.seriesFolder) .setValue(this.plugin.settings.seriesFolder) .onChange(data => { @@ -414,11 +492,30 @@ export class MediaDbSettingTab extends PluginSettingTab { }); }); + new Setting(containerEl) + .setName('Season folder') + .setDesc('Where newly imported seasons should be placed.') + .addSearch(cb => { + new FolderSuggest(this.app, cb.inputEl); + cb.setPlaceholder(DEFAULT_SETTINGS.seasonFolder) + .setValue(this.plugin.settings.seriesFolder) + .onChange(data => { + this.plugin.settings.seasonFolder = data; + void this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) .setName('Comic and manga folder') .setDesc('Where newly imported comics and manga should be placed.') .addSearch(cb => { - new FolderSuggest(this.app, cb.inputEl); + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.mangaFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder(DEFAULT_SETTINGS.mangaFolder) .setValue(this.plugin.settings.mangaFolder) .onChange(data => { @@ -431,7 +528,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Game folder') .setDesc('Where newly imported games should be placed.') .addSearch(cb => { - new FolderSuggest(this.app, cb.inputEl); + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.gameFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder(DEFAULT_SETTINGS.gameFolder) .setValue(this.plugin.settings.gameFolder) .onChange(data => { @@ -444,7 +547,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Wiki folder') .setDesc('Where newly imported wiki articles should be placed.') .addSearch(cb => { - new FolderSuggest(this.app, cb.inputEl); + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.wikiFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder(DEFAULT_SETTINGS.wikiFolder) .setValue(this.plugin.settings.wikiFolder) .onChange(data => { @@ -457,7 +566,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Music folder') .setDesc('Where newly imported music should be placed.') .addSearch(cb => { - new FolderSuggest(this.app, cb.inputEl); + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.musicReleaseFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder(DEFAULT_SETTINGS.musicReleaseFolder) .setValue(this.plugin.settings.musicReleaseFolder) .onChange(data => { @@ -470,7 +585,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Board game folder') .setDesc('Where newly imported board games should be places.') .addSearch(cb => { - new FolderSuggest(this.app, cb.inputEl); + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.boardgameFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder(DEFAULT_SETTINGS.boardgameFolder) .setValue(this.plugin.settings.boardgameFolder) .onChange(data => { @@ -482,7 +603,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Book folder') .setDesc('Where newly imported books should be placed.') .addSearch(cb => { - new FolderSuggest(this.app, cb.inputEl); + const suggester = new FolderSuggest(this.app, cb.inputEl); + suggester.onSelect(folder => { + cb.setValue(folder.path); + this.plugin.settings.bookFolder = folder.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder(DEFAULT_SETTINGS.bookFolder) .setValue(this.plugin.settings.bookFolder) .onChange(data => { @@ -499,7 +626,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Movie template') .setDesc('Template file to be used when creating a new note for a movie.') .addSearch(cb => { - new FileSuggest(this.app, cb.inputEl); + const suggester = new FileSuggest(this.app, cb.inputEl); + suggester.onSelect(file => { + cb.setValue(file.path); + this.plugin.settings.movieTemplate = file.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder('Example: movieTemplate.md') .setValue(this.plugin.settings.movieTemplate) .onChange(data => { @@ -512,7 +645,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Series template') .setDesc('Template file to be used when creating a new note for a series.') .addSearch(cb => { - new FileSuggest(this.app, cb.inputEl); + const suggester = new FileSuggest(this.app, cb.inputEl); + suggester.onSelect(file => { + cb.setValue(file.path); + this.plugin.settings.seriesTemplate = file.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder('Example: seriesTemplate.md') .setValue(this.plugin.settings.seriesTemplate) .onChange(data => { @@ -521,11 +660,30 @@ export class MediaDbSettingTab extends PluginSettingTab { }); }); + new Setting(containerEl) + .setName('Season template') + .setDesc('Template file to be used when creating a new note for a season.') + .addSearch(cb => { + new FileSuggest(this.app, cb.inputEl); + cb.setPlaceholder('Example: seasonTemplate.md') + .setValue(this.plugin.settings.seasonTemplate) + .onChange(data => { + this.plugin.settings.seasonTemplate = data; + void this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) .setName('Manga and Comics template') .setDesc('Template file to be used when creating a new note for a manga or a comic.') .addSearch(cb => { - new FileSuggest(this.app, cb.inputEl); + const suggester = new FileSuggest(this.app, cb.inputEl); + suggester.onSelect(file => { + cb.setValue(file.path); + this.plugin.settings.mangaTemplate = file.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder('Example: mangaTemplate.md') .setValue(this.plugin.settings.mangaTemplate) .onChange(data => { @@ -538,7 +696,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Game template') .setDesc('Template file to be used when creating a new note for a game.') .addSearch(cb => { - new FileSuggest(this.app, cb.inputEl); + const suggester = new FileSuggest(this.app, cb.inputEl); + suggester.onSelect(file => { + cb.setValue(file.path); + this.plugin.settings.gameTemplate = file.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder('Example: gameTemplate.md') .setValue(this.plugin.settings.gameTemplate) .onChange(data => { @@ -551,7 +715,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Wiki template') .setDesc('Template file to be used when creating a new note for a wiki entry.') .addSearch(cb => { - new FileSuggest(this.app, cb.inputEl); + const suggester = new FileSuggest(this.app, cb.inputEl); + suggester.onSelect(file => { + cb.setValue(file.path); + this.plugin.settings.wikiTemplate = file.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder('Example: wikiTemplate.md') .setValue(this.plugin.settings.wikiTemplate) .onChange(data => { @@ -564,7 +734,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Music release template') .setDesc('Template file to be used when creating a new note for a music release.') .addSearch(cb => { - new FileSuggest(this.app, cb.inputEl); + const suggester = new FileSuggest(this.app, cb.inputEl); + suggester.onSelect(file => { + cb.setValue(file.path); + this.plugin.settings.musicReleaseTemplate = file.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder('Example: musicReleaseTemplate.md') .setValue(this.plugin.settings.musicReleaseTemplate) .onChange(data => { @@ -577,7 +753,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Board game template') .setDesc('Template file to be used when creating a new note for a boardgame.') .addSearch(cb => { - new FileSuggest(this.app, cb.inputEl); + const suggester = new FileSuggest(this.app, cb.inputEl); + suggester.onSelect(file => { + cb.setValue(file.path); + this.plugin.settings.boardgameTemplate = file.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder('Example: boardgameTemplate.md') .setValue(this.plugin.settings.boardgameTemplate) .onChange(data => { @@ -590,7 +772,13 @@ export class MediaDbSettingTab extends PluginSettingTab { .setName('Book template') .setDesc('Template file to be used when creating a new note for a book.') .addSearch(cb => { - new FileSuggest(this.app, cb.inputEl); + const suggester = new FileSuggest(this.app, cb.inputEl); + suggester.onSelect(file => { + cb.setValue(file.path); + this.plugin.settings.bookTemplate = file.path; + void this.plugin.saveSettings(); + suggester.close(); + }); cb.setPlaceholder('Example: bookTemplate.md') .setValue(this.plugin.settings.bookTemplate) .onChange(data => { @@ -627,6 +815,18 @@ export class MediaDbSettingTab extends PluginSettingTab { }); }); + new Setting(containerEl) + .setName('Season file name template') + .setDesc('Template for the file name used when creating a new note for a season.') + .addText(cb => { + cb.setPlaceholder(`Example: ${DEFAULT_SETTINGS.seasonFileNameTemplate}`) + .setValue(this.plugin.settings.seasonFileNameTemplate) + .onChange(data => { + this.plugin.settings.seasonFileNameTemplate = data; + void this.plugin.saveSettings(); + }); + }); + new Setting(containerEl) .setName('Manga and comic file name template') .setDesc('Template for the file name used when creating a new note for a manga or comic.') diff --git a/src/settings/suggesters/FileSuggest.ts b/src/settings/suggesters/FileSuggest.ts index ca2e293..6bbdb96 100644 --- a/src/settings/suggesters/FileSuggest.ts +++ b/src/settings/suggesters/FileSuggest.ts @@ -1,29 +1,17 @@ -import type { TAbstractFile } from 'obsidian'; -import { TFile } from 'obsidian'; -import { TextInputSuggest } from './Suggest'; +import { AbstractInputSuggest, TFile } from 'obsidian'; -export class FileSuggest extends TextInputSuggest { - getSuggestions(inputStr: string): TFile[] { - const abstractFiles = this.app.vault.getAllLoadedFiles(); - const files: TFile[] = []; - const lowerCaseInputStr = inputStr.toLowerCase(); +export class FileSuggest extends AbstractInputSuggest { + protected getSuggestions(query: string): TFile[] | Promise { + const lowerCaseInputStr = query.toLowerCase(); - abstractFiles.forEach((file: TAbstractFile) => { - if (file instanceof TFile && file.name.toLowerCase().contains(lowerCaseInputStr)) { - files.push(file); - } - }); - - return files; + // we do two filters because otherwise TS type inference does convert the array to TFile[] + return this.app.vault + .getAllLoadedFiles() + .filter(file => file instanceof TFile) + .filter(file => file.path.toLowerCase().contains(lowerCaseInputStr)); } - renderSuggestion(file: TFile, el: HTMLElement): void { - el.setText(file.path); - } - - selectSuggestion(file: TFile): void { - this.inputEl.value = file.path; - this.inputEl.trigger('input'); - this.close(); + renderSuggestion(value: TFile, el: HTMLElement): void { + el.setText(value.path); } } diff --git a/src/settings/suggesters/FolderSuggest.ts b/src/settings/suggesters/FolderSuggest.ts index a758a8b..eaee715 100644 --- a/src/settings/suggesters/FolderSuggest.ts +++ b/src/settings/suggesters/FolderSuggest.ts @@ -1,31 +1,17 @@ -// Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes +import { AbstractInputSuggest, TFolder } from 'obsidian'; -import type { TAbstractFile } from 'obsidian'; -import { TFolder } from 'obsidian'; -import { TextInputSuggest } from './Suggest'; +export class FolderSuggest extends AbstractInputSuggest { + protected getSuggestions(query: string): TFolder[] | Promise { + const lowerCaseInputStr = query.toLowerCase(); -export class FolderSuggest extends TextInputSuggest { - getSuggestions(inputStr: string): TFolder[] { - const abstractFiles = this.app.vault.getAllLoadedFiles(); - const folders: TFolder[] = []; - const lowerCaseInputStr = inputStr.toLowerCase(); - - abstractFiles.forEach((folder: TAbstractFile) => { - if (folder instanceof TFolder && folder.path.toLowerCase().contains(lowerCaseInputStr)) { - folders.push(folder); - } - }); - - return folders; + // we do two filters because otherwise TS type inference does convert the array to TFolder[] + return this.app.vault + .getAllLoadedFiles() + .filter(file => file instanceof TFolder) + .filter(file => file.path.toLowerCase().contains(lowerCaseInputStr)); } - renderSuggestion(file: TFolder, el: HTMLElement): void { - el.setText(file.path); - } - - selectSuggestion(file: TFolder): void { - this.inputEl.value = file.path; - this.inputEl.trigger('input'); - this.close(); + renderSuggestion(value: TFolder, el: HTMLElement): void { + el.setText(value.path); } } diff --git a/src/settings/suggesters/Suggest.ts b/src/settings/suggesters/Suggest.ts deleted file mode 100644 index 453f837..0000000 --- a/src/settings/suggesters/Suggest.ts +++ /dev/null @@ -1,185 +0,0 @@ -// Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes - -import type { Instance as PopperInstance } from '@popperjs/core'; -import { createPopper } from '@popperjs/core'; -import type { App, ISuggestOwner } from 'obsidian'; -import { Scope } from 'obsidian'; -import { wrapAround } from 'src/utils/Utils'; - -export class Suggest { - private owner: ISuggestOwner; - private values: T[]; - private suggestions: HTMLElement[]; - private selectedItem: number; - private containerEl: HTMLElement; - - constructor(owner: ISuggestOwner, containerEl: HTMLElement, scope: Scope) { - this.owner = owner; - this.containerEl = containerEl; - this.values = []; - this.suggestions = []; - this.selectedItem = 0; - - containerEl.on('click', '.suggestion-item', (e, el) => this.onSuggestionClick(e, el)); - containerEl.on('mousemove', '.suggestion-item', (e, el) => this.onSuggestionMouseover(e, el)); - - scope.register([], 'ArrowUp', event => { - if (!event.isComposing) { - this.setSelectedItem(this.selectedItem - 1, true); - return false; - } - return undefined; - }); - - scope.register([], 'ArrowDown', event => { - if (!event.isComposing) { - this.setSelectedItem(this.selectedItem + 1, true); - return false; - } - return undefined; - }); - - scope.register([], 'Enter', event => { - if (!event.isComposing) { - this.useSelectedItem(event); - return false; - } - return undefined; - }); - } - - onSuggestionClick(event: MouseEvent, el: HTMLElement): void { - event.preventDefault(); - - const item = this.suggestions.indexOf(el); - this.setSelectedItem(item, false); - this.useSelectedItem(event); - } - - onSuggestionMouseover(_event: MouseEvent, el: HTMLElement): void { - const item = this.suggestions.indexOf(el); - this.setSelectedItem(item, false); - } - - setSuggestions(values: T[]): void { - this.containerEl.empty(); - const suggestionEls: HTMLDivElement[] = []; - - values.forEach(value => { - const suggestionEl = this.containerEl.createDiv('suggestion-item'); - this.owner.renderSuggestion(value, suggestionEl); - suggestionEls.push(suggestionEl); - }); - - this.values = values; - this.suggestions = suggestionEls; - this.setSelectedItem(0, false); - } - - useSelectedItem(event: MouseEvent | KeyboardEvent): void { - const currentValue = this.values[this.selectedItem]; - if (currentValue) { - this.owner.selectSuggestion(currentValue, event); - } - } - - setSelectedItem(selectedIndex: number, scrollIntoView: boolean): void { - const normalizedIndex = this.suggestions.length > 0 ? wrapAround(selectedIndex, this.suggestions.length) : 0; - const prevSelectedSuggestion = this.suggestions[this.selectedItem]; - const selectedSuggestion = this.suggestions[normalizedIndex]; - - prevSelectedSuggestion?.removeClass('is-selected'); - selectedSuggestion?.addClass('is-selected'); - - this.selectedItem = normalizedIndex; - - if (scrollIntoView) { - selectedSuggestion.scrollIntoView(false); - } - } -} - -export abstract class TextInputSuggest implements ISuggestOwner { - protected app: App; - protected inputEl: HTMLInputElement; - - private popper?: PopperInstance; - private scope: Scope; - private suggestEl: HTMLElement; - private suggest: Suggest; - - constructor(app: App, inputEl: HTMLInputElement) { - this.app = app; - this.inputEl = inputEl; - this.scope = new Scope(); - - this.suggestEl = createDiv('suggestion-container'); - const suggestion = this.suggestEl.createDiv('suggestion'); - this.suggest = new Suggest(this, suggestion, this.scope); - - this.scope.register([], 'Escape', this.close.bind(this)); - - this.inputEl.addEventListener('input', this.onInputChanged.bind(this)); - this.inputEl.addEventListener('focus', this.onInputChanged.bind(this)); - this.inputEl.addEventListener('blur', this.close.bind(this)); - this.suggestEl.on('mousedown', '.suggestion-container', (event: MouseEvent) => { - event.preventDefault(); - }); - } - - onInputChanged(): void { - const inputStr = this.inputEl.value; - const suggestions = this.getSuggestions(inputStr); - - if (suggestions.length > 0) { - this.suggest.setSuggestions(suggestions); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.open((this.app as any).dom.appContainerEl, this.inputEl); - } - } - - open(container: HTMLElement, inputEl: HTMLElement): void { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (this.app as any).keymap.pushScope(this.scope); - - container.appendChild(this.suggestEl); - this.popper = createPopper(inputEl, this.suggestEl, { - placement: 'bottom-start', - modifiers: [ - { - name: 'sameWidth', - enabled: true, - fn: ({ state, instance }): void => { - // Note: positioning needs to be calculated twice - - // first pass - positioning it according to the width of the popper - // second pass - position it with the width bound to the reference element - // we need to early exit to avoid an infinite loop - const targetWidth = `${state.rects.reference.width}px`; - if (state.styles.popper.width === targetWidth) { - return; - } - state.styles.popper.width = targetWidth; - instance.update(); - }, - phase: 'beforeWrite', - requires: ['computeStyles'], - }, - ], - }); - } - - close(): void { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (this.app as any).keymap.popScope(this.scope); - - this.suggest.setSuggestions([]); - this.popper?.destroy(); - this.suggestEl.detach(); - } - - abstract getSuggestions(inputStr: string): T[]; - - abstract renderSuggestion(item: T, el: HTMLElement): void; - - abstract selectSuggestion(item: T): void; -} diff --git a/src/utils/BulkImportHelper.ts b/src/utils/BulkImportHelper.ts new file mode 100644 index 0000000..dcbaabb --- /dev/null +++ b/src/utils/BulkImportHelper.ts @@ -0,0 +1,150 @@ +import type { TFolder } from 'obsidian'; +import { TFile } from 'obsidian'; +import type MediaDbPlugin from 'src/main'; +import { MediaDbBulkImportModal as MediaDbBulkImportModal } from 'src/modals/MediaDbBulkImportModal'; +import type { MediaTypeModel } from 'src/models/MediaTypeModel'; +import { ModalResultCode } from './ModalHelper'; +import { dateTimeToString, markdownTable } from './Utils'; + +export enum BulkImportLookupMethod { + ID = 'id', + TITLE = 'title', +} + +interface BulkImportError { + filePath: string; + error: string; + canceled?: boolean; +} + +export class BulkImportHelper { + readonly plugin: MediaDbPlugin; + + constructor(plugin: MediaDbPlugin) { + this.plugin = plugin; + } + + async import(folder: TFolder): Promise { + const erroredFiles: BulkImportError[] = []; + let canceled: boolean = false; + + const { selectedAPI, lookupMethod, fieldName, appendContent } = await new Promise<{ + selectedAPI: string; + lookupMethod: BulkImportLookupMethod; + fieldName: string; + appendContent: boolean; + }>(resolve => { + new MediaDbBulkImportModal(this.plugin, (selectedAPI: string, lookupMethod: BulkImportLookupMethod, fieldName: string, appendContent: boolean) => { + resolve({ selectedAPI, lookupMethod, fieldName, appendContent }); + }).open(); + }); + + for (const child of folder.children) { + if (!(child instanceof TFile)) { + continue; + } + + const file: TFile = child; + if (canceled) { + erroredFiles.push({ filePath: file.path, error: 'user canceled' }); + continue; + } + + const metadata = this.plugin.getMetadataFromFileCache(file); + const lookupValue = metadata[fieldName]; + + if (!lookupValue || typeof lookupValue !== 'string') { + erroredFiles.push({ filePath: file.path, error: `metadata field '${fieldName}' not found, empty, or not a string` }); + continue; + } else if (lookupMethod === BulkImportLookupMethod.ID) { + const error = await this.importById(file, lookupValue, selectedAPI, appendContent); + if (error) { + erroredFiles.push(error); + } + } else if (lookupMethod === BulkImportLookupMethod.TITLE) { + const error = await this.importByTitle(file, lookupValue, selectedAPI, appendContent); + if (error) { + if (error.canceled) { + canceled = true; + } + erroredFiles.push(error); + } + } else { + erroredFiles.push({ filePath: file.path, error: `invalid lookup type` }); + continue; + } + } + + if (erroredFiles.length > 0) { + await this.createErroredFilesReport(erroredFiles); + } + } + + private async importById(file: TFile, lookupValue: string, selectedAPI: string, appendContent: boolean): Promise { + try { + const model = await this.plugin.apiManager.queryDetailedInfoById(lookupValue, selectedAPI); + if (model) { + await this.plugin.createMediaDbNotes([model], appendContent ? file : undefined); + return undefined; + } else { + return { filePath: file.path, error: `Failed to query API with id: ${lookupValue}` }; + } + } catch (e) { + return { filePath: file.path, error: `${e}` }; + } + } + + private async importByTitle(file: TFile, lookupValue: string, selectedAPI: string, appendContent: boolean): Promise { + let results: MediaTypeModel[] = []; + try { + results = await this.plugin.apiManager.query(lookupValue, [selectedAPI]); + } catch (e) { + return { filePath: file.path, error: `${e}` }; + } + if (!results || results.length === 0) { + return { filePath: file.path, error: `no search results` }; + } + + const { selectModalResult, selectModal } = await this.plugin.modalHelper.createSelectModal({ + elements: results, + skipButton: true, + modalTitle: `Results for '${lookupValue}'`, + }); + + if (selectModalResult.code === ModalResultCode.ERROR) { + selectModal.close(); + return { filePath: file.path, error: selectModalResult.error.message }; + } + + if (selectModalResult.code === ModalResultCode.CLOSE) { + selectModal.close(); + return { filePath: file.path, error: 'user canceled', canceled: true }; + } + + if (selectModalResult.code === ModalResultCode.SKIP) { + selectModal.close(); + return { filePath: file.path, error: 'user skipped' }; + } + + if (selectModalResult.data.selected.length === 0) { + selectModal.close(); + return { filePath: file.path, error: `no search results selected` }; + } + + const detailedResults = await this.plugin.queryDetails(selectModalResult.data.selected); + await this.plugin.createMediaDbNotes(detailedResults, appendContent ? file : undefined); + + selectModal.close(); + return undefined; + } + + private async createErroredFilesReport(erroredFiles: BulkImportError[]): Promise { + const title = `MDB - bulk import error report ${dateTimeToString(new Date())}`; + const filePath = `${title}.md`; + + const table = [['file', 'error']].concat(erroredFiles.map(x => [x.filePath, x.error])); + + const fileContent = `# ${title}\n\n${markdownTable(table)}`; + await this.plugin.app.vault.create(filePath, fileContent); + } +} diff --git a/src/utils/DateFormatter.ts b/src/utils/DateFormatter.ts index 72b7f71..0088af0 100644 --- a/src/utils/DateFormatter.ts +++ b/src/utils/DateFormatter.ts @@ -17,9 +17,7 @@ export class DateFormatter { getPreview(format?: string): string { const today = moment(); - if (!format) { - format = this.toFormat; - } + format ??= this.toFormat; return today.locale(this.locale).format(format); } @@ -35,7 +33,7 @@ export class DateFormatter { * from the locale of this machine. * @returns formatted date string or null if `dateString` is not a valid date */ - format(dateString: string, dateFormat?: string, locale: string = 'en'): string | null { + format(dateString: string | null | undefined, dateFormat?: string, locale: string = 'en'): string | null { if (!dateString) { return null; } diff --git a/src/utils/IllegalFilenameCharactersList.ts b/src/utils/IllegalFilenameCharactersList.ts new file mode 100644 index 0000000..220ca9a --- /dev/null +++ b/src/utils/IllegalFilenameCharactersList.ts @@ -0,0 +1,16 @@ +// Illegal characters in the form `[illegal_character, replacement][]` +export const ILLEGAL_FILENAME_CHARACTERS = [ + ['/', '-'], + ['\\', '-'], + ['<', ''], + ['>', ''], + [':', ' - '], + ['"', "'"], + ['|', ' - '], + ['?', ''], + ['*', ''], + ['[', '('], + [']', ')'], + ['^', ''], + ['#', ''], +]; diff --git a/src/utils/MediaType.ts b/src/utils/MediaType.ts index 02d1c2c..857050f 100644 --- a/src/utils/MediaType.ts +++ b/src/utils/MediaType.ts @@ -1,6 +1,7 @@ export enum MediaType { Movie = 'movie', Series = 'series', + Season = 'season', ComicManga = 'comicManga', Game = 'game', MusicRelease = 'musicRelease', diff --git a/src/utils/MediaTypeManager.ts b/src/utils/MediaTypeManager.ts index ec4a5ae..b9e1419 100644 --- a/src/utils/MediaTypeManager.ts +++ b/src/utils/MediaTypeManager.ts @@ -1,21 +1,24 @@ -import type { App, TAbstractFile, TFile } from 'obsidian'; +import type { App, TFile } from 'obsidian'; import { TFolder } from 'obsidian'; import { BoardGameModel } from '../models/BoardGameModel'; import { BookModel } from '../models/BookModel'; -import { GameModel } from '../models/GameModel'; import { ComicMangaModel } from '../models/ComicMangaModel'; +import { GameModel } from '../models/GameModel'; import type { MediaTypeModel } from '../models/MediaTypeModel'; import { MovieModel } from '../models/MovieModel'; import { MusicReleaseModel } from '../models/MusicReleaseModel'; import { SeriesModel } from '../models/SeriesModel'; +import { SeasonModel } from '../models/SeasonModel'; import { WikiModel } from '../models/WikiModel'; import type { MediaDbPluginSettings } from '../settings/Settings'; +import { ILLEGAL_FILENAME_CHARACTERS } from './IllegalFilenameCharactersList'; import { MediaType } from './MediaType'; import { replaceTags } from './Utils'; export const MEDIA_TYPES: MediaType[] = [ MediaType.Movie, MediaType.Series, + MediaType.Season, MediaType.ComicManga, MediaType.Game, MediaType.Wiki, @@ -39,6 +42,7 @@ export class MediaTypeManager { this.mediaFileNameTemplateMap = new Map(); this.mediaFileNameTemplateMap.set(MediaType.Movie, settings.movieFileNameTemplate); this.mediaFileNameTemplateMap.set(MediaType.Series, settings.seriesFileNameTemplate); + this.mediaFileNameTemplateMap.set(MediaType.Season, settings.seasonFileNameTemplate); this.mediaFileNameTemplateMap.set(MediaType.ComicManga, settings.mangaFileNameTemplate); this.mediaFileNameTemplateMap.set(MediaType.Game, settings.gameFileNameTemplate); this.mediaFileNameTemplateMap.set(MediaType.Wiki, settings.wikiFileNameTemplate); @@ -49,6 +53,7 @@ export class MediaTypeManager { this.mediaTemplateMap = new Map(); this.mediaTemplateMap.set(MediaType.Movie, settings.movieTemplate); this.mediaTemplateMap.set(MediaType.Series, settings.seriesTemplate); + this.mediaTemplateMap.set(MediaType.Season, settings.seasonTemplate); this.mediaTemplateMap.set(MediaType.ComicManga, settings.mangaTemplate); this.mediaTemplateMap.set(MediaType.Game, settings.gameTemplate); this.mediaTemplateMap.set(MediaType.Wiki, settings.wikiTemplate); @@ -61,6 +66,7 @@ export class MediaTypeManager { this.mediaFolderMap = new Map(); this.mediaFolderMap.set(MediaType.Movie, settings.movieFolder); this.mediaFolderMap.set(MediaType.Series, settings.seriesFolder); + this.mediaFolderMap.set(MediaType.Season, settings.seasonFolder); this.mediaFolderMap.set(MediaType.ComicManga, settings.mangaFolder); this.mediaFolderMap.set(MediaType.Game, settings.gameFolder); this.mediaFolderMap.set(MediaType.Wiki, settings.wikiFolder); @@ -71,7 +77,14 @@ export class MediaTypeManager { getFileName(mediaTypeModel: MediaTypeModel): string { // Ignore undefined tags since some search APIs do not return all properties in the model and produce clean file names even if errors occur - return replaceTags(this.mediaFileNameTemplateMap.get(mediaTypeModel.getMediaType())!, mediaTypeModel, true); + const fileName = replaceTags(this.mediaFileNameTemplateMap.get(mediaTypeModel.getMediaType())!, mediaTypeModel, true); + return this.cleanFileName(fileName); + } + + cleanFileName(fileName: string): string { + const cleanedFileName = ILLEGAL_FILENAME_CHARACTERS.reduce((str, char) => str.replaceAll(char[0], char[1]), fileName); + // Remove all duplicate whitespace in the file name + return cleanedFileName.replaceAll(/ +/g, ' '); } async getTemplate(mediaTypeModel: MediaTypeModel, app: App): Promise { @@ -104,9 +117,7 @@ export class MediaTypeManager { async getFolder(mediaTypeModel: MediaTypeModel, app: App): Promise { let folderPath = this.mediaFolderMap.get(mediaTypeModel.getMediaType()); - if (!folderPath) { - folderPath = `/`; - } + folderPath ??= `/`; // console.log(folderPath); if (!(await app.vault.adapter.exists(folderPath))) { @@ -115,7 +126,7 @@ export class MediaTypeManager { const folder = app.vault.getAbstractFileByPath(folderPath); if (!(folder instanceof TFolder)) { - throw Error(`Expected ${folder} to be instance of TFolder`); + throw Error(`Expected ${folder?.path} to be instance of TFolder`); } return folder; @@ -127,11 +138,13 @@ export class MediaTypeManager { * @param obj * @param mediaType */ - createMediaTypeModelFromMediaType(obj: any, mediaType: MediaType): MediaTypeModel { + createMediaTypeModelFromMediaType(obj: object, mediaType: MediaType): MediaTypeModel { if (mediaType === MediaType.Movie) { return new MovieModel(obj); } else if (mediaType === MediaType.Series) { return new SeriesModel(obj); + } else if (mediaType === MediaType.Season) { + return new SeasonModel(obj); } else if (mediaType === MediaType.ComicManga) { return new ComicMangaModel(obj); } else if (mediaType === MediaType.Game) { diff --git a/src/utils/ModalHelper.ts b/src/utils/ModalHelper.ts index eadf5a2..79c7c7f 100644 --- a/src/utils/ModalHelper.ts +++ b/src/utils/ModalHelper.ts @@ -159,12 +159,13 @@ export interface IdSearchModalOptions { * - skipButton: whether to add a skip button to the modal */ export interface SelectModalOptions { - modalTitle?: string; elements?: MediaTypeModel[]; multiSelect?: boolean; + modalTitle?: string; skipButton?: boolean; + description?: string; // Add this + submitButtonText?: string; // Add this too } - /** * Options for the preview modal. * - modalTitle: the title of the modal @@ -189,7 +190,7 @@ export const ADVANCED_SEARCH_MODAL_DEFAULT_OPTIONS: AdvancedSearchModalOptions = export const ID_SEARCH_MODAL_DEFAULT_OPTIONS: IdSearchModalOptions = { modalTitle: 'Media DB Id Search', - preselectedAPI: '', + preselectedAPI: undefined, prefilledSearchString: '', }; @@ -205,6 +206,15 @@ export const PREVIEW_MODAL_DEFAULT_OPTIONS: PreviewModalOptions = { elements: [], }; +export const SELECTMODALOPTIONSDEFAULT: SelectModalOptions = { + elements: [], + multiSelect: true, + modalTitle: '', + skipButton: false, + description: 'Select one or multiple search results.', + submitButtonText: 'Ok', +}; + /** * A class providing multiple usefull functions for dealing with the plugins modals. */ @@ -505,12 +515,12 @@ export class ModalHelper { console.warn(previewModalResult.error); new Notice(previewModalResult.error.toString()); previewModal.close(); - return true; + return false; } if (previewModalResult.code === ModalResultCode.CLOSE) { // modal is already being closed - return true; + return false; } try { diff --git a/src/utils/SeasonModalHelper.ts b/src/utils/SeasonModalHelper.ts new file mode 100644 index 0000000..93002df --- /dev/null +++ b/src/utils/SeasonModalHelper.ts @@ -0,0 +1,16 @@ +import type { App } from 'obsidian'; +import type { SeasonSelectModalElement } from '../modals/MediaDbSeasonSelectModal'; +import { MediaDbSeasonSelectModal } from '../modals/MediaDbSeasonSelectModal'; + +export async function openSeasonSelectModal(app: App, plugin: any, seasons: SeasonSelectModalElement[]): Promise { + return new Promise(resolve => { + const modal = new MediaDbSeasonSelectModal(plugin, seasons, true); + modal.setSubmitCallback(selected => { + resolve(selected); + }); + modal.setCloseCallback(() => { + resolve(undefined); + }); + modal.open(); + }); +} diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 7950b15..9b25b34 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -1,4 +1,6 @@ +import { iso6392 } from 'iso-639-2'; import type { TFile, TFolder, App } from 'obsidian'; +import { requestUrl } from 'obsidian'; import type { MediaTypeModel } from '../models/MediaTypeModel'; export const pluginName: string = 'obsidian-media-db-plugin'; @@ -42,7 +44,8 @@ function replaceTag(match: string, mediaTypeModel: MediaTypeModel, ignoreUndefin return ignoreUndefined ? '' : '{{ INVALID TEMPLATE TAG - object undefined }}'; } - return obj; + // eslint-disable-next-line @typescript-eslint/no-base-to-string + return obj?.toString() ?? 'null'; } else if (parts.length === 2) { const operator = parts[0]; @@ -58,7 +61,8 @@ function replaceTag(match: string, mediaTypeModel: MediaTypeModel, ignoreUndefin if (!Array.isArray(obj)) { return '{{ INVALID TEMPLATE TAG - operator LIST is only applicable on an array }}'; } - return obj.map((e: any) => `- ${e}`).join('\n'); + + return obj.map((e: unknown) => `- ${e}`).join('\n'); } else if (operator === 'ENUM') { if (!Array.isArray(obj)) { return '{{ INVALID TEMPLATE TAG - operator ENUM is only applicable on an array }}'; @@ -68,12 +72,16 @@ function replaceTag(match: string, mediaTypeModel: MediaTypeModel, ignoreUndefin if (!Array.isArray(obj)) { return '{{ INVALID TEMPLATE TAG - operator FIRST is only applicable on an array }}'; } - return obj[0]; + + const first = obj[0] as unknown; + return first?.toString() ?? 'null'; } else if (operator === 'LAST') { if (!Array.isArray(obj)) { return '{{ INVALID TEMPLATE TAG - operator LAST is only applicable on an array }}'; } - return obj[obj.length - 1]; + + const last = obj[obj.length - 1] as unknown; + return last?.toString() ?? 'null'; } return `{{ INVALID TEMPLATE TAG - unknown operator ${operator} }}`; @@ -82,12 +90,12 @@ function replaceTag(match: string, mediaTypeModel: MediaTypeModel, ignoreUndefin return '{{ INVALID TEMPLATE TAG }}'; } -function traverseMetaData(path: string[], mediaTypeModel: MediaTypeModel): any { - let o: any = mediaTypeModel; +function traverseMetaData(path: string[], mediaTypeModel: MediaTypeModel): unknown { + let o: unknown = mediaTypeModel; for (const part of path) { if (o !== undefined) { - o = o[part]; + o = (o as Record)[part]; } } @@ -195,9 +203,9 @@ export interface CreateNoteOptions { folder?: TFolder; } -export function migrateObject(object: T, oldData: any, defaultData: T): void { +export function migrateObject(object: T, oldData: Record, defaultData: T): void { for (const key in object) { - object[key] = oldData.hasOwnProperty(key) ? oldData[key] : defaultData[key]; + object[key] = Object.hasOwn(oldData, key) && oldData[key] !== undefined && oldData[key] !== null ? (oldData[key] as T[typeof key]) : defaultData[key]; } } @@ -215,6 +223,8 @@ export function unCamelCase(str: string): string { ); } +/* eslint-disable */ + export function hasTemplaterPlugin(app: App): boolean { const templater = (app as any).plugins.plugins['templater-obsidian']; @@ -224,13 +234,72 @@ export function hasTemplaterPlugin(app: App): boolean { // Copied from https://github.com/anpigon/obsidian-book-search-plugin // Licensed under the MIT license. Copyright (c) 2020 Jake Runzer export async function useTemplaterPluginInFile(app: App, file: TFile): Promise { - // eslint-disable-next-line @typescript-eslint/no-explicit-any const templater = (app as any).plugins.plugins['templater-obsidian']; if (templater && !templater?.settings.trigger_on_file_creation) { await templater.templater.overwrite_file_commands(file); } } +/* eslint-enable */ + export type ModelToData = { - [K in keyof T as T[K] extends Function ? never : K]?: T[K]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + [K in keyof T as T[K] extends Function ? never : K]?: T[K] | null; }; + +// Checks if a given URL points to an existing image (status 200), or returns false for 404/other errors. + +export async function imageUrlExists(url: string): Promise { + try { + // @ts-ignore + const response = await requestUrl({ + url, + method: 'HEAD', + throw: false, + }); + return response.status === 200; + } catch { + return false; + } +} + +export function isTruthy(value: T): value is Exclude { + return Boolean(value); +} + +/** + * Wraps Obsidians `requestUrl` in a fetch like API. + */ +export async function obsidianFetch(input: Request): Promise { + const obs_headers: Record = {}; + input.headers.forEach((header, value) => { + obs_headers[header] = value; + }); + + const res = await requestUrl({ + url: input.url, + method: input.method, + headers: obs_headers, + throw: false, // Do not throw on error, handle it manually + }); + + const responseHeaders: Headers = new Headers(); + for (const [key, value] of Object.entries(res.headers)) { + responseHeaders.append(key, value); + } + + return { + ok: res.status >= 200 && res.status < 300, + status: res.status, + headers: responseHeaders, + // eslint-disable-next-line + json: async () => res.json, + text: async () => res.text, + } as Response; +} + +export function getLanguageName(code: string): string | null { + const language = iso6392.find(lang => lang.iso6392B === code || lang.iso6392T === code); + + return language?.name ?? null; +} diff --git a/test/placeholder.test.ts b/test/placeholder.test.ts new file mode 100644 index 0000000..a1c414e --- /dev/null +++ b/test/placeholder.test.ts @@ -0,0 +1,5 @@ +import { test, expect } from 'bun:test'; + +test('placeholder test', () => { + expect(true).toBe(true); +});