Update app.py
Browse files
app.py
CHANGED
@@ -186,15 +186,14 @@ else:
|
|
186 |
for i_main_display, scene_content_item_display in enumerate(st.session_state.project_story_treatment_scenes_list):
|
187 |
scene_num_for_display = scene_content_item_display.get('scene_number', i_main_display + 1)
|
188 |
scene_title_for_display_main = scene_content_item_display.get('scene_title', 'Untitled Scene')
|
189 |
-
key_base_main_area_widgets = f"s{scene_num_for_display}_main_widgets_loop_v3_{i_main_display}"
|
190 |
|
191 |
if "director_note" in scene_content_item_display and scene_content_item_display['director_note']: st.info(f"π¬ Director Note S{scene_num_for_display}: {scene_content_item_display['director_note']}")
|
192 |
st.subheader(f"SCENE {scene_num_for_display}: {scene_title_for_display_main.upper()}");
|
193 |
|
194 |
-
|
195 |
-
treatment_display_column, visual_display_column = st.columns([0.45, 0.55])
|
196 |
|
197 |
-
with
|
198 |
with st.expander("π Scene Treatment & Controls", expanded=True):
|
199 |
st.markdown(f"**Beat:** {scene_content_item_display.get('emotional_beat', 'N/A')}"); st.markdown(f"**Setting:** {scene_content_item_display.get('setting_description', 'N/A')}"); st.markdown(f"**Chars:** {', '.join(scene_content_item_display.get('characters_involved', ['N/A']))}"); st.markdown(f"**Focus Moment:** _{scene_content_item_display.get('character_focus_moment', 'N/A')}_"); st.markdown(f"**Plot Beat:** {scene_content_item_display.get('key_plot_beat', 'N/A')}"); st.markdown(f"**Dialogue Hook:** `\"{scene_content_item_display.get('suggested_dialogue_hook', '...')}\"`"); st.markdown("---"); st.markdown(f"**Dir. Visual Style:** _{scene_content_item_display.get('PROACTIVE_visual_style_κ°λ
', 'N/A')}_"); st.markdown(f"**Dir. Camera:** _{scene_content_item_display.get('PROACTIVE_camera_work_κ°λ
', 'N/A')}_"); st.markdown(f"**Dir. Sound:** _{scene_content_item_display.get('PROACTIVE_sound_design_κ°λ
', 'N/A')}_"); st.markdown("---")
|
200 |
st.markdown("##### Shot, Pacing & Asset Controls")
|
@@ -218,15 +217,16 @@ else:
|
|
218 |
px_q_disp_main = scene_content_item_display.get('pexels_search_query_κ°λ
', None)
|
219 |
if px_q_disp_main: st.caption(f"Pexels Fallback: `{px_q_disp_main}`")
|
220 |
|
221 |
-
|
|
|
222 |
asset_info_main_disp = st.session_state.project_generated_assets_info_list[i_main_display] if i_main_display < len(st.session_state.project_generated_assets_info_list) else None
|
223 |
if asset_info_main_disp and not asset_info_main_disp.get('error') and asset_info_main_disp.get('path') and os.path.exists(asset_info_main_disp['path']):
|
224 |
path_asset_main = asset_info_main_disp['path']; type_asset_main = asset_info_main_disp.get('type','image')
|
225 |
-
if type_asset_main == 'image': st.image(path_asset_main, caption=f"S{scene_num_for_display} ({type_asset_main}): {
|
226 |
elif type_asset_main == 'video':
|
227 |
try:
|
228 |
with open(path_asset_main,'rb') as vid_f_main: vid_b_main = vid_f_main.read()
|
229 |
-
st.video(vid_b_main, format="video/mp4", start_time=0); st.caption(f"S{scene_num_for_display} ({type_asset_main}): {
|
230 |
except Exception as e_vid_disp_main_area: st.error(f"Error displaying video {path_asset_main}: {e_vid_disp_main_area}"); logger.error(f"Display video error: {e_vid_disp_main_area}", exc_info=True)
|
231 |
else: st.warning(f"Unknown asset type '{type_asset_main}' S{scene_num_for_display}.")
|
232 |
else:
|
@@ -289,16 +289,16 @@ else:
|
|
289 |
if st.session_state.project_story_treatment_scenes_list and any(asset_info_item_vid and not asset_info_item_vid.get('error') and asset_info_item_vid.get('path') for asset_info_item_vid in st.session_state.project_generated_assets_info_list if asset_info_item_vid is not None):
|
290 |
if st.button("π¬ Assemble Narrated Cinematic Animatic", key="assemble_video_main_area_btn_final_unique_4", type="primary", use_container_width=True):
|
291 |
with st.status("Assembling Ultra Animatic...", expanded=True) as status_video_assembly_final_op_main:
|
292 |
-
|
293 |
for i_vid_assembly_main_loop, scene_data_for_vid_assembly_main in enumerate(st.session_state.project_story_treatment_scenes_list):
|
294 |
asset_info_current_scene_for_vid_main = st.session_state.project_generated_assets_info_list[i_vid_assembly_main_loop] if i_vid_assembly_main_loop < len(st.session_state.project_generated_assets_info_list) else None
|
295 |
if asset_info_current_scene_for_vid_main and not asset_info_current_scene_for_vid_main.get('error') and asset_info_current_scene_for_vid_main.get('path') and os.path.exists(asset_info_current_scene_for_vid_main['path']):
|
296 |
-
|
297 |
status_video_assembly_final_op_main.write(f"Adding S{scene_data_for_vid_assembly_main.get('scene_number', i_vid_assembly_main_loop + 1)} ({asset_info_current_scene_for_vid_main.get('type')}).")
|
298 |
else: logger.warning(f"Skipping S{scene_data_for_vid_assembly_main.get('scene_number', i_vid_assembly_main_loop+1)} for video: No valid asset.")
|
299 |
-
if
|
300 |
status_video_assembly_final_op_main.write("Calling video engine..."); logger.info("APP: Calling visual_engine.assemble_animatic_from_assets")
|
301 |
-
st.session_state.project_final_video_path = st.session_state.visual_content_engine.assemble_animatic_from_assets(asset_data_list=
|
302 |
if st.session_state.project_final_video_path and os.path.exists(st.session_state.project_final_video_path): status_video_assembly_final_op_main.update(label="Ultra animatic assembled! π", state="complete", expanded=False); st.balloons()
|
303 |
else: status_video_assembly_final_op_main.update(label="Video assembly failed. Check logs.", state="error", expanded=True); logger.error("APP: Video assembly returned None or file does not exist.")
|
304 |
else: status_video_assembly_final_op_main.update(label="No valid assets for video assembly.", state="error", expanded=True); logger.warning("APP: No valid assets found for video assembly.")
|
|
|
186 |
for i_main_display, scene_content_item_display in enumerate(st.session_state.project_story_treatment_scenes_list):
|
187 |
scene_num_for_display = scene_content_item_display.get('scene_number', i_main_display + 1)
|
188 |
scene_title_for_display_main = scene_content_item_display.get('scene_title', 'Untitled Scene')
|
189 |
+
key_base_main_area_widgets = f"s{scene_num_for_display}_main_widgets_loop_v3_{i_main_display}"
|
190 |
|
191 |
if "director_note" in scene_content_item_display and scene_content_item_display['director_note']: st.info(f"π¬ Director Note S{scene_num_for_display}: {scene_content_item_display['director_note']}")
|
192 |
st.subheader(f"SCENE {scene_num_for_display}: {scene_title_for_display_main.upper()}");
|
193 |
|
194 |
+
treatment_display_col, visual_display_col = st.columns([0.45, 0.55]) # Defined here
|
|
|
195 |
|
196 |
+
with treatment_display_col:
|
197 |
with st.expander("π Scene Treatment & Controls", expanded=True):
|
198 |
st.markdown(f"**Beat:** {scene_content_item_display.get('emotional_beat', 'N/A')}"); st.markdown(f"**Setting:** {scene_content_item_display.get('setting_description', 'N/A')}"); st.markdown(f"**Chars:** {', '.join(scene_content_item_display.get('characters_involved', ['N/A']))}"); st.markdown(f"**Focus Moment:** _{scene_content_item_display.get('character_focus_moment', 'N/A')}_"); st.markdown(f"**Plot Beat:** {scene_content_item_display.get('key_plot_beat', 'N/A')}"); st.markdown(f"**Dialogue Hook:** `\"{scene_content_item_display.get('suggested_dialogue_hook', '...')}\"`"); st.markdown("---"); st.markdown(f"**Dir. Visual Style:** _{scene_content_item_display.get('PROACTIVE_visual_style_κ°λ
', 'N/A')}_"); st.markdown(f"**Dir. Camera:** _{scene_content_item_display.get('PROACTIVE_camera_work_κ°λ
', 'N/A')}_"); st.markdown(f"**Dir. Sound:** _{scene_content_item_display.get('PROACTIVE_sound_design_κ°λ
', 'N/A')}_"); st.markdown("---")
|
199 |
st.markdown("##### Shot, Pacing & Asset Controls")
|
|
|
217 |
px_q_disp_main = scene_content_item_display.get('pexels_search_query_κ°λ
', None)
|
218 |
if px_q_disp_main: st.caption(f"Pexels Fallback: `{px_q_disp_main}`")
|
219 |
|
220 |
+
# <<< CORRECTED: Using visual_display_col as defined above >>>
|
221 |
+
with visual_display_col:
|
222 |
asset_info_main_disp = st.session_state.project_generated_assets_info_list[i_main_display] if i_main_display < len(st.session_state.project_generated_assets_info_list) else None
|
223 |
if asset_info_main_disp and not asset_info_main_disp.get('error') and asset_info_main_disp.get('path') and os.path.exists(asset_info_main_disp['path']):
|
224 |
path_asset_main = asset_info_main_disp['path']; type_asset_main = asset_info_main_disp.get('type','image')
|
225 |
+
if type_asset_main == 'image': st.image(path_asset_main, caption=f"S{scene_num_for_display} ({type_asset_main}): {scene_title_disp}")
|
226 |
elif type_asset_main == 'video':
|
227 |
try:
|
228 |
with open(path_asset_main,'rb') as vid_f_main: vid_b_main = vid_f_main.read()
|
229 |
+
st.video(vid_b_main, format="video/mp4", start_time=0); st.caption(f"S{scene_num_for_display} ({type_asset_main}): {scene_title_disp}")
|
230 |
except Exception as e_vid_disp_main_area: st.error(f"Error displaying video {path_asset_main}: {e_vid_disp_main_area}"); logger.error(f"Display video error: {e_vid_disp_main_area}", exc_info=True)
|
231 |
else: st.warning(f"Unknown asset type '{type_asset_main}' S{scene_num_for_display}.")
|
232 |
else:
|
|
|
289 |
if st.session_state.project_story_treatment_scenes_list and any(asset_info_item_vid and not asset_info_item_vid.get('error') and asset_info_item_vid.get('path') for asset_info_item_vid in st.session_state.project_generated_assets_info_list if asset_info_item_vid is not None):
|
290 |
if st.button("π¬ Assemble Narrated Cinematic Animatic", key="assemble_video_main_area_btn_final_unique_4", type="primary", use_container_width=True):
|
291 |
with st.status("Assembling Ultra Animatic...", expanded=True) as status_video_assembly_final_op_main:
|
292 |
+
assets_for_final_vid_assembly_list = [] # Corrected initialization name
|
293 |
for i_vid_assembly_main_loop, scene_data_for_vid_assembly_main in enumerate(st.session_state.project_story_treatment_scenes_list):
|
294 |
asset_info_current_scene_for_vid_main = st.session_state.project_generated_assets_info_list[i_vid_assembly_main_loop] if i_vid_assembly_main_loop < len(st.session_state.project_generated_assets_info_list) else None
|
295 |
if asset_info_current_scene_for_vid_main and not asset_info_current_scene_for_vid_main.get('error') and asset_info_current_scene_for_vid_main.get('path') and os.path.exists(asset_info_current_scene_for_vid_main['path']):
|
296 |
+
assets_for_final_vid_assembly_list.append({'path': asset_info_current_scene_for_vid_main['path'], 'type': asset_info_current_scene_for_vid_main.get('type', 'image'), 'scene_num': scene_data_for_vid_assembly_main.get('scene_number', i_vid_assembly_main_loop + 1), 'key_action': scene_data_for_vid_assembly_main.get('key_plot_beat', ''), 'duration': scene_data_for_vid_assembly_main.get('user_scene_duration_secs', DEFAULT_SCENE_DURATION_SECS)}) # Corrected append target
|
297 |
status_video_assembly_final_op_main.write(f"Adding S{scene_data_for_vid_assembly_main.get('scene_number', i_vid_assembly_main_loop + 1)} ({asset_info_current_scene_for_vid_main.get('type')}).")
|
298 |
else: logger.warning(f"Skipping S{scene_data_for_vid_assembly_main.get('scene_number', i_vid_assembly_main_loop+1)} for video: No valid asset.")
|
299 |
+
if assets_for_final_vid_assembly_list: # Corrected check
|
300 |
status_video_assembly_final_op_main.write("Calling video engine..."); logger.info("APP: Calling visual_engine.assemble_animatic_from_assets")
|
301 |
+
st.session_state.project_final_video_path = st.session_state.visual_content_engine.assemble_animatic_from_assets(asset_data_list=assets_for_final_vid_assembly_list, overall_narration_path=st.session_state.project_overall_narration_audio_path, output_filename="cinegen_ultra_animatic.mp4", fps=24) # Corrected pass
|
302 |
if st.session_state.project_final_video_path and os.path.exists(st.session_state.project_final_video_path): status_video_assembly_final_op_main.update(label="Ultra animatic assembled! π", state="complete", expanded=False); st.balloons()
|
303 |
else: status_video_assembly_final_op_main.update(label="Video assembly failed. Check logs.", state="error", expanded=True); logger.error("APP: Video assembly returned None or file does not exist.")
|
304 |
else: status_video_assembly_final_op_main.update(label="No valid assets for video assembly.", state="error", expanded=True); logger.warning("APP: No valid assets found for video assembly.")
|