File size: 4,501 Bytes
5c42955
 
 
 
957256e
 
5c42955
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba92228
5c42955
 
ba92228
5c42955
 
 
 
 
 
 
ba92228
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5c42955
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
957256e
5c42955
957256e
5c42955
 
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
"""
StackNet Demo
"""

import gradio as gr

# Test import of our modules
try:
    from src.ui.tabs import create_all_tabs
    from src.ui.handlers import Handlers
    MODULES_OK = True
except Exception as e:
    MODULES_OK = False
    IMPORT_ERROR = str(e)


def create_demo():
    with gr.Blocks(title="StackNet Demo") as demo:
        gr.Markdown("# StackNet Demo 1:1 Preview")

        if not MODULES_OK:
            gr.Markdown(f"**Import Error:** {IMPORT_ERROR}")
            return demo

        with gr.Accordion("Settings", open=True):
            api_key = gr.Textbox(
                label="StackNet Key",
                placeholder="Enter your key to enable generation...",
                type="password",
                value=""
            )

        with gr.Tabs():
            tabs = create_all_tabs()

        # Collect all buttons to disable when no API key
        all_buttons = [
            tabs["text_to_music"]["generate_btn"],
            tabs["music_to_music"]["cover_btn"],
            tabs["music_to_music"]["stems_btn"],
            tabs["text_to_image"]["generate_btn"],
            tabs["image_to_image"]["edit_btn"],
            tabs["text_to_video"]["generate_btn"],
            tabs["image_to_video"]["animate_btn"],
        ]

        def update_buttons(key):
            enabled = bool(key and key.strip())
            return [gr.update(interactive=enabled) for _ in all_buttons]

        api_key.change(
            fn=update_buttons,
            inputs=[api_key],
            outputs=all_buttons
        )

        # Initially disable all buttons
        demo.load(
            fn=lambda: [gr.update(interactive=False) for _ in all_buttons],
            outputs=all_buttons
        )

        # Text to Music
        ttm = tabs["text_to_music"]
        ttm["generate_btn"].click(
            fn=Handlers.generate_music,
            inputs=[
                ttm["prompt"],
                ttm["tags"],
                ttm["instrumental"],
                ttm["lyrics"],
                ttm["title"],
                api_key
            ],
            outputs=[ttm["output_audio"], ttm["status"]]
        )

        # Music to Music - Cover
        mtm = tabs["music_to_music"]
        mtm["cover_btn"].click(
            fn=Handlers.create_cover,
            inputs=[
                mtm["cover_audio_input"],
                mtm["cover_style_prompt"],
                mtm["cover_tags"],
                mtm["cover_title"],
                api_key
            ],
            outputs=[mtm["cover_output"], mtm["cover_status"]]
        )

        # Music to Music - Stems
        mtm["stems_btn"].click(
            fn=Handlers.extract_stems,
            inputs=[mtm["stems_audio_input"], api_key],
            outputs=[
                mtm["vocals_output"],
                mtm["drums_output"],
                mtm["bass_output"],
                mtm["other_output"],
                mtm["stems_status"]
            ]
        )

        # Text to Image
        tti = tabs["text_to_image"]
        tti["generate_btn"].click(
            fn=Handlers.generate_image,
            inputs=[
                tti["prompt"],
                tti["style"],
                tti["aspect_ratio"],
                api_key
            ],
            outputs=[tti["output_image"], tti["status"]]
        )

        # Image to Image
        iti = tabs["image_to_image"]
        iti["edit_btn"].click(
            fn=Handlers.edit_image,
            inputs=[
                iti["input_image"],
                iti["edit_prompt"],
                iti["strength"],
                api_key
            ],
            outputs=[iti["output_image"], iti["status"]]
        )

        # Text to Video
        ttv = tabs["text_to_video"]
        ttv["generate_btn"].click(
            fn=Handlers.generate_video,
            inputs=[
                ttv["prompt"],
                ttv["duration"],
                ttv["style"],
                api_key
            ],
            outputs=[ttv["output_video"], ttv["status"]]
        )

        # Image to Video
        itv = tabs["image_to_video"]
        itv["animate_btn"].click(
            fn=Handlers.animate_image,
            inputs=[
                itv["input_image"],
                itv["motion_prompt"],
                itv["duration"],
                api_key
            ],
            outputs=[itv["output_video"], itv["status"]]
        )

    return demo


demo = create_demo()

if __name__ == "__main__":
    demo.launch()