From 519b38493d3f402a6583c6331861a737a4fef24b Mon Sep 17 00:00:00 2001 From: Chris Malone Date: Sun, 30 Mar 2025 05:33:41 +1100 Subject: [PATCH] added status and progress bars back --- gradio_server.py | 110 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 2 deletions(-) diff --git a/gradio_server.py b/gradio_server.py index d0fe461..f712ef1 100644 --- a/gradio_server.py +++ b/gradio_server.py @@ -41,6 +41,7 @@ progress_tracker = {} tracker_lock = threading.Lock() file_list = [] last_model_type = None +last_status_string = "" def format_time(seconds): if seconds < 60: @@ -292,6 +293,53 @@ def update_queue_data(): ]) return data +def create_html_progress_bar(percentage=0.0, text="Idle", is_idle=True): + bar_class = "progress-bar-custom idle" if is_idle else "progress-bar-custom" + bar_text_html = f'
{text}
' + + html = f""" +
+
+ {bar_text_html} +
+
+ """ + return html + +def refresh_progress(): + global current_task_id, progress_tracker, last_status_string + task_id_to_check = current_task_id + is_idle = True + status_string = "Starting..." + progress_percent = 0.0 + html_content = "" + + with tracker_lock: + with lock: + processing_or_queued = any(item['state'] in ["Processing", "Queued"] for item in queue) + if task_id_to_check is not None: + progress_data = progress_tracker.get(task_id_to_check) + if progress_data: + is_idle = False + current_step = progress_data.get('current_step', 0) + total_steps = progress_data.get('total_steps', 0) + status = progress_data.get('status', "Starting...") + repeats = progress_data.get("repeats", "0/0") + + if total_steps > 0: + progress_float = min(1.0, max(0.0, float(current_step) / float(total_steps))) + progress_percent = progress_float * 100 + status_string = f"{status} [{repeats}] - {progress_percent:.1f}% complete ({current_step}/{total_steps} steps)" + else: + progress_percent = 0.0 + status_string = f"{status} [{repeats}] - Initializing..." + html_content = create_html_progress_bar(progress_percent, status_string, is_idle) + return gr.update(value=html_content) + +def update_generation_status(html_content): + if(html_content): + return gr.update(value=html_content) + def _parse_args(): parser = argparse.ArgumentParser( description="Generate a video from a text prompt or image using Gradio") @@ -1212,8 +1260,7 @@ def generate_video( cfg_star_switch, cfg_zero_step, state, - image2video, - progress=gr.Progress() #track_tqdm= True + image2video ): @@ -1993,6 +2040,7 @@ def generate_video_tab(image2video=False): with gr.Row(elem_id="image-modal-close-button-row"): close_modal_button = gr.Button("❌", size="sm") modal_image_display = gr.Image(label="Full Resolution Image", interactive=False, show_label=False) + progress_update_trigger = gr.Textbox(value="0", visible=False, label="_progress_trigger") gallery_update_trigger = gr.Textbox(value="0", visible=False, label="_gallery_trigger") with gr.Row(visible= len(loras)>0) as presets_column: lset_choices = [ (preset, preset) for preset in loras_presets ] + [(get_new_preset_msg(advanced), "")] @@ -2217,6 +2265,11 @@ def generate_video_tab(image2video=False): show_advanced.change(fn=switch_advanced, inputs=[state, show_advanced, lset_name], outputs=[advanced_row, preset_buttons_rows, refresh_lora_btn, refresh2_row ,lset_name ]).then( fn=switch_prompt_type, inputs = [state, wizard_prompt_activated_var, wizard_variables_var, prompt, wizard_prompt, *prompt_vars], outputs = [wizard_prompt_activated_var, wizard_variables_var, prompt, wizard_prompt, prompt_column_advanced, prompt_column_wizard, prompt_column_wizard_vars, *prompt_vars]) with gr.Column(): + gen_progress_html = gr.HTML( + label="Status", + value="Idle", + elem_id="generation_progress_bar_container" + ) output = gr.Gallery( label="Generated videos", show_label=False, elem_id="gallery" , columns=[3], rows=[1], object_fit="contain", height=450, selected_index=0, interactive= False) @@ -2284,6 +2337,16 @@ def generate_video_tab(image2video=False): fn=refresh_gallery, inputs=[state], outputs=[gallery_update_trigger] + ).then( + fn=refresh_progress, + inputs=None, + outputs=[progress_update_trigger] + ) + progress_update_trigger.change( + fn=update_generation_status, + inputs=[progress_update_trigger], + outputs=[gen_progress_html], + show_progress="hidden" ) save_settings_btn.click( fn=validate_wizard_prompt, inputs =[state, wizard_prompt_activated_var, wizard_variables_var, prompt, wizard_prompt, *prompt_vars] , outputs= [prompt]).then( save_settings, inputs = [state, prompt, image_prompt_type_radio, video_length, resolution, num_inference_steps, seed, repeat_generation, multi_images_gen_type, guidance_scale, flow_shift, negative_prompt, @@ -2741,6 +2804,49 @@ def create_demo(): #image-modal-close-button-row button { cursor: pointer; } + .progress-container-custom { + width: 100%; + background-color: #e9ecef; + border-radius: 0.375rem; + overflow: hidden; + height: 25px; + position: relative; + margin-top: 5px; + margin-bottom: 5px; + } + .progress-bar-custom { + height: 100%; + background-color: #0d6efd; + transition: width 0.3s ease-in-out; + display: flex; + align-items: center; + justify-content: center; + color: white; + font-size: 0.9em; + font-weight: bold; + white-space: nowrap; + overflow: hidden; + } + .progress-bar-custom.idle { + background-color: #6c757d; + } + .progress-bar-text { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + color: white; + mix-blend-mode: difference; + font-size: 0.9em; + font-weight: bold; + white-space: nowrap; + z-index: 2; + pointer-events: none; + } """ with gr.Blocks(css=css, theme=gr.themes.Soft(primary_hue="sky", neutral_hue="slate", text_size="md")) as demo: gr.Markdown("

Wan 2.1GP v3.3 by DeepBeepMeep (Updates)

")