File size: 5,355 Bytes
cdefade
347cf89
9e18944
31e9635
cdefade
31e9635
 
 
f9f3338
31e9635
cdefade
 
31e9635
7dcaf5a
cdefade
 
31e9635
 
 
 
 
 
17164a6
31e9635
17164a6
 
 
ae18889
17164a6
 
 
 
cdefade
17164a6
 
 
cdefade
31e9635
 
 
cdefade
f9f3338
 
347cf89
 
 
f9f3338
 
 
 
58731cc
6ccb37e
 
347cf89
 
1cbf0c9
 
f9f3338
347cf89
 
 
 
31e9635
cdefade
1cbf0c9
 
 
 
31e9635
 
 
 
1cbf0c9
 
6ccb37e
 
31e9635
1cbf0c9
347cf89
31e9635
 
 
 
 
5d38bdd
01b6505
 
cdefade
 
31e9635
cdefade
 
1cbf0c9
9e18944
 
1cbf0c9
9e18944
 
1cbf0c9
9e18944
 
 
 
 
 
 
cdefade
 
31e9635
 
cdefade
31e9635
 
cdefade
 
 
31e9635
cdefade
31e9635
347cf89
cdefade
 
 
31e9635
cdefade
31e9635
 
cdefade
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import gradio as gr
import prompt_enhancer
import video_merger
from image_utils import extract_frame, get_timestamp_js
from pipeline_manager import generate_video
from ui_modules import (
    CSS, load_template, get_header_html,
    render_column_inputs, render_column_player,
    render_sulphur_vision_suite, render_vip_suite, render_cpu_tools
)

def create_ui():
    with gr.Blocks(delete_cache=(3600, 10800), title="I2V EXTENDED v3.5 VIP") as demo:
        gr.HTML(f"<style>{CSS}</style>" + get_header_html())

        with gr.Row():
            # Column 1: Standard Generation Inputs (scale=4)
            c1 = render_column_inputs()

            # Column 2: Video Player & Output Tools (scale=4)
            c2 = render_column_player()

            # Column 3: Specialized Tool Suite (Stacked Accordions Top-to-Bottom, scale=4)
            with gr.Column(scale=4):
                silver = render_sulphur_vision_suite(
                    input_img=c1['input_image_component']
                )

                vip = render_vip_suite(
                    input_img=c1['input_image_component'],
                    output_video=c2['video_output']
                )

                cpu = render_cpu_tools(
                    input_img=c1['input_image_component']
                )

        # -------------------------------------------------------------
        # GLOBAL ACTION CALLBACKS & CLICK HANDLERS
        # -------------------------------------------------------------

        # Sulphur Vision Enhancer Button Click (No VIP password required!)
        silver['sulphur_enhance_btn'].click(
            fn=prompt_enhancer.call_sulphur_enhancer_api,
            inputs=[
                c1['input_image_component'],
                silver['sulphur_subject_input'],
                silver['sulphur_adegan_input'],
                silver['sulphur_camera_dropdown'],
                silver['sulphur_atmosphere_dropdown'],
                c1['duration_seconds_input'],
                silver['sulphur_mode_dropdown'],
                silver['sulphur_enable_swap_checkbox']
            ],
            outputs=[
                silver['relay_prompt_schedule_input'],
                silver['enable_prompt_relay_checkbox'],
                silver['sulphur_api_status_box'],
                c1['input_image_component']
            ]
        )

        # Main Video Generator Click Handler
        ui_inputs = [
            c1['input_image_component'], c2['last_image_component'], c1['prompt_input'], vip['steps_slider'],
            vip['negative_prompt_input'], c1['duration_seconds_input'],
            vip['guidance_scale_input'], vip['guidance_scale_2_input'], vip['seed_input'], vip['randomize_seed_checkbox'],
            vip['quality_slider'], vip['scheduler_dropdown'], vip['flow_shift_slider'], c1['frame_multi'],
            c1['motion_extension_dropdown'],
            c1['safe_mode_checkbox'],
            c1['custom_lora_url_input'],
            c1['custom_lora_scale_input'],
            silver['enable_prompt_relay_checkbox'],
            silver['relay_prompt_schedule_input'],
            gr.State(None),
            gr.State("Female Faces Only"),
            c2['play_result_video'],
            vip['custom_filename_input'],
            c1['noise_temperature_slider'],
            vip['enable_vip_rife_checkbox'],
            vip['vip_rife_multiplier_radio'],
            vip['vip_rife_mode_dropdown'],
            vip['vip_rife_upscale_checkbox'],
            vip['vip_rife_enhance_face_checkbox'],
            vip['vip_master_password_input'],
            c1['cached_lora_dropdown'],
            c1['extra_gpu_buffer_slider']
        ]
        
        c1['generate_button'].click(
            fn=generate_video, 
            inputs=ui_inputs, 
            outputs=[c2['video_output'], c2['file_output'], vip['seed_input'], c2['gpu_report_box']]
        )

        # Standalone Manual Video Merge Click Handlers
        c2['append_merge_btn'].click(
            fn=video_merger.handle_append_video,
            inputs=[c2['file_output'], c2['merge_queue_state'], vip['custom_filename_input']],
            outputs=[c2['merged_video_output'], c2['merged_file_output'], c2['merge_queue_state'], c2['merge_status_box']]
        )

        c2['clear_merge_btn'].click(
            fn=video_merger.handle_clear_merge_queue,
            inputs=None,
            outputs=[c2['merged_video_output'], c2['merged_file_output'], c2['merge_queue_state'], c2['merge_status_box']]
        )

        # 3-Way Instant Video Frame Extraction Handlers
        c2['grab_frame_btn'].click(
            fn=extract_frame,
            inputs=[c2['video_output'], c2['timestamp_box']],
            outputs=[c1['input_image_component'], c2['timestamp_box']],
            js=get_timestamp_js
        )

        c2['grab_last_frame_btn'].click(
            fn=extract_frame,
            inputs=[c2['video_output'], c2['timestamp_box']],
            outputs=[c2['last_image_component'], c2['timestamp_box']],
            js=get_timestamp_js
        )

        c2['grab_swap_target_btn'].click(
            fn=extract_frame,
            inputs=[c2['video_output'], c2['timestamp_box']],
            outputs=[cpu['tool_target_img'], c2['timestamp_box']],
            js=get_timestamp_js
        )

        gr.HTML(load_template("footer.html"))

    return demo