mirror of
https://code.castopod.org/adaures/castopod
synced 2025-04-22 16:51:20 +00:00
688 lines
18 KiB
JSON
688 lines
18 KiB
JSON
{
|
|
"openapi": "3.0.0",
|
|
"info": {
|
|
"version": "1.0.0",
|
|
"title": "Castopod podcasts"
|
|
},
|
|
"paths": {
|
|
"/api/rest/v1/podcasts": {
|
|
"get": {
|
|
"summary": "List all podcasts",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Object of podcasts",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Podcasts"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"default": {
|
|
"description": "unexpected error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Error"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/rest/v1/podcasts/{id}": {
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "The id of the podcast to retrieve",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
}
|
|
}
|
|
],
|
|
"get": {
|
|
"summary": "Info for a specific podcast",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Expected response to a valid request",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Podcast"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"default": {
|
|
"description": "unexpected error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Error"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/rest/v1/episodes": {
|
|
"get": {
|
|
"summary": "List all episodes",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Object of episodes",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Episodes"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"default": {
|
|
"description": "Unexpected error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Error"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"summary": "Create a new episode",
|
|
"requestBody": {
|
|
"description": "Episode object that needs to be added",
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/EpisodeCreateRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Episode created successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Episode"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"default": {
|
|
"description": "Unexpected error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Error"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/rest/v1/episodes/{id}": {
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "The id of the episode to retrieve",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
}
|
|
}
|
|
],
|
|
"get": {
|
|
"summary": "Info for a specific episode",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Expected response to a valid request",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Episode"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"default": {
|
|
"description": "Unexpected error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Error"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/rest/v1/episodes/{id}/publish": {
|
|
"post": {
|
|
"summary": "Publish an episode",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "The id of the episode to publish",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"description": "Publish parameters",
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/EpisodePublishRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Episode published successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Episode"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"default": {
|
|
"description": "unexpected error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Error"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"Podcast": {
|
|
"type": "object",
|
|
"required": [
|
|
"id",
|
|
"guid",
|
|
"actor_id",
|
|
"handle",
|
|
"title",
|
|
"description_markdown",
|
|
"description_html",
|
|
"cover_id",
|
|
"language_code",
|
|
"category_id",
|
|
"owner_name",
|
|
"owner_email",
|
|
"type",
|
|
"is_blocked",
|
|
"is_completed",
|
|
"is_locked",
|
|
"is_published_on_hubs",
|
|
"created_by",
|
|
"updated_by",
|
|
"created_at",
|
|
"updated_at",
|
|
"feed_url"
|
|
],
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
},
|
|
"guid": {
|
|
"type": "string",
|
|
"maxLength": 36
|
|
},
|
|
"actor_id": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
},
|
|
"handle": {
|
|
"type": "string",
|
|
"maxLength": 32
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"maxLength": 128
|
|
},
|
|
"description_markdown": {
|
|
"type": "string"
|
|
},
|
|
"description_html": {
|
|
"type": "string"
|
|
},
|
|
"cover_id": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
},
|
|
"banner_id": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
},
|
|
"language_code": {
|
|
"type": "string",
|
|
"maxLength": 2
|
|
},
|
|
"category_id": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1
|
|
},
|
|
"parental_advisory": {
|
|
"type": "string",
|
|
"enum": ["clean", "explicit"]
|
|
},
|
|
"owner_name": {
|
|
"type": "string",
|
|
"maxLength": 128
|
|
},
|
|
"owner_email": {
|
|
"type": "string",
|
|
"maxLength": 255
|
|
},
|
|
"publisher": {
|
|
"type": "string",
|
|
"maxLength": 128
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["episodic", "serial"]
|
|
},
|
|
"copyright": {
|
|
"type": "string",
|
|
"maxLength": 128
|
|
},
|
|
"episode_description_footer_markdown": {
|
|
"type": "string"
|
|
},
|
|
"episode_description_footer_html": {
|
|
"type": "string"
|
|
},
|
|
"is_blocked": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"enum": [0, 1],
|
|
"minLength": 1
|
|
},
|
|
"is_completed": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"enum": [0, 1],
|
|
"minLength": 1
|
|
},
|
|
"is_locked": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"enum": [0, 1],
|
|
"minLength": 1
|
|
},
|
|
"imported_feed_url": {
|
|
"type": "string",
|
|
"maxLength": 512
|
|
},
|
|
"new_feed_url": {
|
|
"type": "string",
|
|
"maxLength": 512
|
|
},
|
|
"payment_pointer": {
|
|
"type": "string",
|
|
"maxLength": 128
|
|
},
|
|
"location_name": {
|
|
"type": "string",
|
|
"maxLength": 128
|
|
},
|
|
"location_geo": {
|
|
"type": "string",
|
|
"maxLength": 32
|
|
},
|
|
"location_osm": {
|
|
"type": "string",
|
|
"maxLength": 12
|
|
},
|
|
"custom_rss": {
|
|
"type": "string"
|
|
},
|
|
"is_published_on_hubs": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"enum": [0, 1],
|
|
"minLength": 1
|
|
},
|
|
"partner_id": {
|
|
"type": "string",
|
|
"maxLength": 32
|
|
},
|
|
"partner_link_url": {
|
|
"type": "string",
|
|
"maxLength": 512
|
|
},
|
|
"partner_image_url": {
|
|
"type": "string",
|
|
"maxLength": 512
|
|
},
|
|
"created_by": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
},
|
|
"updated_by": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"minimum": 1,
|
|
"maxLength": 10
|
|
},
|
|
"created_at": {
|
|
"type": "object",
|
|
"properties": {
|
|
"date": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"timezone_type": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"timezone": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"updated_at": {
|
|
"type": "object",
|
|
"properties": {
|
|
"date": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"timezone_type": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"timezone": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"feed_url": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"Podcasts": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Podcast"
|
|
}
|
|
},
|
|
"Episode": {
|
|
"type": "object",
|
|
"required": [
|
|
"id",
|
|
"title",
|
|
"slug",
|
|
"podcast_id",
|
|
"created_by",
|
|
"updated_by",
|
|
"created_at",
|
|
"updated_at"
|
|
],
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"slug": {
|
|
"type": "string"
|
|
},
|
|
"podcast_id": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"description_markdown": {
|
|
"type": "string"
|
|
},
|
|
"description_html": {
|
|
"type": "string"
|
|
},
|
|
"audio_url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"cover_url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"duration": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"published_at": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"created_by": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"updated_by": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
}
|
|
},
|
|
"Episodes": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Episode"
|
|
}
|
|
},
|
|
"EpisodeCreateRequest": {
|
|
"type": "object",
|
|
"required": [
|
|
"user_id",
|
|
"updated_by",
|
|
"title",
|
|
"slug",
|
|
"podcast_id",
|
|
"audio_file"
|
|
],
|
|
"properties": {
|
|
"user_id": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"description": "ID of the user creating the episode"
|
|
},
|
|
"updated_by": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"description": "ID of the user updating the episode"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Title of the episode"
|
|
},
|
|
"slug": {
|
|
"type": "string",
|
|
"description": "URL-friendly slug of the episode"
|
|
},
|
|
"podcast_id": {
|
|
"type": "integer",
|
|
"format": "int64",
|
|
"description": "ID of the podcast the episode belongs to"
|
|
},
|
|
"audio_file": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "Audio file for the episode"
|
|
},
|
|
"cover": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "Cover image for the episode"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Description of the episode"
|
|
},
|
|
"location_name": {
|
|
"type": "string",
|
|
"description": "Location associated with the episode"
|
|
},
|
|
"parental_advisory": {
|
|
"type": "string",
|
|
"enum": ["clean", "explicit"],
|
|
"description": "Parental advisory rating"
|
|
},
|
|
"episode_number": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"description": "Episode number (for serial podcasts)"
|
|
},
|
|
"season_number": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"description": "Season number (for serial podcasts)"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["full", "trailer", "bonus"],
|
|
"description": "Type of episode"
|
|
},
|
|
"block": {
|
|
"type": "string",
|
|
"enum": ["yes", "no"],
|
|
"description": "Block episode from being published"
|
|
},
|
|
"custom_rss": {
|
|
"type": "string",
|
|
"description": "Custom RSS content"
|
|
},
|
|
"premium": {
|
|
"type": "string",
|
|
"enum": ["yes", "no"],
|
|
"description": "Mark episode as premium content"
|
|
},
|
|
"transcript-choice": {
|
|
"type": "string",
|
|
"enum": ["upload-file", "remote-url"],
|
|
"description": "Transcript source choice"
|
|
},
|
|
"transcript_file": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "Transcript file"
|
|
},
|
|
"transcript_remote_url": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "Remote URL for transcript"
|
|
},
|
|
"chapters-choice": {
|
|
"type": "string",
|
|
"enum": ["upload-file", "remote-url"],
|
|
"description": "Chapters source choice"
|
|
},
|
|
"chapters_file": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "Chapters file"
|
|
},
|
|
"chapters_remote_url": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "Remote URL for chapters"
|
|
}
|
|
}
|
|
},
|
|
"EpisodePublishRequest": {
|
|
"type": "object",
|
|
"required": ["publication_method"],
|
|
"properties": {
|
|
"publication_method": {
|
|
"type": "string",
|
|
"enum": ["now", "schedule", "with_podcast"],
|
|
"description": "Method of publication"
|
|
},
|
|
"scheduled_publication_date": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "Scheduled date and time for publication"
|
|
},
|
|
"client_timezone": {
|
|
"type": "string",
|
|
"description": "Timezone of the client"
|
|
}
|
|
}
|
|
},
|
|
"Error": {
|
|
"type": "object",
|
|
"properties": {
|
|
"status": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"error": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"messages": {
|
|
"type": "object",
|
|
"properties": {
|
|
"error": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|