Spaces:
Sleeping
Sleeping
| import uuid | |
| import time | |
| import json | |
| from fastapi import APIRouter, HTTPException | |
| from core.db import db_conn | |
| from core import event_bus | |
| from schemas.requests import ProjectSaveRequest | |
| router = APIRouter() | |
| async def list_projects(): | |
| with db_conn() as conn: | |
| rows = conn.execute( | |
| "SELECT id, name, video_path, duration, created_at, updated_at FROM studio_projects ORDER BY updated_at DESC" | |
| ).fetchall() | |
| return [dict(r) for r in rows] | |
| async def get_project(project_id: str): | |
| with db_conn() as conn: | |
| row = conn.execute("SELECT * FROM studio_projects WHERE id=?", (project_id,)).fetchone() | |
| if not row: | |
| raise HTTPException(status_code=404, detail="Project not found") | |
| result = dict(row) | |
| if result.get("state_json"): | |
| try: | |
| result["state"] = json.loads(result["state_json"]) | |
| except Exception: | |
| result["state"] = {} | |
| else: | |
| result["state"] = {} | |
| return result | |
| async def create_project(req: ProjectSaveRequest): | |
| project_id = str(uuid.uuid4())[:8] | |
| now = time.time() | |
| with db_conn() as conn: | |
| conn.execute( | |
| "INSERT INTO studio_projects (id, name, video_path, audio_path, duration, state_json, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?)", | |
| (project_id, req.name, req.video_path, req.audio_path, req.duration, json.dumps(req.state), now, now), | |
| ) | |
| event_bus.emit("projects", {"action": "created", "id": project_id}) | |
| return {"id": project_id, "name": req.name, "created_at": now} | |
| async def update_project(project_id: str, req: ProjectSaveRequest): | |
| with db_conn() as conn: | |
| row = conn.execute("SELECT id FROM studio_projects WHERE id=?", (project_id,)).fetchone() | |
| if not row: | |
| raise HTTPException(status_code=404, detail="Project not found") | |
| now = time.time() | |
| conn.execute( | |
| "UPDATE studio_projects SET name=?, video_path=?, audio_path=?, duration=?, state_json=?, updated_at=? WHERE id=?", | |
| (req.name, req.video_path, req.audio_path, req.duration, json.dumps(req.state), now, project_id), | |
| ) | |
| event_bus.emit("projects", {"action": "updated", "id": project_id}) | |
| return {"id": project_id, "name": req.name, "updated_at": now} | |
| async def delete_project(project_id: str): | |
| with db_conn() as conn: | |
| conn.execute("DELETE FROM studio_projects WHERE id=?", (project_id,)) | |
| event_bus.emit("projects", {"action": "deleted", "id": project_id}) | |
| return {"deleted": project_id} | |