4040from generate_podcast import validate_speakers , update_elevenlabs_quota
4141from utils import get_asset_path , sanitize_app_settings_for_backend , find_ffplay_path , get_app_data_dir , sanitize_text
4242from create_demo import create_html_demo_whisperx
43- from config import AVAILABLE_VOICES , DEFAULT_APP_SETTINGS
43+ from config import AVAILABLE_VOICES , DEFAULT_APP_SETTINGS , DEMO_AVAILABLE
4444
4545# --- Versioning ---
4646# This file is automatically generated by setuptools-scm
@@ -92,6 +92,7 @@ def __init__(self, root: tk.Tk, generate_func, logger, api_key: str, default_scr
9292 self .ffplay_path = find_ffplay_path ()
9393 self .is_whisperx_available = self .check_whisperx_availability ()
9494 self .elevenlabs_quota_text = None # New state variable
95+ self .demo_available = DEMO_AVAILABLE # Read environment variable
9596
9697 self .app_settings = self .load_settings ()
9798 self .provider_var = tk .StringVar (value = self .app_settings .get ("tts_provider" , "elevenlabs" ).lower ())
@@ -233,16 +234,17 @@ def _setup_ctk_menu(self):
233234 self .settings_menu .add_option ("Quit" , command = self .root .quit )
234235
235236 # Menu Actions
236- actions_button = self .menu_bar .add_cascade ("Actions" )
237- self .actions_menu = CTkMenuBar .CustomDropdownMenu (
238- widget = actions_button ,
239- corner_radius = 3 ,
240- border_width = 1 ,
241- border_color = ("gray70" , "gray25" )
242- )
243- self .demo_menu_item = self .actions_menu .add_option ("Generate HTML Demo..." ,
244- command = self .start_demo_generation_thread ,
245- state = 'disabled' )
237+ if self .demo_available :
238+ actions_button = self .menu_bar .add_cascade ("Actions" )
239+ self .actions_menu = CTkMenuBar .CustomDropdownMenu (
240+ widget = actions_button ,
241+ corner_radius = 3 ,
242+ border_width = 1 ,
243+ border_color = ("gray70" , "gray25" )
244+ )
245+ self .demo_menu_item = self .actions_menu .add_option ("Generate HTML Demo..." ,
246+ command = self .start_demo_generation_thread ,
247+ state = 'disabled' )
246248
247249 # Menu Help
248250 help_button = self .menu_bar .add_cascade ("Help" )
@@ -302,12 +304,13 @@ def _setup_tkinter_menu(self):
302304 self .settings_menu .add_command (label = "Quit" , command = self .root .quit )
303305
304306 # --- Actions Menu ---
305- self .actions_menu = tk .Menu (self .menubar , tearoff = 0 )
306- self ._apply_menu_theme (self .actions_menu )
307- self .menubar .add_cascade (label = "Actions" , menu = self .actions_menu )
308- self .actions_menu .add_command (label = "Generate HTML Demo..." ,
309- command = self .start_demo_generation_thread ,
310- state = 'disabled' )
307+ if self .demo_available :
308+ self .actions_menu = tk .Menu (self .menubar , tearoff = 0 )
309+ self ._apply_menu_theme (self .actions_menu )
310+ self .menubar .add_cascade (label = "Actions" , menu = self .actions_menu )
311+ self .actions_menu .add_command (label = "Generate HTML Demo..." ,
312+ command = self .start_demo_generation_thread ,
313+ state = 'disabled' )
311314
312315 # Help Menu (common to all platforms)
313316 self .help_menu = tk .Menu (self .menubar , tearoff = 0 )
@@ -373,6 +376,8 @@ def update_voice_settings_enabled_ctk(self):
373376
374377 def update_demo_menu_state_ctk (self , enabled ):
375378 """Met à jour l'état du menu demo avec CTkMenuBarPlus."""
379+ if not self .demo_available :
380+ return
376381 try :
377382 if hasattr (self .actions_menu , 'configure_option' ) and self .demo_menu_item :
378383 state = 'normal' if enabled else 'disabled'
@@ -885,20 +890,6 @@ def _wait_for_cache():
885890 # If not using ElevenLabs or cache is ready, open immediately.
886891 self ._show_settings_window ()
887892
888- def _show_settings_window (self ):
889- """Creates and displays the actual settings window."""
890- from settings_window import VoiceSettingsWindow
891- VoiceSettingsWindow (
892- self .root ,
893- current_settings = self .app_settings ,
894- save_callback = self .save_settings ,
895- close_callback = self .on_settings_window_close ,
896- default_settings = DEFAULT_APP_SETTINGS ,
897- preloaded_elevenlabs_voices = self .elevenlabs_voices_cache ,
898- play_gemini_sample_callback = self .play_gemini_voice_sample ,
899- play_elevenlabs_sample_callback = self .play_elevenlabs_voice_sample
900- )
901-
902893 def show_about_window (self ):
903894 """Displays the 'About' window."""
904895 AboutWindow (self .root , version = get_app_version ())
@@ -1043,7 +1034,8 @@ def start_generation_thread(self):
10431034 except :
10441035 pass
10451036 else :
1046- self .actions_menu .entryconfig ("Generate HTML Demo..." , state = 'disabled' )
1037+ if self .demo_available :
1038+ self .actions_menu .entryconfig ("Generate HTML Demo..." , state = 'disabled' )
10471039 self .menubar .entryconfig ("Settings" , state = "disabled" )
10481040
10491041 # Show and start the progress bar
@@ -1125,14 +1117,19 @@ def on_generation_complete(self, success: bool):
11251117 if HAS_CTK_MENUBAR :
11261118 self .update_demo_menu_state_ctk (can_generate_demo )
11271119 else :
1128- self .actions_menu .entryconfig ("Generate HTML Demo..." , state = 'normal' if can_generate_demo else 'disabled' )
1120+ if self .demo_available :
1121+ self .actions_menu .entryconfig ("Generate HTML Demo..." , state = 'normal' if can_generate_demo else 'disabled' )
1122+
11291123
11301124 if self .progress_bar .winfo_ismapped ():
11311125 self .progress_bar .pack_forget ()
11321126 self .log_text .configure (state = 'disabled' ) # Disable the log area at the very end
11331127
11341128 def start_demo_generation_thread (self ):
11351129 """Opens a dialog to get demo settings, then starts the generation."""
1130+ if not self .demo_available :
1131+ return
1132+
11361133 if not self .last_generated_filepath or not self .last_generated_script :
11371134 messagebox .showwarning ("No Data" , "Please generate a podcast first before creating a demo." ,
11381135 parent = self .root )
@@ -1156,7 +1153,8 @@ def _on_demo_settings_confirmed(self, title: str, subtitle: str, output_dir: str
11561153 if HAS_CTK_MENUBAR :
11571154 self .update_demo_menu_state_ctk (False )
11581155 else :
1159- self .actions_menu .entryconfig ("Generate HTML Demo..." , state = 'disabled' )
1156+ if self .demo_available :
1157+ self .actions_menu .entryconfig ("Generate HTML Demo..." , state = 'disabled' )
11601158
11611159 thread = threading .Thread (
11621160 target = self .run_demo_generation ,
@@ -1196,8 +1194,9 @@ def run_demo_generation(self, script_content: str, audio_filepath: str, title: s
11961194 if HAS_CTK_MENUBAR :
11971195 self .root .after (0 , lambda : self .update_demo_menu_state_ctk (can_generate_demo ))
11981196 else :
1199- self .root .after (0 , lambda : self .actions_menu .entryconfig ("Generate HTML Demo..." ,
1200- state = 'normal' if can_generate_demo else 'disabled' ))
1197+ if self .demo_available :
1198+ self .root .after (0 , lambda : self .actions_menu .entryconfig ("Generate HTML Demo..." ,
1199+ state = 'normal' if can_generate_demo else 'disabled' ))
12011200 # Clean up the temporary file
12021201 if temp_script_file and os .path .exists (temp_script_file ):
12031202 os .remove (temp_script_file )
@@ -1526,8 +1525,6 @@ def _run_fetch():
15261525 self .logger .warning (f"Failed to pre-fetch ElevenLabs voices: { e } " )
15271526 self .elevenlabs_voices_cache = []
15281527
1529- threading .Thread (target = _run_fetch , daemon = True ).start ()
1530-
15311528
15321529def show_error_and_log (* args ):
15331530 """Global exception handler with improved debugging."""
0 commit comments