52 lines
2.4 KiB
Python
52 lines
2.4 KiB
Python
# SonicForge System API — capabilities: frontend gọi 1 lần lúc boot để biết
|
|
# môi trường (desktop Windows / docker headless) và bật/tắt tính năng tương ứng.
|
|
from fastapi import APIRouter, HTTPException, Depends
|
|
from pydantic import BaseModel
|
|
from typing import Optional
|
|
from app.core.runtime import capabilities, save_carla_path
|
|
from app.api.v1.auth import get_current_user, enforce_password_changed
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/capabilities")
|
|
async def get_capabilities():
|
|
"""Khả năng của môi trường hiện tại (public — cần trước khi đăng nhập).
|
|
|
|
- runtime: "desktop" (server + client cùng 1 máy Windows/macOS) |
|
|
"headless" (docker server + browser UI)
|
|
- features.carla_local: có Carla trên máy này → hiện nút "Mở trong Carla"
|
|
- features.preset_upload: luôn True (upload .vstpreset qua web UI)
|
|
- features.preview_mode: "quick_render" (pedalboard render clip ngắn —
|
|
âm thật giống export) | "wasm" (Preview Synth trong browser)
|
|
"""
|
|
return capabilities()
|
|
|
|
|
|
class CarlaPathRequest(BaseModel):
|
|
"""Định vị Carla (bản portable zip không cài đặt/PATH). Chấp nhận đường
|
|
dẫn tới carla.exe HOẶC thư mục chứa carla.exe — resolve và lưu config."""
|
|
carla_path: str
|
|
carla_dir: Optional[str] = None # tương thích ngược: tên cũ của carla_path
|
|
|
|
|
|
@router.post("/carla-path")
|
|
async def set_carla_path(req: CarlaPathRequest, current_user: dict = Depends(get_current_user)):
|
|
"""Lưu vị trí carla.exe do user chọn (Plugin Manager → Định vị Carla...).
|
|
|
|
Cần thiết vì bản Carla Windows là bộ file zip portable — không có installer
|
|
cũng không dùng biến môi trường PATH, nên heuristic không tìm thấy."""
|
|
enforce_password_changed(current_user)
|
|
target = (req.carla_path or req.carla_dir or "").strip()
|
|
if not target:
|
|
raise HTTPException(status_code=400, detail="Thiếu đường dẫn Carla")
|
|
exe = save_carla_path(target)
|
|
if not exe:
|
|
raise HTTPException(
|
|
status_code=400,
|
|
detail="Không tìm thấy carla.exe trong đường dẫn đã chọn. Hãy chọn "
|
|
"thư mục chứa carla.exe (bản portable giải nén) hoặc chính file carla.exe.",
|
|
)
|
|
return {"success": True, "carla_path": exe, **capabilities()}
|
|
|