58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
|
|
import json
|
|
from app.core.ai import ai_client
|
|
from app.schemas.script import ScriptAnalysisResponse
|
|
|
|
class ScriptParserService:
|
|
async def parse_script(self, text_content: str) -> ScriptAnalysisResponse:
|
|
prompt = f"""
|
|
You are an expert Assistant Director and Script Supervisor.
|
|
Analyze the following screenplay text and break it down into Scenes and Shots.
|
|
|
|
For each Scene, identify:
|
|
- Scene Number (if present, or incrementing)
|
|
- Heading (INT./EXT. LOCATION - DAY/NIGHT)
|
|
- Brief Description of what happens
|
|
|
|
For each Scene, break the action down into a list of Shots (Camera setups).
|
|
For each Shot, provide:
|
|
- Shot Number (e.g. 1, 1A, etc)
|
|
- Description of the action in the shot
|
|
- Visual Notes (Camera angles, movement if implied)
|
|
- Dialogue (if any covers this shot)
|
|
|
|
Output MUST be a valid JSON object matching this structure:
|
|
{{
|
|
"scenes": [
|
|
{{
|
|
"scene_number": "1",
|
|
"heading": "INT. OFFICE - DAY",
|
|
"description": "John sits at his desk.",
|
|
"shots": [
|
|
{{
|
|
"shot_number": "1A",
|
|
"description": "Wide shot of John at desk.",
|
|
"visual_notes": "Static",
|
|
"dialogue": null
|
|
}}
|
|
]
|
|
}}
|
|
]
|
|
}}
|
|
|
|
SCRIPT TEXT:
|
|
{text_content}
|
|
"""
|
|
|
|
json_str = await ai_client.generate_json(prompt)
|
|
|
|
# Parse JSON and validate with Pydantic
|
|
try:
|
|
data = json.loads(json_str)
|
|
return ScriptAnalysisResponse(**data)
|
|
except json.JSONDecodeError:
|
|
# Fallback or retry logic could go here
|
|
raise ValueError("Failed to parse LLM response as JSON")
|
|
|
|
parser_service = ScriptParserService()
|