mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-24 02:02:36 -04:00
697 lines
19 KiB
JSON
697 lines
19 KiB
JSON
{
|
|
"openapi": "3.0.3",
|
|
"info": {
|
|
"title": "transcoder",
|
|
"description": "Transcoder's open api.",
|
|
"license": {
|
|
"name": ""
|
|
},
|
|
"version": "0.1.0"
|
|
},
|
|
"paths": {
|
|
"/{resource}/{slug}/audio/{audio}/index.m3u8": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Transcode audio",
|
|
"description": "Transcode audio\n\nGet the selected audio\nThis route can take a few seconds to respond since it will way for at least one segment to be\navailable.",
|
|
"operationId": "get_audio_transcoded",
|
|
"parameters": [
|
|
{
|
|
"name": "resource",
|
|
"in": "path",
|
|
"description": "Episode or movie",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "slug",
|
|
"in": "path",
|
|
"description": "The slug of the movie/episode.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "audio",
|
|
"in": "path",
|
|
"description": "Specify the audio stream you want. For mappings, refer to the audios fields of the /watch response.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"minimum": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Get the m3u8 playlist."
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/{resource}/{slug}/audio/{audio}/segments-{chunk}.ts": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Get audio chunk",
|
|
"description": "Get audio chunk\n\nRetrieve a chunk of a transcoded audio.",
|
|
"operationId": "get_audio_chunk",
|
|
"parameters": [
|
|
{
|
|
"name": "resource",
|
|
"in": "path",
|
|
"description": "Episode or movie",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "slug",
|
|
"in": "path",
|
|
"description": "The slug of the movie/episode.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "audio",
|
|
"in": "path",
|
|
"description": "Specify the audio you want",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"minimum": 0
|
|
}
|
|
},
|
|
{
|
|
"name": "chunk",
|
|
"in": "path",
|
|
"description": "The number of the chunk",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"minimum": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Get a hls chunk."
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/{resource}/{slug}/direct": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Direct video",
|
|
"description": "Direct video\n\nRetrieve the raw video stream, in the same container as the one on the server. No transcoding or\ntransmuxing is done.",
|
|
"operationId": "get_direct",
|
|
"parameters": [
|
|
{
|
|
"name": "resource",
|
|
"in": "path",
|
|
"description": "Episode or movie",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "slug",
|
|
"in": "path",
|
|
"description": "The slug of the movie/episode.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "The item is returned"
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/{resource}/{slug}/info": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Identify",
|
|
"description": "Identify\n\nIdentify metadata about a file",
|
|
"operationId": "identify_resource",
|
|
"parameters": [
|
|
{
|
|
"name": "resource",
|
|
"in": "path",
|
|
"description": "Episode or movie",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "slug",
|
|
"in": "path",
|
|
"description": "The slug of the movie/episode.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Ok",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MediaInfo"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/{resource}/{slug}/master.m3u8": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Get master playlist",
|
|
"description": "Get master playlist\n\nGet a master playlist containing all possible video qualities and audios available for this resource.\nNote that the direct stream is missing (since the direct is not an hls stream) and\nsubtitles/fonts are not included to support more codecs than just webvtt.",
|
|
"operationId": "get_master",
|
|
"parameters": [
|
|
{
|
|
"name": "resource",
|
|
"in": "path",
|
|
"description": "Episode or movie",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "slug",
|
|
"in": "path",
|
|
"description": "The slug of the movie/episode.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Get the m3u8 master playlist."
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/{resource}/{slug}/{quality}/index.m3u8": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Transcode video",
|
|
"description": "Transcode video\n\nTranscode the video to the selected quality.\nThis route can take a few seconds to respond since it will way for at least one segment to be\navailable.",
|
|
"operationId": "get_transcoded",
|
|
"parameters": [
|
|
{
|
|
"name": "resource",
|
|
"in": "path",
|
|
"description": "Episode or movie",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "slug",
|
|
"in": "path",
|
|
"description": "The slug of the movie/episode.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "quality",
|
|
"in": "path",
|
|
"description": "Specify the quality you want",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-client-id",
|
|
"in": "header",
|
|
"description": "A unique identify for a player's instance. Used to cancel unused transcode",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Get the m3u8 playlist."
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/{resource}/{slug}/{quality}/segments-{chunk}.ts": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Get transmuxed chunk",
|
|
"description": "Get transmuxed chunk\n\nRetrieve a chunk of a transmuxed video.",
|
|
"operationId": "get_chunk",
|
|
"parameters": [
|
|
{
|
|
"name": "resource",
|
|
"in": "path",
|
|
"description": "Episode or movie",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "slug",
|
|
"in": "path",
|
|
"description": "The slug of the movie/episode.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "quality",
|
|
"in": "path",
|
|
"description": "Specify the quality you want",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "chunk",
|
|
"in": "path",
|
|
"description": "The number of the chunk",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"minimum": 0
|
|
}
|
|
},
|
|
{
|
|
"name": "x-client-id",
|
|
"in": "header",
|
|
"description": "A unique identify for a player's instance. Used to cancel unused transcode",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Get a hls chunk."
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/{sha}/attachment/{name}": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Get attachments",
|
|
"description": "Get attachments\n\nGet a specific attachment",
|
|
"operationId": "get_attachment",
|
|
"parameters": [
|
|
{
|
|
"name": "sha",
|
|
"in": "path",
|
|
"description": "The sha1 of the file",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "name",
|
|
"in": "path",
|
|
"description": "The name of the attachment.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Ok",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MediaInfo"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/{sha}/subtitle/{name}": {
|
|
"get": {
|
|
"tags": [
|
|
"crate"
|
|
],
|
|
"summary": "Get subtitle",
|
|
"description": "Get subtitle\n\nGet a specific subtitle",
|
|
"operationId": "get_subtitle",
|
|
"parameters": [
|
|
{
|
|
"name": "sha",
|
|
"in": "path",
|
|
"description": "The sha1 of the file",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "name",
|
|
"in": "path",
|
|
"description": "The name of the subtitle.",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Ok",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MediaInfo"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Invalid slug."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"Audio": {
|
|
"type": "object",
|
|
"required": [
|
|
"index",
|
|
"codec",
|
|
"isDefault",
|
|
"isForced"
|
|
],
|
|
"properties": {
|
|
"codec": {
|
|
"type": "string",
|
|
"description": "The codec of this stream."
|
|
},
|
|
"index": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"description": "The index of this track on the media.",
|
|
"minimum": 0
|
|
},
|
|
"isDefault": {
|
|
"type": "boolean",
|
|
"description": "Is this stream the default one of it's type?"
|
|
},
|
|
"isForced": {
|
|
"type": "boolean",
|
|
"description": "Is this stream tagged as forced? (useful only for subtitles)"
|
|
},
|
|
"language": {
|
|
"type": "string",
|
|
"description": "The language of this stream (as a ISO-639-2 language code)",
|
|
"nullable": true
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "The title of the stream.",
|
|
"nullable": true
|
|
}
|
|
}
|
|
},
|
|
"Chapter": {
|
|
"type": "object",
|
|
"required": [
|
|
"startTime",
|
|
"endTime",
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"endTime": {
|
|
"type": "number",
|
|
"format": "float",
|
|
"description": "The end time of the chapter (in second from the start of the episode)."
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The name of this chapter. This should be a human-readable name that could be presented to the user."
|
|
},
|
|
"startTime": {
|
|
"type": "number",
|
|
"format": "float",
|
|
"description": "The start time of the chapter (in second from the start of the episode)."
|
|
}
|
|
}
|
|
},
|
|
"MediaInfo": {
|
|
"type": "object",
|
|
"required": [
|
|
"sha",
|
|
"path",
|
|
"extension",
|
|
"length",
|
|
"container",
|
|
"video",
|
|
"audios",
|
|
"subtitles",
|
|
"fonts",
|
|
"chapters"
|
|
],
|
|
"properties": {
|
|
"audios": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Audio"
|
|
},
|
|
"description": "The list of audio tracks."
|
|
},
|
|
"chapters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Chapter"
|
|
},
|
|
"description": "The list of chapters. See Chapter for more information."
|
|
},
|
|
"container": {
|
|
"type": "string",
|
|
"description": "The container of the video file of this episode."
|
|
},
|
|
"extension": {
|
|
"type": "string",
|
|
"description": "The extension currently used to store this video file"
|
|
},
|
|
"fonts": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "The list of fonts that can be used to display subtitles."
|
|
},
|
|
"length": {
|
|
"type": "number",
|
|
"format": "float",
|
|
"description": "The length of the media in seconds."
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"description": "The internal path of the video file."
|
|
},
|
|
"sha": {
|
|
"type": "string",
|
|
"description": "The sha1 of the video file."
|
|
},
|
|
"subtitles": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Subtitle"
|
|
},
|
|
"description": "The list of subtitles tracks."
|
|
},
|
|
"video": {
|
|
"$ref": "#/components/schemas/Video"
|
|
}
|
|
}
|
|
},
|
|
"Quality": {
|
|
"type": "string",
|
|
"enum": [
|
|
"P240",
|
|
"P360",
|
|
"P480",
|
|
"P720",
|
|
"P1080",
|
|
"P1440",
|
|
"P4k",
|
|
"P8k",
|
|
"Original"
|
|
]
|
|
},
|
|
"Subtitle": {
|
|
"type": "object",
|
|
"required": [
|
|
"index",
|
|
"codec",
|
|
"isDefault",
|
|
"isForced"
|
|
],
|
|
"properties": {
|
|
"codec": {
|
|
"type": "string",
|
|
"description": "The codec of this stream."
|
|
},
|
|
"extension": {
|
|
"type": "string",
|
|
"description": "The extension for the codec.",
|
|
"nullable": true
|
|
},
|
|
"index": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"description": "The index of this track on the media.",
|
|
"minimum": 0
|
|
},
|
|
"isDefault": {
|
|
"type": "boolean",
|
|
"description": "Is this stream the default one of it's type?"
|
|
},
|
|
"isForced": {
|
|
"type": "boolean",
|
|
"description": "Is this stream tagged as forced? (useful only for subtitles)"
|
|
},
|
|
"language": {
|
|
"type": "string",
|
|
"description": "The language of this stream (as a ISO-639-2 language code)",
|
|
"nullable": true
|
|
},
|
|
"link": {
|
|
"type": "string",
|
|
"description": "The link to access this subtitle.",
|
|
"nullable": true
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "The title of the stream.",
|
|
"nullable": true
|
|
}
|
|
}
|
|
},
|
|
"Video": {
|
|
"type": "object",
|
|
"required": [
|
|
"codec",
|
|
"quality",
|
|
"width",
|
|
"height",
|
|
"bitrate"
|
|
],
|
|
"properties": {
|
|
"bitrate": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"description": "The average bitrate of the video in bytes/s",
|
|
"minimum": 0
|
|
},
|
|
"codec": {
|
|
"type": "string",
|
|
"description": "The codec of this stream (defined as the RFC 6381)."
|
|
},
|
|
"height": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"description": "The height of the video stream",
|
|
"minimum": 0
|
|
},
|
|
"language": {
|
|
"type": "string",
|
|
"description": "The language of this stream (as a ISO-639-2 language code)",
|
|
"nullable": true
|
|
},
|
|
"quality": {
|
|
"$ref": "#/components/schemas/Quality"
|
|
},
|
|
"width": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"description": "The width of the video stream",
|
|
"minimum": 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |