mirror of
				https://github.com/zoriya/Kyoo.git
				synced 2025-10-26 08:12:35 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			523 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			JSON
		
	
	
	
	
	
			
		
		
	
	
			523 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			JSON
		
	
	
	
	
	
| {
 | |
|     "swagger": "2.0",
 | |
|     "info": {
 | |
|         "description": "Real time transcoder.",
 | |
|         "title": "gocoder - Kyoo's transcoder",
 | |
|         "contact": {
 | |
|             "name": "Repository",
 | |
|             "url": "https://github.com/zoriya/kyoo"
 | |
|         },
 | |
|         "license": {
 | |
|             "name": "GPL-3.0",
 | |
|             "url": "https://www.gnu.org/licenses/gpl-3.0.en.html"
 | |
|         },
 | |
|         "version": "1.0"
 | |
|     },
 | |
|     "host": "kyoo.zoriya.dev",
 | |
|     "basePath": "/video",
 | |
|     "paths": {
 | |
|         "/:path/attachment/:name": {
 | |
|             "get": {
 | |
|                 "description": "Get a specific attachment.",
 | |
|                 "tags": [
 | |
|                     "metadata"
 | |
|                 ],
 | |
|                 "summary": "Get attachments",
 | |
|                 "parameters": [
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "format": "base64",
 | |
|                         "example": "L3ZpZGVvL2J1YmJsZS5ta3YK",
 | |
|                         "description": "Base64 of a video's path",
 | |
|                         "name": "path",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     },
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "example": "font.ttf",
 | |
|                         "description": "Name of the attachment",
 | |
|                         "name": "name",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     }
 | |
|                 ],
 | |
|                 "responses": {
 | |
|                     "200": {
 | |
|                         "description": "Requested attachment",
 | |
|                         "schema": {
 | |
|                             "type": "file"
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "/:path/direct": {
 | |
|             "get": {
 | |
|                 "description": "Retrieve the raw video stream, in the same container as the one on the server.\nNo transcoding or transmuxing is done.",
 | |
|                 "tags": [
 | |
|                     "streams"
 | |
|                 ],
 | |
|                 "summary": "Direct video",
 | |
|                 "parameters": [
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "format": "base64",
 | |
|                         "example": "L3ZpZGVvL2J1YmJsZS5ta3YK",
 | |
|                         "description": "Base64 of a video's path",
 | |
|                         "name": "path",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     },
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "example": "bubble.mkv",
 | |
|                         "description": "anything, this can be used for the automatic file name when downloading from the browser",
 | |
|                         "name": "identifier",
 | |
|                         "in": "path"
 | |
|                     }
 | |
|                 ],
 | |
|                 "responses": {
 | |
|                     "206": {
 | |
|                         "description": "Video file (supports byte-requests)",
 | |
|                         "schema": {
 | |
|                             "type": "file"
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "/:path/info": {
 | |
|             "get": {
 | |
|                 "description": "Identify metadata about a file.",
 | |
|                 "tags": [
 | |
|                     "metadata"
 | |
|                 ],
 | |
|                 "summary": "Identify",
 | |
|                 "parameters": [
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "format": "base64",
 | |
|                         "example": "L3ZpZGVvL2J1YmJsZS5ta3YK",
 | |
|                         "description": "Base64 of a video's path",
 | |
|                         "name": "path",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     }
 | |
|                 ],
 | |
|                 "responses": {
 | |
|                     "200": {
 | |
|                         "description": "Metadata info of the video.",
 | |
|                         "schema": {
 | |
|                             "$ref": "#/definitions/src.MediaInfo"
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "/:path/master.m3u8": {
 | |
|             "get": {
 | |
|                 "description": "Get 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.",
 | |
|                 "tags": [
 | |
|                     "streams"
 | |
|                 ],
 | |
|                 "summary": "Get master playlist",
 | |
|                 "parameters": [
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "format": "base64",
 | |
|                         "example": "L3ZpZGVvL2J1YmJsZS5ta3YK",
 | |
|                         "description": "Base64 of a video's path",
 | |
|                         "name": "path",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     }
 | |
|                 ],
 | |
|                 "responses": {
 | |
|                     "200": {
 | |
|                         "description": "Master playlist with all available stream qualities",
 | |
|                         "schema": {
 | |
|                             "type": "file"
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "/:path/subtitle/:name": {
 | |
|             "get": {
 | |
|                 "description": "Get a specific subtitle.",
 | |
|                 "tags": [
 | |
|                     "metadata"
 | |
|                 ],
 | |
|                 "summary": "Get subtitle",
 | |
|                 "parameters": [
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "format": "base64",
 | |
|                         "example": "L3ZpZGVvL2J1YmJsZS5ta3YK",
 | |
|                         "description": "Base64 of a video's path",
 | |
|                         "name": "path",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     },
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "example": "en.srt",
 | |
|                         "description": "Name of the subtitle",
 | |
|                         "name": "name",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     }
 | |
|                 ],
 | |
|                 "responses": {
 | |
|                     "200": {
 | |
|                         "description": "Requested subtitle",
 | |
|                         "schema": {
 | |
|                             "type": "file"
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "/:path/thumbnails.png": {
 | |
|             "get": {
 | |
|                 "description": "Get a sprite file containing all the thumbnails of the show.",
 | |
|                 "tags": [
 | |
|                     "metadata"
 | |
|                 ],
 | |
|                 "summary": "Get thumbnail sprite",
 | |
|                 "parameters": [
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "format": "base64",
 | |
|                         "example": "L3ZpZGVvL2J1YmJsZS5ta3YK",
 | |
|                         "description": "Base64 of a video's path",
 | |
|                         "name": "path",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     }
 | |
|                 ],
 | |
|                 "responses": {
 | |
|                     "200": {
 | |
|                         "description": "sprite",
 | |
|                         "schema": {
 | |
|                             "type": "file"
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "/:path/thumbnails.vtt": {
 | |
|             "get": {
 | |
|                 "description": "Get a vtt file containing timing/position of thumbnails inside the sprite file.\nhttps://developer.bitmovin.com/playback/docs/webvtt-based-thumbnails for more info.",
 | |
|                 "tags": [
 | |
|                     "metadata"
 | |
|                 ],
 | |
|                 "summary": "Get thumbnail vtt",
 | |
|                 "parameters": [
 | |
|                     {
 | |
|                         "type": "string",
 | |
|                         "format": "base64",
 | |
|                         "example": "L3ZpZGVvL2J1YmJsZS5ta3YK",
 | |
|                         "description": "Base64 of a video's path",
 | |
|                         "name": "path",
 | |
|                         "in": "path",
 | |
|                         "required": true
 | |
|                     }
 | |
|                 ],
 | |
|                 "responses": {
 | |
|                     "200": {
 | |
|                         "description": "sprite",
 | |
|                         "schema": {
 | |
|                             "type": "file"
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     },
 | |
|     "definitions": {
 | |
|         "src.Audio": {
 | |
|             "type": "object",
 | |
|             "properties": {
 | |
|                 "bitrate": {
 | |
|                     "description": "/ The average bitrate of the audio in bytes/s",
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "codec": {
 | |
|                     "description": "/ The human readable codec name.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "index": {
 | |
|                     "description": "/ The index of this track on the media.",
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "isDefault": {
 | |
|                     "description": "/ Is this stream the default one of it's type?",
 | |
|                     "type": "boolean"
 | |
|                 },
 | |
|                 "isForced": {
 | |
|                     "description": "TODO: remove this in next major",
 | |
|                     "type": "boolean"
 | |
|                 },
 | |
|                 "language": {
 | |
|                     "description": "/ The language of this stream (as a IETF-BCP-47 language code)",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "mimeCodec": {
 | |
|                     "description": "/ The codec of this stream (defined as the RFC 6381).",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "title": {
 | |
|                     "description": "/ The title of the stream.",
 | |
|                     "type": "string"
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "src.Chapter": {
 | |
|             "type": "object",
 | |
|             "properties": {
 | |
|                 "endTime": {
 | |
|                     "description": "/ The end time of the chapter (in second from the start of the episode).",
 | |
|                     "type": "number"
 | |
|                 },
 | |
|                 "name": {
 | |
|                     "description": "/ The name of this chapter. This should be a human-readable name that could be presented to the user.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "startTime": {
 | |
|                     "description": "/ The start time of the chapter (in second from the start of the episode).",
 | |
|                     "type": "number"
 | |
|                 },
 | |
|                 "type": {
 | |
|                     "description": "/ The type value is used to mark special chapters (openning/credits...)",
 | |
|                     "allOf": [
 | |
|                         {
 | |
|                             "$ref": "#/definitions/src.ChapterType"
 | |
|                         }
 | |
|                     ]
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "src.ChapterType": {
 | |
|             "type": "string",
 | |
|             "enum": [
 | |
|                 "content",
 | |
|                 "recap",
 | |
|                 "intro",
 | |
|                 "credits",
 | |
|                 "preview"
 | |
|             ],
 | |
|             "x-enum-varnames": [
 | |
|                 "Content",
 | |
|                 "Recap",
 | |
|                 "Intro",
 | |
|                 "Credits",
 | |
|                 "Preview"
 | |
|             ]
 | |
|         },
 | |
|         "src.MediaInfo": {
 | |
|             "type": "object",
 | |
|             "properties": {
 | |
|                 "audios": {
 | |
|                     "description": "/ The list of audio tracks.",
 | |
|                     "type": "array",
 | |
|                     "items": {
 | |
|                         "$ref": "#/definitions/src.Audio"
 | |
|                     }
 | |
|                 },
 | |
|                 "chapters": {
 | |
|                     "description": "/ The list of chapters. See Chapter for more information.",
 | |
|                     "type": "array",
 | |
|                     "items": {
 | |
|                         "$ref": "#/definitions/src.Chapter"
 | |
|                     }
 | |
|                 },
 | |
|                 "container": {
 | |
|                     "description": "/ The container of the video file of this episode.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "duration": {
 | |
|                     "description": "/ The length of the media in seconds.",
 | |
|                     "type": "number"
 | |
|                 },
 | |
|                 "extension": {
 | |
|                     "description": "/ The extension currently used to store this video file",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "fonts": {
 | |
|                     "description": "/ The list of fonts that can be used to display subtitles.",
 | |
|                     "type": "array",
 | |
|                     "items": {
 | |
|                         "type": "string"
 | |
|                     }
 | |
|                 },
 | |
|                 "mimeCodec": {
 | |
|                     "description": "/ The whole mimetype (defined as the RFC 6381). ex: `video/mp4; codecs=\"avc1.640028, mp4a.40.2\"`",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "path": {
 | |
|                     "description": "/ The internal path of the video file.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "sha": {
 | |
|                     "description": "The sha1 of the video file.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "size": {
 | |
|                     "description": "/ The file size of the video file.",
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "subtitles": {
 | |
|                     "description": "/ The list of subtitles tracks.",
 | |
|                     "type": "array",
 | |
|                     "items": {
 | |
|                         "$ref": "#/definitions/src.Subtitle"
 | |
|                     }
 | |
|                 },
 | |
|                 "versions": {
 | |
|                     "description": "/ Version of the metadata. This can be used to invalidate older metadata from db if the extraction code has changed.",
 | |
|                     "allOf": [
 | |
|                         {
 | |
|                             "$ref": "#/definitions/src.Versions"
 | |
|                         }
 | |
|                     ]
 | |
|                 },
 | |
|                 "video": {
 | |
|                     "description": "TODO: remove on next major",
 | |
|                     "allOf": [
 | |
|                         {
 | |
|                             "$ref": "#/definitions/src.Video"
 | |
|                         }
 | |
|                     ]
 | |
|                 },
 | |
|                 "videos": {
 | |
|                     "description": "/ The list of videos if there are multiples.",
 | |
|                     "type": "array",
 | |
|                     "items": {
 | |
|                         "$ref": "#/definitions/src.Video"
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "src.Subtitle": {
 | |
|             "type": "object",
 | |
|             "properties": {
 | |
|                 "codec": {
 | |
|                     "description": "/ The codec of this stream.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "extension": {
 | |
|                     "description": "/ The extension for the codec.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "index": {
 | |
|                     "description": "/ The index of this track on the media.",
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "isDefault": {
 | |
|                     "description": "/ Is this stream the default one of it's type?",
 | |
|                     "type": "boolean"
 | |
|                 },
 | |
|                 "isExternal": {
 | |
|                     "description": "/ Is this an external subtitle (as in stored in a different file)",
 | |
|                     "type": "boolean"
 | |
|                 },
 | |
|                 "isForced": {
 | |
|                     "description": "/ Is this stream tagged as forced?",
 | |
|                     "type": "boolean"
 | |
|                 },
 | |
|                 "isHearingImpaired": {
 | |
|                     "description": "/ Is this stream tagged as hearing impaired?",
 | |
|                     "type": "boolean"
 | |
|                 },
 | |
|                 "language": {
 | |
|                     "description": "/ The language of this stream (as a IETF-BCP-47 language code)",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "link": {
 | |
|                     "description": "/ The link to access this subtitle.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "path": {
 | |
|                     "description": "/ Where the subtitle is stored (null if stored inside the video)",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "title": {
 | |
|                     "description": "/ The title of the stream.",
 | |
|                     "type": "string"
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "src.Versions": {
 | |
|             "type": "object",
 | |
|             "properties": {
 | |
|                 "extract": {
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "info": {
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "keyframes": {
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "thumbs": {
 | |
|                     "type": "integer"
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         "src.Video": {
 | |
|             "type": "object",
 | |
|             "properties": {
 | |
|                 "bitrate": {
 | |
|                     "description": "/ The average bitrate of the video in bytes/s",
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "codec": {
 | |
|                     "description": "/ The human readable codec name.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "height": {
 | |
|                     "description": "/ The height of the video stream",
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "index": {
 | |
|                     "description": "/ The index of this track on the media.",
 | |
|                     "type": "integer"
 | |
|                 },
 | |
|                 "isDefault": {
 | |
|                     "description": "/ Is this stream the default one of it's type?",
 | |
|                     "type": "boolean"
 | |
|                 },
 | |
|                 "language": {
 | |
|                     "description": "/ The language of this stream (as a ISO-639-2 language code)",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "mimeCodec": {
 | |
|                     "description": "/ The codec of this stream (defined as the RFC 6381).",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "title": {
 | |
|                     "description": "/ The title of the stream.",
 | |
|                     "type": "string"
 | |
|                 },
 | |
|                 "width": {
 | |
|                     "description": "/ The width of the video stream",
 | |
|                     "type": "integer"
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     },
 | |
|     "securityDefinitions": {
 | |
|         "Jwt": {
 | |
|             "type": "apiKey",
 | |
|             "name": "Authorization",
 | |
|             "in": "header"
 | |
|         },
 | |
|         "Token": {
 | |
|             "type": "apiKey",
 | |
|             "name": "Authorization",
 | |
|             "in": "header"
 | |
|         }
 | |
|     }
 | |
| } |