AdGenesis-App / app_pages /script_generator.py
userIdc2024's picture
Update app_pages/script_generator.py
4013df7 verified
import os
import tempfile
import pandas as pd
import streamlit as st
from generator_function.script_generator import generate_scripts
from helpers_function.helpers import get_video_thumbnail_base64
from database.operations import insert_script_result
from authen.authentication import login_gate
def _fmt_ts(ts) -> str:
try:
return ts.strftime("%Y-%m-%d %H:%M")
except Exception:
return "Unknown time"
def generator_page(uid: str):
st.subheader("Script Generator")
uploaded_video = st.file_uploader(
"Upload Video or ZIP (max 3 videos)", type=["mp4", "mov", "avi", "mkv", "zip"], key="sg_upload"
)
script_duration = st.slider("Script Duration (seconds)", 0, 180, 60, 5, key="sg_dur")
num_scripts = st.slider("Number of Scripts", 1, 5, 3, key="sg_count")
st.markdown("Additional Information")
offer_details = st.text_area(
"Offer Details",
placeholder="e.g., Solar installation with $0 down payment...",
key="sg_offer",
)
target_audience = st.text_area(
"Target Audience",
placeholder="e.g., 40+ homeowners with high electricity bills...",
key="sg_aud",
)
specific_hooks = st.text_area(
"Specific Hooks to Test",
placeholder="e.g., Government rebate angle...",
key="sg_hooks",
)
additional_context = st.text_area(
"Additional Context",
placeholder="Compliance requirements, brand guidelines...",
key="sg_ctx",
)
script_button = st.button("Generate Scripts",width='stretch', key="sg_go")
if script_button and uploaded_video:
with tempfile.NamedTemporaryFile(
delete=False, suffix=os.path.splitext(uploaded_video.name)[1]
) as tmp:
src_bytes = uploaded_video.read()
tmp.write(src_bytes)
video_path = tmp.name
with st.spinner("Generating scripts..."):
st.session_state.setdefault("scripts", [])
result = generate_scripts(
video_path,
offer_details,
target_audience,
specific_hooks,
additional_context,
num_scripts=num_scripts,
duration=script_duration,
)
if result and "script_variations" in result:
st.session_state["scripts"].append(
{"prompt_used": "Initial Generation", "variations": result["script_variations"]}
)
st.session_state["video_name"] = uploaded_video.name
st.session_state["video_path"] = video_path
try:
st.session_state["thumbnail"] = get_video_thumbnail_base64(video_path)
except Exception:
st.session_state["thumbnail"] = ""
st.session_state["meta"] = {
"offer_details": offer_details,
"target_audience": target_audience,
"specific_hook": specific_hooks,
"additional_context": additional_context,
}
if "scripts" in st.session_state and st.session_state["scripts"]:
for round_idx, round_data in enumerate(st.session_state["scripts"], 1):
st.markdown(f"### Generation Round {round_idx}")
st.text_input(
"Prompt used:", round_data["prompt_used"], disabled=True, key=f"prompt_{round_idx}"
)
for i, variation in enumerate(round_data["variations"], 1):
st.markdown(f"#### Variation {i}: {variation.get('variation_name', 'Var')}")
df = pd.DataFrame(variation.get("script_table", []))
st.table(df)
st.divider()
save_button = st.button("Save to DB", width='stretch', key="sg_save")
if save_button:
try:
insert_script_result(
video_name=st.session_state.get("video_name", "unknown"),
offer_details=st.session_state["meta"].get("offer_details", ""),
target_audience=st.session_state["meta"].get("target_audience", ""),
specific_hook=st.session_state["meta"].get("specific_hook", ""),
additional_context=st.session_state["meta"].get("additional_context", ""),
response=st.session_state["scripts"],
thumbnail=st.session_state.get("thumbnail", ""),
created_by=uid,
num_scripts=len(st.session_state["scripts"][-1]["variations"]),
category="general",
)
st.success("Scripts saved to database!")
except Exception as e:
st.error(f"Failed to save scripts: {e}")
st.subheader("Generate More Scripts")
more_num = st.slider("How many more scripts?", 1, 5, 1, key="sg_more_count")
more_prompt = st.text_area("Required Prompt", placeholder="Add specific guidance", key="sg_more_prompt")
if st.button("Generate More Scripts", width='stretch', key="sg_more_go"):
if not more_prompt.strip():
st.error("Please provide a prompt before generating more scripts.")
else:
video_path = st.session_state.get("video_path")
if not video_path:
st.error("No video available. Please upload again.")
else:
with st.spinner("Generating more scripts..."):
extra_result = generate_scripts(
video_path,
st.session_state["meta"]["offer_details"],
st.session_state["meta"]["target_audience"],
st.session_state["meta"]["specific_hook"],
st.session_state["meta"]["additional_context"] + "\n\n" + more_prompt,
num_scripts=more_num,
duration=script_duration,
)
if extra_result and "script_variations" in extra_result:
st.session_state["scripts"].append(
{"prompt_used": more_prompt, "variations": extra_result["script_variations"]}
)