Update app.py
Browse files
app.py
CHANGED
@@ -6,7 +6,7 @@ import logging
|
|
6 |
# --- Streamlit PermissionError Mitigation Attempts ---
|
7 |
if "STREAMLIT_CLIENT_GATHER_USAGE_STATS" not in os.environ:
|
8 |
os.environ["STREAMLIT_CLIENT_GATHER_USAGE_STATS"] = "false"
|
9 |
-
if "STREAMLIT_BROWSER_GATHERUSAGESTATS" not in os.environ:
|
10 |
os.environ["STREAMLIT_BROWSER_GATHERUSAGESTATS"] = "false"
|
11 |
streamlit_home_path_app = "/app/.streamlit_cai_config_v3"
|
12 |
if "STREAMLIT_HOME" not in os.environ and os.getcwd().startswith("/app"):
|
@@ -185,13 +185,13 @@ if not st.session_state.project_story_treatment_scenes_list: st.info("Use the si
|
|
185 |
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 |
-
treatment_display_col, visual_display_col = st.columns([0.45, 0.55])
|
195 |
|
196 |
with treatment_display_col:
|
197 |
with st.expander("π Scene Treatment & Controls", expanded=True):
|
@@ -217,21 +217,21 @@ else:
|
|
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 |
-
# <<<
|
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 |
-
|
|
|
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:
|
233 |
if st.session_state.project_story_treatment_scenes_list:
|
234 |
-
err_msg_disp_main_area = asset_info_main_disp.get('error_message', 'Visual pending
|
235 |
st.caption(err_msg_disp_main_area)
|
236 |
|
237 |
with st.popover(f"βοΈ Edit S{scene_num_for_display} Treatment"):
|
@@ -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 |
-
assets_for_final_vid_assembly_list = []
|
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)})
|
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:
|
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)
|
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.")
|
|
|
6 |
# --- Streamlit PermissionError Mitigation Attempts ---
|
7 |
if "STREAMLIT_CLIENT_GATHER_USAGE_STATS" not in os.environ:
|
8 |
os.environ["STREAMLIT_CLIENT_GATHER_USAGE_STATS"] = "false"
|
9 |
+
if "STREAMLIT_BROWSER_GATHERUSAGESTATS" not in os.environ: # For newer versions
|
10 |
os.environ["STREAMLIT_BROWSER_GATHERUSAGESTATS"] = "false"
|
11 |
streamlit_home_path_app = "/app/.streamlit_cai_config_v3"
|
12 |
if "STREAMLIT_HOME" not in os.environ and os.getcwd().startswith("/app"):
|
|
|
185 |
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') # Used for caption
|
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])
|
195 |
|
196 |
with treatment_display_col:
|
197 |
with st.expander("π Scene Treatment & Controls", expanded=True):
|
|
|
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 |
+
with visual_display_col: # <<< USING THE CORRECT VARIABLE NAME HERE >>>
|
|
|
221 |
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
|
222 |
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']):
|
223 |
path_asset_main = asset_info_main_disp['path']; type_asset_main = asset_info_main_disp.get('type','image')
|
224 |
+
# <<< CORRECTED VARIABLE NAME IN CAPTION F-STRING >>>
|
225 |
+
if type_asset_main == 'image': st.image(path_asset_main, caption=f"S{scene_num_for_display} ({type_asset_main}): {scene_title_for_display_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}): {scene_title_for_display_main}") # Corrected here too
|
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:
|
233 |
if st.session_state.project_story_treatment_scenes_list:
|
234 |
+
err_msg_disp_main_area = asset_info_main_disp.get('error_message', 'Visual pending or failed.') if asset_info_main_disp else 'Visual pending or failed.'
|
235 |
st.caption(err_msg_disp_main_area)
|
236 |
|
237 |
with st.popover(f"βοΈ Edit S{scene_num_for_display} Treatment"):
|
|
|
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 = []
|
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)})
|
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:
|
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)
|
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.")
|