{ "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\": \"\"} 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 ` (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" } } } }