7233 lines
140 KiB
JSON
7233 lines
140 KiB
JSON
{
|
|
"openapi": "3.1.0",
|
|
"info": {
|
|
"title": "ScoreFX API Engine",
|
|
"version": "0.1.0"
|
|
},
|
|
"paths": {
|
|
"/api/v1/audio/upload": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Upload Audio",
|
|
"operationId": "upload_audio_api_v1_audio_upload_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Body_upload_audio_api_v1_audio_upload_post"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/edit": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Edit Audio",
|
|
"operationId": "edit_audio_api_v1_audio_edit_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/EditRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/download/{file_id}": {
|
|
"get": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Download Audio",
|
|
"operationId": "download_audio_api_v1_audio_download__file_id__get",
|
|
"parameters": [
|
|
{
|
|
"name": "file_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "File Id"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/waveform/{file_id}": {
|
|
"get": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Get Waveform",
|
|
"description": "API endpoint vẽ Peak Waveform đồng bộ (Week 2).\nTrả về dữ liệu peak waveform cho hiển thị đồ thị sóng âm trên Frontend.",
|
|
"operationId": "get_waveform_api_v1_audio_waveform__file_id__get",
|
|
"parameters": [
|
|
{
|
|
"name": "file_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "File Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "num_peaks",
|
|
"in": "query",
|
|
"required": false,
|
|
"schema": {
|
|
"type": "integer",
|
|
"maximum": 4000,
|
|
"minimum": 50,
|
|
"default": 800,
|
|
"title": "Num Peaks"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/waveform-rms/{file_id}": {
|
|
"get": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Get Waveform Rms",
|
|
"description": "API endpoint vẽ RMS Waveform (mượt hơn peak).",
|
|
"operationId": "get_waveform_rms_api_v1_audio_waveform_rms__file_id__get",
|
|
"parameters": [
|
|
{
|
|
"name": "file_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "File Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "num_points",
|
|
"in": "query",
|
|
"required": false,
|
|
"schema": {
|
|
"type": "integer",
|
|
"maximum": 4000,
|
|
"minimum": 50,
|
|
"default": 800,
|
|
"title": "Num Points"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/analyze-ai": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Analyze Audio With Ai",
|
|
"description": "API endpoint phân tích cấu trúc khuôn nhạc bằng AI (Week 4).\nGọi OpenAI Compatible API (DeepSeek/Ollama) để phân đoạn bố cục.",
|
|
"operationId": "analyze_audio_with_ai_api_v1_audio_analyze_ai_post",
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AIAnalysisRequest"
|
|
}
|
|
}
|
|
},
|
|
"required": true
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/export": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Export Audio",
|
|
"description": "API endpoint xuất tệp âm thanh sang nhiều định dạng (WAV/MP3/OGG).",
|
|
"operationId": "export_audio_api_v1_audio_export_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ExportRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/export/midi": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Export Midi",
|
|
"operationId": "export_midi_api_v1_audio_export_midi_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MidiExportRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/ai-scan": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Ai Scan Audio",
|
|
"description": "17_AI_SCAN.md Feature 1: AI Loop Scan & Automated Marker Labeling.\nUses AIDSPEngine to find optimal recurring loop region with zero-crossing alignment.",
|
|
"operationId": "ai_scan_audio_api_v1_audio_ai_scan_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AIScanRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/ai-cut": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Ai Cut Audio",
|
|
"description": "17_AI_SCAN.md Feature 2: Fade-Free AI Cut (Zero-Crossing Aligned Slicing).\nExecutes raw binary sample slice at exact zero-crossing coordinates.",
|
|
"operationId": "ai_cut_audio_api_v1_audio_ai_cut_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AICutRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/python-tool": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Run Python Dsp Tool",
|
|
"description": "Non-AI Python DSP Tools endpoint.\nHandles normalize peak, invert phase, swap channels, zero-crossing align, and synth wave generation.",
|
|
"operationId": "run_python_dsp_tool_api_v1_audio_python_tool_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/PythonToolRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/my-files": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "List User Files",
|
|
"operationId": "list_user_files_api_v1_audio_my_files_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MyFilesRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/reference-analyze": {
|
|
"post": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Analyze Reference",
|
|
"description": "Gap 11: A/B reference track - analyze LUFS/dBTP/centroid of a\nreference file (local path from media/browse, or uploaded file_id),\nreturn compare metrics + playback url for the A/B toggle.",
|
|
"operationId": "analyze_reference_api_v1_audio_reference_analyze_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ReferenceAnalyzeRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/my-files/{file_id}": {
|
|
"delete": {
|
|
"tags": [
|
|
"audio"
|
|
],
|
|
"summary": "Delete User File",
|
|
"operationId": "delete_user_file_api_v1_audio_my_files__file_id__delete",
|
|
"parameters": [
|
|
{
|
|
"name": "file_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "File Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/audio/tasks/{task_id}": {
|
|
"get": {
|
|
"tags": [
|
|
"tasks"
|
|
],
|
|
"summary": "Get Task Status",
|
|
"operationId": "get_task_status_api_v1_audio_tasks__task_id__get",
|
|
"parameters": [
|
|
{
|
|
"name": "task_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Task Id"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/multitrack/mix": {
|
|
"post": {
|
|
"tags": [
|
|
"multitrack"
|
|
],
|
|
"summary": "Mix Multitrack Session",
|
|
"description": "API endpoint để xử lý hòa âm đa kênh (Multitrack Mixdown).\nNhận cấu hình JSON từ Client và gửi task xuống Celery Worker.",
|
|
"operationId": "mix_multitrack_session_api_v1_multitrack_mix_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MultitrackSessionRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/multitrack/process-session": {
|
|
"post": {
|
|
"tags": [
|
|
"multitrack"
|
|
],
|
|
"summary": "Process Session",
|
|
"description": "API endpoint để xử lý toàn bộ session với nhiều tracks và clips.\nXử lý từng clip, sau đó hòa âm tất cả tracks lại với nhau.",
|
|
"operationId": "process_session_api_v1_multitrack_process_session_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MultitrackSessionRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/auth/login": {
|
|
"post": {
|
|
"tags": [
|
|
"auth"
|
|
],
|
|
"summary": "Login",
|
|
"operationId": "login_api_v1_auth_login_post",
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LoginRequest"
|
|
}
|
|
}
|
|
},
|
|
"required": true
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/auth/local": {
|
|
"post": {
|
|
"tags": [
|
|
"auth"
|
|
],
|
|
"summary": "Local Login",
|
|
"description": "Auto-login standalone: chỉ cho phép từ loopback (máy chạy engine).\nClient LAN nhận 403 → buộc đăng nhập mật khẩu qua /login.",
|
|
"operationId": "local_login_api_v1_auth_local_post",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/auth/register": {
|
|
"post": {
|
|
"tags": [
|
|
"auth"
|
|
],
|
|
"summary": "Register",
|
|
"operationId": "register_api_v1_auth_register_post",
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RegisterRequest"
|
|
}
|
|
}
|
|
},
|
|
"required": true
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/auth/change-password": {
|
|
"post": {
|
|
"tags": [
|
|
"auth"
|
|
],
|
|
"summary": "Change Password",
|
|
"operationId": "change_password_api_v1_auth_change_password_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChangePasswordRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/auth/profile": {
|
|
"get": {
|
|
"tags": [
|
|
"auth"
|
|
],
|
|
"summary": "Get Profile",
|
|
"operationId": "get_profile_api_v1_auth_profile_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/auth/first-time": {
|
|
"get": {
|
|
"tags": [
|
|
"auth"
|
|
],
|
|
"summary": "Auth First Time",
|
|
"operationId": "auth_first_time_api_v1_auth_first_time_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/admin/users": {
|
|
"get": {
|
|
"tags": [
|
|
"admin"
|
|
],
|
|
"summary": "List Users",
|
|
"operationId": "list_users_api_v1_admin_users_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"admin"
|
|
],
|
|
"summary": "Create User",
|
|
"operationId": "create_user_api_v1_admin_users_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateUserRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/admin/users/{user_id}/role": {
|
|
"put": {
|
|
"tags": [
|
|
"admin"
|
|
],
|
|
"summary": "Update User Role",
|
|
"operationId": "update_user_role_api_v1_admin_users__user_id__role_put",
|
|
"parameters": [
|
|
{
|
|
"name": "user_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "User Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateUserRoleRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/admin/quotas/{user_id}": {
|
|
"put": {
|
|
"tags": [
|
|
"admin"
|
|
],
|
|
"summary": "Update User Quota",
|
|
"operationId": "update_user_quota_api_v1_admin_quotas__user_id__put",
|
|
"parameters": [
|
|
{
|
|
"name": "user_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "User Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateUserQuotaRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/admin/users/{user_id}": {
|
|
"delete": {
|
|
"tags": [
|
|
"admin"
|
|
],
|
|
"summary": "Delete User",
|
|
"operationId": "delete_user_api_v1_admin_users__user_id__delete",
|
|
"parameters": [
|
|
{
|
|
"name": "user_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "User Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/temp": {
|
|
"post": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Save Temp Project",
|
|
"operationId": "save_temp_project_api_v1_projects_temp_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SaveTempProjectRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"get": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Get Temp Project",
|
|
"operationId": "get_temp_project_api_v1_projects_temp_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/temp/revision": {
|
|
"get": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Temp Project Revision",
|
|
"description": "Revision nhẹ của bản temp: updated_at + client_id — frontend poll 2-3s\nđể realtime sync giữa LAN browser và Tauri standalone (không tải full\ndata_json mỗi lần). client_id = client ghi bản cuối → client khác bỏ qua\nbản do CHÍNH NÓ ghi (chống ping-pong).",
|
|
"operationId": "temp_project_revision_api_v1_projects_temp_revision_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/save-to-disk": {
|
|
"post": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Save Project To Disk",
|
|
"description": "Ctrl-S trên desktop: lưu project ra THƯ MỤC CỦA HỆ ĐIỀU HÀNH\n(Documents/SonicForgeDAW/Projects — bản desktop). Docker/headless KHÔNG\ndùng endpoint này (frontend lưu Cloud). Auth optional — desktop có thể\nchưa login.",
|
|
"operationId": "save_project_to_disk_api_v1_projects_save_to_disk_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SaveProjectRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/disk": {
|
|
"get": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "List Disk Projects",
|
|
"description": "Danh sách file Ctrl-S desktop (Documents/SonicForgeDAW/Projects),\nmới nhất trước. Auth optional.",
|
|
"operationId": "list_disk_projects_api_v1_projects_disk_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/disk/{filename}": {
|
|
"get": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Get Disk Project",
|
|
"description": "Đọc nội dung 1 file dự án trên đĩa (mở lại sau khi restart).",
|
|
"operationId": "get_disk_project_api_v1_projects_disk__filename__get",
|
|
"parameters": [
|
|
{
|
|
"name": "filename",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Filename"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/cloud": {
|
|
"post": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Save Cloud Project",
|
|
"operationId": "save_cloud_project_api_v1_projects_cloud_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SaveProjectRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"get": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "List Cloud Projects",
|
|
"operationId": "list_cloud_projects_api_v1_projects_cloud_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/cloud/{project_id}": {
|
|
"get": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Get Cloud Project",
|
|
"operationId": "get_cloud_project_api_v1_projects_cloud__project_id__get",
|
|
"parameters": [
|
|
{
|
|
"name": "project_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Project Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Delete Cloud Project",
|
|
"operationId": "delete_cloud_project_api_v1_projects_cloud__project_id__delete",
|
|
"parameters": [
|
|
{
|
|
"name": "project_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Project Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"put": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Update Cloud Project",
|
|
"operationId": "update_cloud_project_api_v1_projects_cloud__project_id__put",
|
|
"parameters": [
|
|
{
|
|
"name": "project_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Project Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SaveProjectRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/cloud/{project_id}/backup": {
|
|
"post": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Create Project Backup",
|
|
"operationId": "create_project_backup_api_v1_projects_cloud__project_id__backup_post",
|
|
"parameters": [
|
|
{
|
|
"name": "project_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Project Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/cloud/{project_id}/backups": {
|
|
"get": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "List Project Backups",
|
|
"operationId": "list_project_backups_api_v1_projects_cloud__project_id__backups_get",
|
|
"parameters": [
|
|
{
|
|
"name": "project_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Project Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/cloud/backups/{backup_id}": {
|
|
"delete": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Delete Project Backup",
|
|
"operationId": "delete_project_backup_api_v1_projects_cloud_backups__backup_id__delete",
|
|
"parameters": [
|
|
{
|
|
"name": "backup_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Backup Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/cloud/backups/cleanup": {
|
|
"post": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Cleanup All Backups",
|
|
"operationId": "cleanup_all_backups_api_v1_projects_cloud_backups_cleanup_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CleanupBackupsRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/projects/cloud/{project_id}/render": {
|
|
"post": {
|
|
"tags": [
|
|
"projects"
|
|
],
|
|
"summary": "Render Project Endpoint",
|
|
"operationId": "render_project_endpoint_api_v1_projects_cloud__project_id__render_post",
|
|
"parameters": [
|
|
{
|
|
"name": "project_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Project Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RenderProjectRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/user/preferences": {
|
|
"get": {
|
|
"tags": [
|
|
"user_config"
|
|
],
|
|
"summary": "Get User Preferences",
|
|
"operationId": "get_user_preferences_api_v1_user_preferences_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"user_config"
|
|
],
|
|
"summary": "Save User Preferences",
|
|
"operationId": "save_user_preferences_api_v1_user_preferences_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SavePreferencesRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/user/config/ai": {
|
|
"get": {
|
|
"tags": [
|
|
"user_config"
|
|
],
|
|
"summary": "Get User Ai Config",
|
|
"operationId": "get_user_ai_config_api_v1_user_config_ai_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"user_config"
|
|
],
|
|
"summary": "Save User Ai Config",
|
|
"operationId": "save_user_ai_config_api_v1_user_config_ai_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SaveAIConfigRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/ai/proxy": {
|
|
"post": {
|
|
"tags": [
|
|
"ai"
|
|
],
|
|
"summary": "Proxy Llm",
|
|
"operationId": "proxy_llm_api_v1_ai_proxy_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProxyRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/ai/presets": {
|
|
"get": {
|
|
"tags": [
|
|
"ai"
|
|
],
|
|
"summary": "List Presets",
|
|
"operationId": "list_presets_api_v1_ai_presets_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"ai"
|
|
],
|
|
"summary": "Save Preset",
|
|
"operationId": "save_preset_api_v1_ai_presets_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AIPresetSchema"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/ai/presets/{preset_id}": {
|
|
"delete": {
|
|
"tags": [
|
|
"ai"
|
|
],
|
|
"summary": "Delete Preset",
|
|
"operationId": "delete_preset_api_v1_ai_presets__preset_id__delete",
|
|
"parameters": [
|
|
{
|
|
"name": "preset_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Preset Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/dirs": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Get Plugin Dirs",
|
|
"operationId": "get_plugin_dirs_api_v1_plugins_dirs_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Save Plugin Dirs",
|
|
"operationId": "save_plugin_dirs_api_v1_plugins_dirs_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DirsRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/scan": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Scan Plugin Dirs",
|
|
"description": "Scan các dir hiệu lực (env + user override): cập nhật catalog\nsoundfont (inspector/scanner) + liệt kê VST. Trả về danh sách riêng rẽ\nVST (vst_found) + SoundFont (soundfonts) theo từng thư mục user khai báo.",
|
|
"operationId": "scan_plugin_dirs_api_v1_plugins_scan_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/available": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "List Plugins",
|
|
"operationId": "list_plugins_api_v1_plugins_available_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/pick-dir": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Pick Plugin Directory",
|
|
"description": "Mở NATIVE folder picker. Không cần auth (desktop local, chỉ mở dialog).\nTrả {\"path\": \"<thư mục>\"} hoặc {\"path\": None} (hủy/không có dialog).\nĐịnh nghĩa def (sync) → FastAPI chạy trong threadpool — không block loop\ntrong lúc user chọn thư mục (có thể mất phút).",
|
|
"operationId": "pick_plugin_directory_api_v1_plugins_pick_dir_post",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/default-soundfonts": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "List Default Soundfonts",
|
|
"operationId": "list_default_soundfonts_api_v1_plugins_default_soundfonts_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/soundfonts/catalog": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Soundfont Catalog",
|
|
"operationId": "soundfont_catalog_api_v1_plugins_soundfonts_catalog_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/soundfont-instruments/{sf_id}": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "List Soundfont Instruments",
|
|
"operationId": "list_soundfont_instruments_api_v1_plugins_soundfont_instruments__sf_id__get",
|
|
"parameters": [
|
|
{
|
|
"name": "sf_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Sf Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/upload-soundfont": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Upload Soundfont",
|
|
"operationId": "upload_soundfont_api_v1_plugins_upload_soundfont_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Body_upload_soundfont_api_v1_plugins_upload_soundfont_post"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/soundfont/{sf_id}": {
|
|
"delete": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Delete Soundfont",
|
|
"operationId": "delete_soundfont_api_v1_plugins_soundfont__sf_id__delete",
|
|
"parameters": [
|
|
{
|
|
"name": "sf_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Sf Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/soundfonts/download/{sf_id}": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Download Soundfont Asset",
|
|
"operationId": "download_soundfont_asset_api_v1_plugins_soundfonts_download__sf_id__get",
|
|
"parameters": [
|
|
{
|
|
"name": "sf_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Sf Id"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-gui": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Open Fx Gui",
|
|
"description": "Mở native GUI của VST FX (mastering chain / FX rack) qua bridge.\n\nBridge có mode `--open-fx-gui <job.json>` (Windows): spawn tiến trình riêng\ngiữ vòng lặp message pump, tạo window 800x600 + attach IPlugView của plugin.\nĐây là GUI tách rời — user chỉnh thông số, đóng window là bridge thoát\n(exit 0). Không spawn 2 lần cho cùng plugin đang mở (tránh trùng GUI).",
|
|
"operationId": "open_fx_gui_api_v1_plugins_fx_gui_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxGuiRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-gui/close": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Close Fx Gui",
|
|
"description": "Đóng bridge fx-gui đang chạy cho plugin (embed mode) — frontend gọi khi\nuser đóng panel embed. Không lỗi nếu plugin chưa mở (closed=False).",
|
|
"operationId": "close_fx_gui_api_v1_plugins_fx_gui_close_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxGuiCloseRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-gui/hide": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Hide Fx Gui",
|
|
"description": "Ẩn GUI native (ed.hide — giữ editor + instance, mở lại nhanh). Chỉ\náp dụng editor in-process fxrt; GUI spawn mode (HTTP bridge) tự có /hide\nriêng — trả applied=False không lỗi.",
|
|
"operationId": "hide_fx_gui_api_v1_plugins_fx_gui_hide_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxGuiNativeRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-gui/show": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Show Fx Gui",
|
|
"description": "Hiện lại GUI native (ed.show).",
|
|
"operationId": "show_fx_gui_api_v1_plugins_fx_gui_show_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxGuiNativeRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-gui/rect": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Fx Gui Rect",
|
|
"description": "M7: anchor PluginWindow native vào rect panel embed (SetWindowPos phía\nC++ khi rect đổi — mirror FxGuiServer /show của float/embed). Frontend đo\nrect panel mỗi 250ms và gửi; chỉ áp dụng editor in-process fxrt — GUI spawn\nmode (HTTP bridge) tự có /show riêng, trả applied=False không lỗi.",
|
|
"operationId": "fx_gui_rect_api_v1_plugins_fx_gui_rect_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxGuiRectRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/preview": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Preview Instrument",
|
|
"description": "Quick-render preview VSTi (âm thật, cùng code path với export).",
|
|
"operationId": "preview_instrument_api_v1_plugins_preview_post",
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/PreviewRequest"
|
|
}
|
|
}
|
|
},
|
|
"required": true
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/midi-render": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Midi Render",
|
|
"description": "Export MIDI notes → WAV với âm của VSTi instrument (lưu vào processed).\n\nPreview/export MIDI notes với âm VSTi trước đây KHÔNG thực hiện được:\n- preview realtime chỉ phát qua loa hệ thống (không vào audio graph DAW)\n- clientSideExport chỉ render soundfont (midiCache = FluidSynth WASM)\n- /plugins/preview có sẵn nhưng frontend không gọi\nEndpoint này render offline bằng pedalboard (đúng plugin + preset như\nexport) → trả file_id để UI preview / gán clip vào project / download.",
|
|
"operationId": "midi_render_api_v1_plugins_midi_render_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MidiRenderRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "List Fx Plugins",
|
|
"description": "List VST effect plugins (is_fx) — native_bridge --scan trên các dir.\n\nChỉ plugin VST3 effect (Ozone, Scaler Audio, ...); instrument/VST2 bị\nbridge loại. refresh=true → quét lại (Plugins Manager → Scan).",
|
|
"operationId": "list_fx_plugins_api_v1_plugins_fx_get",
|
|
"parameters": [
|
|
{
|
|
"name": "refresh",
|
|
"in": "query",
|
|
"required": false,
|
|
"schema": {
|
|
"type": "boolean",
|
|
"default": false,
|
|
"title": "Refresh"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-render": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Fx Render",
|
|
"description": "Áp fx_chain lên WAV đầu vào → WAV mới trong PROCESSED_DIR.",
|
|
"operationId": "fx_render_api_v1_plugins_fx_render_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxRenderRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-realtime/start": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Fx Realtime Start",
|
|
"description": "Start bridge realtime FX loop + SHM. Client mở WS /ws/fx-realtime/{id}\n(token qua query param 'token' hoặc Authorization Bearer) rồi gửi block\nstereo float32 interleaved (block_size*2 float = 2048B), nhận block đã xử lý.",
|
|
"operationId": "fx_realtime_start_api_v1_plugins_fx_realtime_start_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxRealtimeStartRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-realtime/stop": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Fx Realtime Stop",
|
|
"description": "Dừng session realtime (running=0 → bridge thoát, SHM unlink).",
|
|
"operationId": "fx_realtime_stop_api_v1_plugins_fx_realtime_stop_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxRealtimeStopRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/fx-realtime/set-chain": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Fx Realtime Set Chain",
|
|
"description": "Cập nhật chain trên session realtime ĐANG CHẠY — KHÔNG restart session.\nEngine ghi lại job file (seq++); bridge poll seq → RealtimeFxChain::setChain\n(worker load chain mới, swap atomic dưới mutex — audio thread copy\nshared_ptr, không dừng) → load/đổi VST FX + đổi preset GUI không ngắt âm/\ncrackle. Session/WS/SHM giữ nguyên.",
|
|
"operationId": "fx_realtime_set_chain_api_v1_plugins_fx_realtime_set_chain_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FxRealtimeSetChainRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/soundfont-render": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Soundfont Render",
|
|
"description": "Preview/play MIDI notes bằng âm soundfont thật — native FluidSynth trên OS.\n\nKhác FluidSynthWASM (docker): âm render server-side bằng pyfluidsynth, trả\nWAV để client play. Dùng cho: preview/keyboard, play MIDI item khi chạy\ntransport ở môi trường standalone.",
|
|
"operationId": "soundfont_render_api_v1_plugins_soundfont_render_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SoundfontRenderRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/render": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Render Project",
|
|
"operationId": "render_project_api_v1_plugins_render_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RenderRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/bridge/status": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Bridge Status",
|
|
"description": "E1: trạng thái native bridge. Rust ghi bridge_status (JSON) khi spawn/\nhealth-check; nếu chưa có → probe tail bridge.log (dòng started/exists).",
|
|
"operationId": "bridge_status_api_v1_plugins_bridge_status_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/bridge/load": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Bridge Load",
|
|
"description": "E2: resolve path thật của asset rồi (a) ghi bridge_load.request cho Rust\nwatcher (nếu có) và (b) trả path để JS gọi invoke load_native_instrument\ntrực tiếp — pipeline hoạt động ngay, không chờ watcher.",
|
|
"operationId": "bridge_load_api_v1_plugins_bridge_load_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BridgeLoadRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/bridge/log": {
|
|
"get": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Bridge Log",
|
|
"description": "E5: tail bridge.log cho UI debug. Log Rust ghi tại %APPDATA%/SonicForgeDAW/logs/bridge.log.",
|
|
"operationId": "bridge_log_api_v1_plugins_bridge_log_get",
|
|
"parameters": [
|
|
{
|
|
"name": "lines",
|
|
"in": "query",
|
|
"required": false,
|
|
"schema": {
|
|
"type": "integer",
|
|
"maximum": 2000,
|
|
"minimum": 1,
|
|
"default": 100,
|
|
"title": "Lines"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/plugins/bridge/gui": {
|
|
"post": {
|
|
"tags": [
|
|
"plugins"
|
|
],
|
|
"summary": "Bridge Gui",
|
|
"description": "E6: mở native GUI VSTi trên máy chạy server — fallback cho browser LAN\nkhông có Tauri. Pipeline giống invoke open_vst_gui: LOAD_INSTRUMENT rồi\nOPEN_GUI qua SHM daw_vst_bridge.",
|
|
"operationId": "bridge_gui_api_v1_plugins_bridge_gui_post",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BridgeGuiRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/files/save-dialog": {
|
|
"post": {
|
|
"tags": [
|
|
"files"
|
|
],
|
|
"summary": "Save File Dialog",
|
|
"description": "Mở NATIVE Save As dialog. Không cần auth (desktop local, chỉ mở dialog).\nTrả {\"path\": \"<đường dẫn user chọn>\"} hoặc {\"path\": None} (hủy/không có\ndialog). def (sync) → FastAPI chạy threadpool — không block loop.",
|
|
"operationId": "save_file_dialog_api_v1_files_save_dialog_post",
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SaveDialogRequest"
|
|
}
|
|
}
|
|
},
|
|
"required": true
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/files/write": {
|
|
"post": {
|
|
"tags": [
|
|
"files"
|
|
],
|
|
"summary": "Write Export File",
|
|
"description": "Ghi bytes đã export vào đường dẫn tuyệt đối user chọn qua save dialog.\nTrả {\"path\": ..., \"bytes\": N} — frontend toast kèm đường dẫn thật.",
|
|
"operationId": "write_export_file_api_v1_files_write_post",
|
|
"requestBody": {
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Body_write_export_file_api_v1_files_write_post"
|
|
}
|
|
}
|
|
},
|
|
"required": true
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/media/computer": {
|
|
"get": {
|
|
"tags": [
|
|
"media"
|
|
],
|
|
"summary": "List Computer Roots",
|
|
"description": "Liệt kê các ổ đĩa / mount point thật của máy (My Computer).",
|
|
"operationId": "list_computer_roots_api_v1_media_computer_get",
|
|
"parameters": [
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/media/browse": {
|
|
"get": {
|
|
"tags": [
|
|
"media"
|
|
],
|
|
"summary": "Browse Directory",
|
|
"description": "Liệt kê nội dung một thư mục trên máy: thư mục con + file audio/MIDI.",
|
|
"operationId": "browse_directory_api_v1_media_browse_get",
|
|
"parameters": [
|
|
{
|
|
"name": "path",
|
|
"in": "query",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Path"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/media/file": {
|
|
"get": {
|
|
"tags": [
|
|
"media"
|
|
],
|
|
"summary": "Serve Local File",
|
|
"description": "Phục vụ file audio/MIDI cục bộ để preview.",
|
|
"operationId": "serve_local_file_api_v1_media_file_get",
|
|
"parameters": [
|
|
{
|
|
"name": "path",
|
|
"in": "query",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Path"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/system/capabilities": {
|
|
"get": {
|
|
"tags": [
|
|
"system"
|
|
],
|
|
"summary": "Get Capabilities",
|
|
"description": "Khả năng của môi trường hiện tại (public — cần trước khi đăng nhập).\n\n- runtime: \"desktop\" (server + client cùng 1 máy Windows/macOS) |\n \"headless\" (docker server + browser UI)\n- features.preset_upload: luôn True (upload .vstpreset qua web UI)\n- features.preview_mode: \"quick_render\" (pedalboard render clip ngắn —\n âm thật giống export) | \"wasm\" (Preview Synth trong browser)",
|
|
"operationId": "get_capabilities_api_v1_system_capabilities_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/presets": {
|
|
"get": {
|
|
"tags": [
|
|
"presets"
|
|
],
|
|
"summary": "List Presets",
|
|
"description": "Danh sách preset trong thư viện (public — frontend cần trước login).",
|
|
"operationId": "list_presets_api_v1_presets_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/presets/upload": {
|
|
"post": {
|
|
"tags": [
|
|
"presets"
|
|
],
|
|
"summary": "Upload Preset",
|
|
"description": "Upload preset (.vstpreset / .fxp / .fxb / .dspreset) vào thư viện.",
|
|
"operationId": "upload_preset_api_v1_presets_upload_post",
|
|
"parameters": [
|
|
{
|
|
"name": "plugin_hint",
|
|
"in": "query",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Plugin Hint"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/Body_upload_preset_api_v1_presets_upload_post"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/presets/{preset_id}/download": {
|
|
"get": {
|
|
"tags": [
|
|
"presets"
|
|
],
|
|
"summary": "Download Preset",
|
|
"operationId": "download_preset_api_v1_presets__preset_id__download_get",
|
|
"parameters": [
|
|
{
|
|
"name": "preset_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Preset Id"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v1/presets/{preset_id}": {
|
|
"delete": {
|
|
"tags": [
|
|
"presets"
|
|
],
|
|
"summary": "Delete Preset",
|
|
"operationId": "delete_preset_api_v1_presets__preset_id__delete",
|
|
"parameters": [
|
|
{
|
|
"name": "preset_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string",
|
|
"title": "Preset Id"
|
|
}
|
|
},
|
|
{
|
|
"name": "authorization",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Authorization"
|
|
}
|
|
},
|
|
{
|
|
"name": "x-auth-token",
|
|
"in": "header",
|
|
"required": false,
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "X-Auth-Token"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"description": "Validation Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HTTPValidationError"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/health": {
|
|
"get": {
|
|
"summary": "Health",
|
|
"operationId": "health_health_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/": {
|
|
"get": {
|
|
"summary": "Get Index",
|
|
"operationId": "get_index__get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"text/html": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/favicon.svg": {
|
|
"get": {
|
|
"summary": "Get Favicon",
|
|
"operationId": "get_favicon_favicon_svg_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/ai-prompt-generator": {
|
|
"get": {
|
|
"summary": "Get Ai Prompt Generator",
|
|
"operationId": "get_ai_prompt_generator_ai_prompt_generator_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"text/html": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"AIAnalysisRequest": {
|
|
"properties": {
|
|
"file_id": {
|
|
"type": "string",
|
|
"title": "File Id"
|
|
},
|
|
"api_base_url": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Api Base Url"
|
|
},
|
|
"model": {
|
|
"type": "string",
|
|
"title": "Model",
|
|
"default": "deepseek-chat"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"file_id"
|
|
],
|
|
"title": "AIAnalysisRequest"
|
|
},
|
|
"AICutRequest": {
|
|
"properties": {
|
|
"source_track_id": {
|
|
"type": "string",
|
|
"title": "Source Track Id"
|
|
},
|
|
"file_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "File Id"
|
|
},
|
|
"selection_start": {
|
|
"type": "number",
|
|
"title": "Selection Start"
|
|
},
|
|
"selection_end": {
|
|
"type": "number",
|
|
"title": "Selection End"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"source_track_id",
|
|
"selection_start",
|
|
"selection_end"
|
|
],
|
|
"title": "AICutRequest"
|
|
},
|
|
"AIPresetSchema": {
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"title": "Id"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"title": "Name"
|
|
},
|
|
"keywords": {
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"type": "array",
|
|
"title": "Keywords"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"title": "Category",
|
|
"default": "General"
|
|
},
|
|
"default_bars": {
|
|
"type": "integer",
|
|
"title": "Default Bars",
|
|
"default": 8
|
|
},
|
|
"default_bpm": {
|
|
"type": "integer",
|
|
"title": "Default Bpm",
|
|
"default": 120
|
|
},
|
|
"default_scale": {
|
|
"type": "string",
|
|
"title": "Default Scale",
|
|
"default": "C Major"
|
|
},
|
|
"system_instruction_template": {
|
|
"type": "string",
|
|
"title": "System Instruction Template"
|
|
},
|
|
"is_user_defined": {
|
|
"type": "boolean",
|
|
"title": "Is User Defined",
|
|
"default": true
|
|
},
|
|
"is_favorite": {
|
|
"type": "boolean",
|
|
"title": "Is Favorite",
|
|
"default": false
|
|
},
|
|
"created_at": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Created At"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"id",
|
|
"name",
|
|
"keywords",
|
|
"system_instruction_template"
|
|
],
|
|
"title": "AIPresetSchema"
|
|
},
|
|
"AIProviderSetting": {
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"title": "Id"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"title": "Name"
|
|
},
|
|
"provider_type": {
|
|
"type": "string",
|
|
"title": "Provider Type"
|
|
},
|
|
"api_base_url": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Api Base Url",
|
|
"default": "https://api.openai.com/v1"
|
|
},
|
|
"api_key": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Api Key",
|
|
"default": ""
|
|
},
|
|
"model_name": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Model Name",
|
|
"default": "gpt-4o"
|
|
},
|
|
"temperature": {
|
|
"type": "number",
|
|
"title": "Temperature",
|
|
"default": 0.7
|
|
},
|
|
"is_active": {
|
|
"type": "boolean",
|
|
"title": "Is Active",
|
|
"default": true
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"id",
|
|
"name",
|
|
"provider_type"
|
|
],
|
|
"title": "AIProviderSetting"
|
|
},
|
|
"AIScanRequest": {
|
|
"properties": {
|
|
"track_id": {
|
|
"type": "string",
|
|
"title": "Track Id"
|
|
},
|
|
"file_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "File Id"
|
|
},
|
|
"min_loop_duration": {
|
|
"type": "number",
|
|
"title": "Min Loop Duration",
|
|
"default": 2.0
|
|
},
|
|
"max_loop_duration": {
|
|
"type": "number",
|
|
"title": "Max Loop Duration",
|
|
"default": 6.0
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"track_id"
|
|
],
|
|
"title": "AIScanRequest"
|
|
},
|
|
"Body_upload_audio_api_v1_audio_upload_post": {
|
|
"properties": {
|
|
"file": {
|
|
"type": "string",
|
|
"contentMediaType": "application/octet-stream",
|
|
"title": "File"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"file"
|
|
],
|
|
"title": "Body_upload_audio_api_v1_audio_upload_post"
|
|
},
|
|
"Body_upload_preset_api_v1_presets_upload_post": {
|
|
"properties": {
|
|
"file": {
|
|
"type": "string",
|
|
"contentMediaType": "application/octet-stream",
|
|
"title": "File"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"file"
|
|
],
|
|
"title": "Body_upload_preset_api_v1_presets_upload_post"
|
|
},
|
|
"Body_upload_soundfont_api_v1_plugins_upload_soundfont_post": {
|
|
"properties": {
|
|
"file": {
|
|
"type": "string",
|
|
"contentMediaType": "application/octet-stream",
|
|
"title": "File"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"file"
|
|
],
|
|
"title": "Body_upload_soundfont_api_v1_plugins_upload_soundfont_post"
|
|
},
|
|
"Body_write_export_file_api_v1_files_write_post": {
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"title": "Path"
|
|
},
|
|
"file": {
|
|
"type": "string",
|
|
"contentMediaType": "application/octet-stream",
|
|
"title": "File"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"path",
|
|
"file"
|
|
],
|
|
"title": "Body_write_export_file_api_v1_files_write_post"
|
|
},
|
|
"BridgeGuiRequest": {
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"title": "Name"
|
|
},
|
|
"path": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Path"
|
|
},
|
|
"instrumentType": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Instrumenttype"
|
|
},
|
|
"channel": {
|
|
"type": "integer",
|
|
"title": "Channel",
|
|
"default": 0
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"name"
|
|
],
|
|
"title": "BridgeGuiRequest"
|
|
},
|
|
"BridgeLoadRequest": {
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"title": "Name"
|
|
},
|
|
"path": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Path"
|
|
},
|
|
"instrumentType": {
|
|
"type": "string",
|
|
"title": "Instrumenttype",
|
|
"default": "SF2"
|
|
},
|
|
"channel": {
|
|
"anyOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Channel"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"name"
|
|
],
|
|
"title": "BridgeLoadRequest"
|
|
},
|
|
"ChangePasswordRequest": {
|
|
"properties": {
|
|
"old_password": {
|
|
"type": "string",
|
|
"title": "Old Password"
|
|
},
|
|
"new_password": {
|
|
"type": "string",
|
|
"title": "New Password"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"old_password",
|
|
"new_password"
|
|
],
|
|
"title": "ChangePasswordRequest"
|
|
},
|
|
"CleanupBackupsRequest": {
|
|
"properties": {
|
|
"keep": {
|
|
"type": "integer",
|
|
"title": "Keep",
|
|
"default": 10
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "CleanupBackupsRequest"
|
|
},
|
|
"ClipConfig": {
|
|
"properties": {
|
|
"clip_id": {
|
|
"type": "string",
|
|
"title": "Clip Id"
|
|
},
|
|
"start_time_seconds": {
|
|
"type": "number",
|
|
"title": "Start Time Seconds"
|
|
},
|
|
"end_time_seconds": {
|
|
"type": "number",
|
|
"title": "End Time Seconds"
|
|
},
|
|
"loop_count": {
|
|
"type": "integer",
|
|
"title": "Loop Count",
|
|
"default": 1
|
|
},
|
|
"apply_zero_crossing": {
|
|
"type": "boolean",
|
|
"title": "Apply Zero Crossing",
|
|
"default": true
|
|
},
|
|
"fade_in_ms": {
|
|
"type": "integer",
|
|
"title": "Fade In Ms",
|
|
"default": 150
|
|
},
|
|
"fade_out_ms": {
|
|
"type": "integer",
|
|
"title": "Fade Out Ms",
|
|
"default": 150
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"clip_id",
|
|
"start_time_seconds",
|
|
"end_time_seconds"
|
|
],
|
|
"title": "ClipConfig"
|
|
},
|
|
"CreateUserRequest": {
|
|
"properties": {
|
|
"username": {
|
|
"type": "string",
|
|
"title": "Username"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"title": "Email"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"title": "Password"
|
|
},
|
|
"role": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Role",
|
|
"default": "standard"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"username",
|
|
"email",
|
|
"password"
|
|
],
|
|
"title": "CreateUserRequest"
|
|
},
|
|
"DirsRequest": {
|
|
"properties": {
|
|
"vst_dir": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Vst Dir"
|
|
},
|
|
"soundfont_dir": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Soundfont Dir"
|
|
},
|
|
"plugin_dirs": {
|
|
"anyOf": [
|
|
{
|
|
"items": {},
|
|
"type": "array"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Plugin Dirs"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "DirsRequest"
|
|
},
|
|
"EditRequest": {
|
|
"properties": {
|
|
"file_id": {
|
|
"type": "string",
|
|
"title": "File Id"
|
|
},
|
|
"cut_start_ms": {
|
|
"anyOf": [
|
|
{
|
|
"type": "number"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Cut Start Ms"
|
|
},
|
|
"cut_end_ms": {
|
|
"anyOf": [
|
|
{
|
|
"type": "number"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Cut End Ms"
|
|
},
|
|
"zero_crossing_align": {
|
|
"type": "boolean",
|
|
"title": "Zero Crossing Align",
|
|
"default": true
|
|
},
|
|
"loop_count": {
|
|
"type": "integer",
|
|
"title": "Loop Count",
|
|
"default": 1
|
|
},
|
|
"fade_in_ms": {
|
|
"type": "number",
|
|
"title": "Fade In Ms",
|
|
"default": 0.0
|
|
},
|
|
"fade_out_ms": {
|
|
"type": "number",
|
|
"title": "Fade Out Ms",
|
|
"default": 0.0
|
|
},
|
|
"volume_change_db": {
|
|
"type": "number",
|
|
"title": "Volume Change Db",
|
|
"default": 0.0
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"file_id"
|
|
],
|
|
"title": "EditRequest"
|
|
},
|
|
"ExportRequest": {
|
|
"properties": {
|
|
"file_id": {
|
|
"type": "string",
|
|
"title": "File Id"
|
|
},
|
|
"format": {
|
|
"type": "string",
|
|
"title": "Format",
|
|
"default": "wav"
|
|
},
|
|
"sample_rate": {
|
|
"type": "integer",
|
|
"title": "Sample Rate",
|
|
"default": 44100
|
|
},
|
|
"bit_depth": {
|
|
"type": "integer",
|
|
"title": "Bit Depth",
|
|
"default": 16
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"file_id"
|
|
],
|
|
"title": "ExportRequest"
|
|
},
|
|
"ExportSettings": {
|
|
"properties": {
|
|
"sample_rate": {
|
|
"type": "integer",
|
|
"title": "Sample Rate",
|
|
"default": 44100
|
|
},
|
|
"bit_depth": {
|
|
"type": "integer",
|
|
"title": "Bit Depth",
|
|
"default": 16
|
|
},
|
|
"format": {
|
|
"type": "string",
|
|
"title": "Format",
|
|
"default": "wav"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "ExportSettings"
|
|
},
|
|
"FxGuiCloseRequest": {
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"title": "Path"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"path"
|
|
],
|
|
"title": "FxGuiCloseRequest",
|
|
"description": "Đóng bridge fx-gui đã mở cho plugin (embed mode)."
|
|
},
|
|
"FxGuiNativeRequest": {
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"title": "Path"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"path"
|
|
],
|
|
"title": "FxGuiNativeRequest",
|
|
"description": "Hide/Show GUI native (editor instance DSP trong session fxrt)."
|
|
},
|
|
"FxGuiRectBody": {
|
|
"properties": {
|
|
"x": {
|
|
"type": "integer",
|
|
"title": "X",
|
|
"default": 0
|
|
},
|
|
"y": {
|
|
"type": "integer",
|
|
"title": "Y",
|
|
"default": 0
|
|
},
|
|
"w": {
|
|
"type": "integer",
|
|
"title": "W",
|
|
"default": 0
|
|
},
|
|
"h": {
|
|
"type": "integer",
|
|
"title": "H",
|
|
"default": 0
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "FxGuiRectBody",
|
|
"description": "Rect màn hình (px vật lý, gốc trên-trái; x/y âm = màn hình trái)."
|
|
},
|
|
"FxGuiRectRequest": {
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"title": "Path"
|
|
},
|
|
"rect": {
|
|
"$ref": "#/components/schemas/FxGuiRectBody",
|
|
"default": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"w": 0,
|
|
"h": 0
|
|
}
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"path"
|
|
],
|
|
"title": "FxGuiRectRequest",
|
|
"description": "M7: anchor rect cho GUI native — rect panel nơi GUI embed xuất hiện."
|
|
},
|
|
"FxGuiRequest": {
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"title": "Path"
|
|
},
|
|
"name": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Name"
|
|
},
|
|
"embed": {
|
|
"type": "boolean",
|
|
"title": "Embed",
|
|
"default": false
|
|
},
|
|
"shm": {
|
|
"type": "string",
|
|
"title": "Shm",
|
|
"default": ""
|
|
},
|
|
"preset_b64": {
|
|
"type": "string",
|
|
"title": "Preset B64",
|
|
"default": ""
|
|
},
|
|
"master": {
|
|
"type": "boolean",
|
|
"title": "Master",
|
|
"default": false
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"path"
|
|
],
|
|
"title": "FxGuiRequest",
|
|
"description": "Mở native GUI của VST FX qua bridge (Windows desktop)."
|
|
},
|
|
"FxRealtimeSetChainRequest": {
|
|
"properties": {
|
|
"session_id": {
|
|
"type": "string",
|
|
"title": "Session Id",
|
|
"default": ""
|
|
},
|
|
"fx_chain": {
|
|
"items": {},
|
|
"type": "array",
|
|
"title": "Fx Chain",
|
|
"default": []
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "FxRealtimeSetChainRequest"
|
|
},
|
|
"FxRealtimeStartRequest": {
|
|
"properties": {
|
|
"fx_chain": {
|
|
"items": {},
|
|
"type": "array",
|
|
"title": "Fx Chain",
|
|
"default": []
|
|
},
|
|
"sample_rate": {
|
|
"type": "integer",
|
|
"title": "Sample Rate",
|
|
"default": 44100
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "FxRealtimeStartRequest",
|
|
"description": "Start một session FX realtime (master chain qua fx_vst_bridge\n--realtime-fx + SHM ring). Trả session_id để client mở WebSocket\n/ws/fx-realtime/{session_id} đẩy/kéo block audio."
|
|
},
|
|
"FxRealtimeStopRequest": {
|
|
"properties": {
|
|
"session_id": {
|
|
"type": "string",
|
|
"title": "Session Id",
|
|
"default": ""
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "FxRealtimeStopRequest"
|
|
},
|
|
"FxRenderRequest": {
|
|
"properties": {
|
|
"input_file_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Input File Id"
|
|
},
|
|
"input_path": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Input Path"
|
|
},
|
|
"fx_chain": {
|
|
"items": {},
|
|
"type": "array",
|
|
"title": "Fx Chain",
|
|
"default": []
|
|
},
|
|
"sample_rate": {
|
|
"type": "integer",
|
|
"title": "Sample Rate",
|
|
"default": 44100
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "FxRenderRequest",
|
|
"description": "Render WAV qua chuỗi FX (VST3 effect + builtin gain/normalize).\n\nDùng cho masterbus (render xong project → Ozone trên bus) và FX Rack\nper-track (preview offline qua bridge; realtime vẫn WebAudio)."
|
|
},
|
|
"HTTPValidationError": {
|
|
"properties": {
|
|
"detail": {
|
|
"items": {
|
|
"$ref": "#/components/schemas/ValidationError"
|
|
},
|
|
"type": "array",
|
|
"title": "Detail"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "HTTPValidationError"
|
|
},
|
|
"LoginRequest": {
|
|
"properties": {
|
|
"username": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Username",
|
|
"default": "admin"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"title": "Password"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"password"
|
|
],
|
|
"title": "LoginRequest"
|
|
},
|
|
"MidiExportRequest": {
|
|
"properties": {
|
|
"bpm": {
|
|
"type": "number",
|
|
"title": "Bpm",
|
|
"default": 120.0
|
|
},
|
|
"ppq": {
|
|
"type": "integer",
|
|
"title": "Ppq",
|
|
"default": 480
|
|
},
|
|
"tracks": {
|
|
"items": {
|
|
"$ref": "#/components/schemas/MidiExportTrackModel"
|
|
},
|
|
"type": "array",
|
|
"title": "Tracks",
|
|
"default": []
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "MidiExportRequest"
|
|
},
|
|
"MidiExportTrackModel": {
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"title": "Name",
|
|
"default": "Track"
|
|
},
|
|
"notes": {
|
|
"items": {
|
|
"$ref": "#/components/schemas/MidiNoteModel"
|
|
},
|
|
"type": "array",
|
|
"title": "Notes",
|
|
"default": []
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "MidiExportTrackModel"
|
|
},
|
|
"MidiNoteModel": {
|
|
"properties": {
|
|
"pitch": {
|
|
"type": "integer",
|
|
"title": "Pitch",
|
|
"default": 60
|
|
},
|
|
"start_beat": {
|
|
"type": "number",
|
|
"title": "Start Beat",
|
|
"default": 0.0
|
|
},
|
|
"duration_beats": {
|
|
"type": "number",
|
|
"title": "Duration Beats",
|
|
"default": 1.0
|
|
},
|
|
"velocity": {
|
|
"type": "number",
|
|
"title": "Velocity",
|
|
"default": 0.8
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "MidiNoteModel"
|
|
},
|
|
"MidiRenderRequest": {
|
|
"properties": {
|
|
"instrument_id": {
|
|
"type": "string",
|
|
"title": "Instrument Id"
|
|
},
|
|
"notes": {
|
|
"items": {},
|
|
"type": "array",
|
|
"title": "Notes",
|
|
"default": []
|
|
},
|
|
"bpm": {
|
|
"type": "number",
|
|
"title": "Bpm",
|
|
"default": 120.0
|
|
},
|
|
"sample_rate": {
|
|
"type": "integer",
|
|
"title": "Sample Rate",
|
|
"default": 44100
|
|
},
|
|
"preset_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Preset Id"
|
|
},
|
|
"preset_path": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Preset Path"
|
|
},
|
|
"preset_data": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Preset Data"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"instrument_id"
|
|
],
|
|
"title": "MidiRenderRequest",
|
|
"description": "Render MIDI notes → audio qua VSTi (âm thật, cùng code path với export).\n\ninstrument_id = plugin_id của track synth_engine (khớp key scan của\nPluginManager). Đây là cầu nối preset → pedalboard: preset chỉnh trong\nnative GUI (.vstpreset) được áp vào pedalboard trước khi render."
|
|
},
|
|
"MultitrackSessionRequest": {
|
|
"properties": {
|
|
"session_id": {
|
|
"type": "string",
|
|
"title": "Session Id"
|
|
},
|
|
"export_settings": {
|
|
"$ref": "#/components/schemas/ExportSettings"
|
|
},
|
|
"tracks": {
|
|
"items": {
|
|
"$ref": "#/components/schemas/TrackConfig"
|
|
},
|
|
"type": "array",
|
|
"title": "Tracks"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"session_id",
|
|
"export_settings",
|
|
"tracks"
|
|
],
|
|
"title": "MultitrackSessionRequest"
|
|
},
|
|
"MyFilesRequest": {
|
|
"properties": {
|
|
"active_file_ids": {
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"type": "array",
|
|
"title": "Active File Ids",
|
|
"default": []
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "MyFilesRequest"
|
|
},
|
|
"PreviewRequest": {
|
|
"properties": {
|
|
"instrument_id": {
|
|
"type": "string",
|
|
"title": "Instrument Id"
|
|
},
|
|
"notes": {
|
|
"items": {},
|
|
"type": "array",
|
|
"title": "Notes",
|
|
"default": []
|
|
},
|
|
"bpm": {
|
|
"type": "number",
|
|
"title": "Bpm",
|
|
"default": 120.0
|
|
},
|
|
"sample_rate": {
|
|
"type": "integer",
|
|
"title": "Sample Rate",
|
|
"default": 44100
|
|
},
|
|
"soundfont_bank": {
|
|
"anyOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Soundfont Bank",
|
|
"default": 0
|
|
},
|
|
"soundfont_program": {
|
|
"anyOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Soundfont Program",
|
|
"default": 0
|
|
},
|
|
"preset_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Preset Id"
|
|
},
|
|
"preset_path": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Preset Path"
|
|
},
|
|
"preset_data": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Preset Data"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"instrument_id"
|
|
],
|
|
"title": "PreviewRequest",
|
|
"description": "Quick-render preview: pedalboard render clip ngắn bằng ĐÚNG plugin +\npreset (cùng code path với export) → trả wav để browser phát.\nÂm preview = âm export (khác Preview Synth WASM hiện tại)."
|
|
},
|
|
"ProxyRequest": {
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"title": "Url"
|
|
},
|
|
"headers": {
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"type": "object",
|
|
"title": "Headers",
|
|
"default": {}
|
|
},
|
|
"body": {
|
|
"additionalProperties": true,
|
|
"type": "object",
|
|
"title": "Body",
|
|
"default": {}
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"url"
|
|
],
|
|
"title": "ProxyRequest"
|
|
},
|
|
"PythonToolRequest": {
|
|
"properties": {
|
|
"tool_type": {
|
|
"type": "string",
|
|
"title": "Tool Type"
|
|
},
|
|
"track_id": {
|
|
"type": "string",
|
|
"title": "Track Id"
|
|
},
|
|
"file_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "File Id"
|
|
},
|
|
"time_pos": {
|
|
"anyOf": [
|
|
{
|
|
"type": "number"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Time Pos",
|
|
"default": 0.0
|
|
},
|
|
"freq": {
|
|
"anyOf": [
|
|
{
|
|
"type": "number"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Freq",
|
|
"default": 440.0
|
|
},
|
|
"duration": {
|
|
"anyOf": [
|
|
{
|
|
"type": "number"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Duration",
|
|
"default": 2.0
|
|
},
|
|
"wave_type": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Wave Type",
|
|
"default": "sine"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"tool_type",
|
|
"track_id"
|
|
],
|
|
"title": "PythonToolRequest"
|
|
},
|
|
"ReferenceAnalyzeRequest": {
|
|
"properties": {
|
|
"path": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Path"
|
|
},
|
|
"file_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "File Id"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "ReferenceAnalyzeRequest"
|
|
},
|
|
"RegisterRequest": {
|
|
"properties": {
|
|
"username": {
|
|
"type": "string",
|
|
"title": "Username"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"title": "Email"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"title": "Password"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"username",
|
|
"email",
|
|
"password"
|
|
],
|
|
"title": "RegisterRequest"
|
|
},
|
|
"RenderProjectRequest": {
|
|
"properties": {
|
|
"sample_rate": {
|
|
"anyOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Sample Rate",
|
|
"default": 44100
|
|
},
|
|
"metadata": {
|
|
"anyOf": [
|
|
{
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Metadata"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "RenderProjectRequest"
|
|
},
|
|
"RenderRequest": {
|
|
"properties": {
|
|
"project_json": {
|
|
"additionalProperties": true,
|
|
"type": "object",
|
|
"title": "Project Json"
|
|
},
|
|
"output_filename": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Output Filename",
|
|
"default": "render_output.wav"
|
|
},
|
|
"bit_depth": {
|
|
"anyOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Bit Depth",
|
|
"default": 32
|
|
},
|
|
"sample_rate": {
|
|
"anyOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Sample Rate",
|
|
"default": 0
|
|
},
|
|
"dither": {
|
|
"anyOf": [
|
|
{
|
|
"type": "boolean"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Dither",
|
|
"default": false
|
|
},
|
|
"normalize": {
|
|
"anyOf": [
|
|
{
|
|
"type": "boolean"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Normalize",
|
|
"default": false
|
|
},
|
|
"normalize_target": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Normalize Target",
|
|
"default": "-1dbtp"
|
|
},
|
|
"mono_check": {
|
|
"anyOf": [
|
|
{
|
|
"type": "boolean"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Mono Check",
|
|
"default": false
|
|
},
|
|
"metadata": {
|
|
"anyOf": [
|
|
{
|
|
"additionalProperties": true,
|
|
"type": "object"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Metadata"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"project_json"
|
|
],
|
|
"title": "RenderRequest"
|
|
},
|
|
"SaveAIConfigRequest": {
|
|
"properties": {
|
|
"providers": {
|
|
"items": {
|
|
"$ref": "#/components/schemas/AIProviderSetting"
|
|
},
|
|
"type": "array",
|
|
"title": "Providers"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"providers"
|
|
],
|
|
"title": "SaveAIConfigRequest"
|
|
},
|
|
"SaveDialogRequest": {
|
|
"properties": {
|
|
"default_name": {
|
|
"type": "string",
|
|
"title": "Default Name",
|
|
"default": "untitled"
|
|
},
|
|
"filter_name": {
|
|
"type": "string",
|
|
"title": "Filter Name",
|
|
"default": "File"
|
|
},
|
|
"filter_ext": {
|
|
"type": "string",
|
|
"title": "Filter Ext",
|
|
"default": "bin"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "SaveDialogRequest"
|
|
},
|
|
"SavePreferencesRequest": {
|
|
"properties": {
|
|
"preferences": {
|
|
"additionalProperties": true,
|
|
"type": "object",
|
|
"title": "Preferences"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"preferences"
|
|
],
|
|
"title": "SavePreferencesRequest"
|
|
},
|
|
"SaveProjectRequest": {
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"title": "Name"
|
|
},
|
|
"data_json": {
|
|
"type": "string",
|
|
"title": "Data Json"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"name",
|
|
"data_json"
|
|
],
|
|
"title": "SaveProjectRequest"
|
|
},
|
|
"SaveTempProjectRequest": {
|
|
"properties": {
|
|
"data_json": {
|
|
"type": "string",
|
|
"title": "Data Json"
|
|
},
|
|
"client_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Client Id"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"data_json"
|
|
],
|
|
"title": "SaveTempProjectRequest"
|
|
},
|
|
"SoundfontRenderRequest": {
|
|
"properties": {
|
|
"soundfont_id": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Soundfont Id"
|
|
},
|
|
"soundfont_path": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Soundfont Path"
|
|
},
|
|
"bank": {
|
|
"type": "integer",
|
|
"title": "Bank",
|
|
"default": 0
|
|
},
|
|
"program": {
|
|
"type": "integer",
|
|
"title": "Program",
|
|
"default": 0
|
|
},
|
|
"notes": {
|
|
"items": {},
|
|
"type": "array",
|
|
"title": "Notes",
|
|
"default": []
|
|
},
|
|
"bpm": {
|
|
"type": "number",
|
|
"title": "Bpm",
|
|
"default": 120.0
|
|
},
|
|
"sample_rate": {
|
|
"type": "integer",
|
|
"title": "Sample Rate",
|
|
"default": 44100
|
|
}
|
|
},
|
|
"type": "object",
|
|
"title": "SoundfontRenderRequest",
|
|
"description": "Render MIDI notes → WAV bằng soundfont THẬT qua native FluidSynth\n(pyfluidsynth) — luồng âm instrument cho môi trường STANDALONE (xử lí\ntrực tiếp trên OS; docker dùng FluidSynthWASM ở client)."
|
|
},
|
|
"TrackConfig": {
|
|
"properties": {
|
|
"track_id": {
|
|
"type": "string",
|
|
"title": "Track Id"
|
|
},
|
|
"file_id": {
|
|
"type": "string",
|
|
"title": "File Id"
|
|
},
|
|
"volume": {
|
|
"type": "number",
|
|
"title": "Volume",
|
|
"default": 1.0
|
|
},
|
|
"muted": {
|
|
"type": "boolean",
|
|
"title": "Muted",
|
|
"default": false
|
|
},
|
|
"clips": {
|
|
"items": {
|
|
"$ref": "#/components/schemas/ClipConfig"
|
|
},
|
|
"type": "array",
|
|
"title": "Clips",
|
|
"default": []
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"track_id",
|
|
"file_id"
|
|
],
|
|
"title": "TrackConfig"
|
|
},
|
|
"UpdateUserQuotaRequest": {
|
|
"properties": {
|
|
"storage_limit_mb": {
|
|
"type": "integer",
|
|
"title": "Storage Limit Mb"
|
|
},
|
|
"max_tracks": {
|
|
"anyOf": [
|
|
{
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Max Tracks",
|
|
"default": 16
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"storage_limit_mb"
|
|
],
|
|
"title": "UpdateUserQuotaRequest"
|
|
},
|
|
"UpdateUserRoleRequest": {
|
|
"properties": {
|
|
"role": {
|
|
"type": "string",
|
|
"title": "Role"
|
|
},
|
|
"is_active": {
|
|
"anyOf": [
|
|
{
|
|
"type": "boolean"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
],
|
|
"title": "Is Active",
|
|
"default": true
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"role"
|
|
],
|
|
"title": "UpdateUserRoleRequest"
|
|
},
|
|
"ValidationError": {
|
|
"properties": {
|
|
"loc": {
|
|
"items": {
|
|
"anyOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "integer"
|
|
}
|
|
]
|
|
},
|
|
"type": "array",
|
|
"title": "Location"
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"title": "Message"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"title": "Error Type"
|
|
},
|
|
"input": {
|
|
"title": "Input"
|
|
},
|
|
"ctx": {
|
|
"type": "object",
|
|
"title": "Context"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"loc",
|
|
"msg",
|
|
"type"
|
|
],
|
|
"title": "ValidationError"
|
|
}
|
|
}
|
|
}
|
|
} |