File size: 4,169 Bytes
9bc1376
 
 
 
 
 
 
 
 
 
 
 
 
 
d865501
 
9bc1376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import json
import os
import time
from core.logger import logger
from typing import Dict, Any

from prompt.system_prompt_script import SYSTEM_PROMPT
from schema.pydantic_schema_script import ScriptResponse
from google import genai
from dotenv import load_dotenv

load_dotenv()
GEMINI_API_KEY = os.getenv("GEMINI_KEY")



def configure_gemini():
    return genai.Client(api_key=GEMINI_API_KEY)


def generate_scripts(
        video_path: str,
        offer_details: str,
        target_audience: str,
        specific_hooks: str,
        additional_context: str,
        num_scripts: int = 3,
        duration: int = 60
) -> Dict[str, Any]:
    client = configure_gemini()

    try:
        user_prompt = f"""
                    Generate {num_scripts} high-converting direct response script variations,
                    each about {duration} seconds long.
                      Each variation MUST be designed for a total runtime ≤ {duration} seconds.
                    - Do NOT include any timestamp beyond {duration}s.
                    - Keep all beats within 0–{duration}s.
                    - Use timestamps as "M:SS" (e.g., "0:03", "0:12").


                    CONTEXT TO FOLLOW:
                    - Offer Details: {offer_details}
                    - Target Audience: {target_audience}
                    - Specific Hooks: {specific_hooks}

                     ADDITIONAL CONTEXT:
                    {additional_context}
                    You must reflect this additional context in:
                    - The script tone, CTA, visuals
                    - Compliance or branding constraints
                    - Any assumptions about audience or product
                    Failure to include this will be considered incomplete.
                    Please provide a comprehensive analysis including:
                    1. DETAILED VIDEO ANALYSIS with timestamp-based metrics:
                       - Break down the video into 5-10 second segments
                       - Rate each segment's effectiveness (1-10 scale)
                       - Identify specific elements (hook, transition, proof, CTA, etc.)
                    2. TIMESTAMP-BASED IMPROVEMENTS:
                       - Specific recommendations for each time segment
                       - Priority level for each improvement
                       - Expected impact of implementing changes
                    3. SCRIPT VARIATIONS:
                       - Create complete script variations
                        - Each with timestamp-by-timestamp breakdown
                        - Different psychological triggers and approaches
         IMPORTANT: Return only valid JSON in the exact format specified in the system prompt. Analyze the video second-by-second for maximum detail."""

        video_file = client.files.upload(file=video_path)

        while getattr(video_file.state, "name", "") == "PROCESSING":
            time.sleep(1.0)
            video_file = client.files.get(name=video_file.name)
        if getattr(video_file.state, "name", "") == "FAILED":
            logger.error("Video processing FAILED.")
            return {}

        resp = client.models.generate_content(
            model="gemini-2.0-flash",
            contents=[SYSTEM_PROMPT, user_prompt, video_file],
            config={
                "response_mime_type": "application/json",
                "response_schema": ScriptResponse,

            },
        )

        parsed = getattr(resp, "parsed", None)
        if parsed is None:

            raw_text = getattr(resp, "text", "") or ""
            if not raw_text:
                parts = None
                if getattr(resp, "candidates", None):
                    parts = getattr(resp.candidates[0].content, "parts", None)
                raise RuntimeError(f"Model returned no JSON text. parts={parts}")
            data = json.loads(raw_text)
            return data

        out = parsed.model_dump()
        logger.info("Generated %d variations.", len(out.get("script_variations", [])))
        return out

    except Exception as e:
        logger.exception("generate_scripts failed: %s", e)
        return {}