# ui.py # Gradio UI dla tomasz-svd (Etap 1–4) import base64 from io import BytesIO import gradio as gr from PIL import Image from core import ( ui_generate, generate_script, generate_music, convert_to_mp3, generate_video_from_b64, ) def build_ui(): with gr.Blocks() as demo: gr.Markdown("# tomasz-svd — AutoAd Studio (Etap 1–4)") # TAB 1 with gr.Tab("1. Analiza domeny"): domain_in = gr.Textbox(label="Domena", placeholder="example.com") btn = gr.Button("Analizuj") out_html = gr.HTML() auto_prompt = gr.Textbox(label="Auto prompt", lines=4) brand_domain = gr.Textbox(label="Domena (czysta)") brand_text = gr.Textbox(label="Tekst (skrót)", lines=6) images_state = gr.State([]) gallery = gr.Gallery(label="Obrazy (podgląd)") def _ui_generate(domain): html, prompt, dom, txt, imgs = ui_generate(domain) pil_list = [] for b in imgs: try: img_data = base64.b64decode(b.split(",")[1]) pil_list.append(Image.open(BytesIO(img_data))) except: pass return html, prompt, dom, txt, imgs, pil_list btn.click( _ui_generate, inputs=domain_in, outputs=[out_html, auto_prompt, brand_domain, brand_text, images_state, gallery] ) # TAB 2 with gr.Tab("2. Scenariusz (LLM)"): length = gr.Slider(5, 60, value=15, step=5, label="Długość") style = gr.Dropdown( ["energetyczny TikTok", "premium elegancki", "luźny młodzieżowy", "poważny biznesowy"], value="energetyczny TikTok", label="Styl" ) btn2 = gr.Button("Generuj scenariusz") script_out = gr.Code(label="JSON") btn2.click( generate_script, inputs=[auto_prompt, brand_domain, brand_text, length, style], outputs=script_out ) # TAB 3 with gr.Tab("3. Audio (MusicGen + FFmpeg)"): music_prompt = gr.Textbox(label="Prompt muzyczny", value="energetic modern ad music") duration = gr.Slider(5, 30, value=15, step=1, label="Długość muzyki") btn3 = gr.Button("Generuj muzykę") audio_out = gr.Audio(label="Muzyka", type="filepath") def _gen_audio(p, d): wav = generate_music(p, d) mp3 = convert_to_mp3(wav) return mp3 btn3.click(_gen_audio, inputs=[music_prompt, duration], outputs=audio_out) # TAB 4 with gr.Tab("4. Wideo (FFmpeg CPU)"): gr.Markdown("Generowanie finalnego wideo MP4 z obrazów (Etap 1), scenariusza (Etap 2) i muzyki (Etap 3).") audio_in = gr.Audio(label="Muzyka z Etapu 3", type="filepath") btn4 = gr.Button("Generuj wideo") video_out = gr.Video(label="Finalne wideo MP4") def _gen_video(imgs_b64, script, audio_path): if not imgs_b64 or not script or not audio_path: return None return generate_video_from_b64(imgs_b64, script, audio_path) btn4.click( _gen_video, inputs=[images_state, script_out, audio_in], outputs=video_out ) return demo if __name__ == "__main__": ui = build_ui() ui.launch(server_name="0.0.0.0", server_port=7860, share=False)