File size: 2,986 Bytes
395651c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import os
from .celery_app import celery_app
from geometry_render.renderer import RendererAgent
from app.supabase_client import get_supabase
from .asset_manager import upload_session_asset

@celery_app.task(name="worker.tasks.render_geometry_video")
def render_geometry_video(job_id: str, data: dict):
    renderer = RendererAgent()
    supabase = get_supabase()
    session_id = data.get("session_id")
    
    # 1. Generate Manim script
    script = renderer.generate_manim_script(data)
    
    # 2. Run Manim and get local video file path
    video_local_path = renderer.run_manim(script, job_id)
    
    if not video_local_path or not os.path.exists(video_local_path):
        raise Exception(f"Manim rendering failed for job {job_id}")

    try:
        with open(video_local_path, "rb") as f:
            video_content = f.read()
        
        # 3. Upload to Supabase using Asset Manager (Versioning)
        # If no session_id (unlikely in this flow), fallback to simple upload
        if session_id:
            storage_path, video_url = upload_session_asset(
                session_id=session_id,
                job_id=job_id,
                file_bytes=video_content,
                asset_type="video",
                ext="mp4"
            )
        else:
            # Legacy fallback
            bucket_name = os.getenv("SUPABASE_BUCKET", "video")
            file_name = f"{job_id}.mp4"
            supabase.storage.from_(bucket_name).upload(path=file_name, file=video_content)
            video_url = supabase.storage.from_(bucket_name).get_public_url(file_name)
        
        # 4. Update Job status and Final Result in Supabase Database
        final_result = data.copy()
        final_result["video_url"] = video_url
        
        supabase.table("jobs").update({
            "status": "success",
            "result": final_result
        }).eq("id", job_id).execute()
        
        # 5. Save message history (Assistant answer)
        if session_id:
            supabase.table("messages").insert({
                "session_id": session_id,
                "role": "assistant",
                "type": "analysis",
                "content": data.get("semantic_analysis", "🎬 Video minh họa đã sẵn sàng."),
                "metadata": {
                    "job_id": job_id,
                    "video_url": video_url,
                    "coordinates": data.get("coordinates"),
                    "geometry_dsl": data.get("geometry_dsl"),
                    "polygon_order": data.get("polygon_order", []),
                    "drawing_phases": data.get("drawing_phases", []),
                    "circles": data.get("circles", []),
                    "lines": data.get("lines", []),
                    "rays": data.get("rays", []),
                }
            }).execute()
        
        return video_url
    finally:
        # 6. Cleanup local file
        if os.path.exists(video_local_path):
            os.remove(video_local_path)