import gradio as gr import pandas as pd import random import json with open("presets.json") as f: presets = json.load(f) camera_lens_map = presets # placeholders # rebuild camera_lens_map and camera_film_map from presets camera_lens_map = {p: [presets[p]['lens']] for p in presets} camera_film_map = {p: [presets[p]['film']] for p in presets} light_conditions = list({p: presets[p]['light'] for p in presets}.values()) mj_versions = ["6","6.1","7"] scene_variations = ["with dramatic lens flare","with soft bokeh background"] * 10 def apply_preset(p): pre = presets[p] return pre['camera'], pre['lens'], pre['film'], pre['light'], pre['scene'] def generate_mid(camera, lens, film, light, mjv, ar, q, s, seed, scene, num): prompts=[] for i in range(num): var = random.choice(scene_variations) sc = f"{scene}, {var}" args = f"--ar {ar} --q {q} --s {s}" + (f" --seed {seed}" if seed else "") prompts.append(f"{sc}, shot with {camera} and {lens}, using {film} film, under {light} {args} --v {mjv}") return "\n".join(prompts), prompts def generate_sora(camera, lens, film, light, scene): var = random.choice(scene_variations) sc = f"{scene}, {var}" p = f"A detailed scene of {sc}, captured using a {camera} and {lens}, simulated with {film} film look and {light} lighting." return p, [p] def export_txt(prompts): with open("prompts.txt","w") as f: f.write("\n".join(prompts)) return gr.File.update(value="prompts.txt") def export_csv(prompts): df=pd.DataFrame({"Prompt":prompts}) df.to_csv("prompts.csv", index=False) return gr.File.update(value="prompts.csv") with gr.Blocks() as demo: gr.Markdown("## TischEins.org | Midjourney Prompt Engine\nPro Studio Prompt Generator for Midjourney and Sora") preset = gr.Dropdown(choices=list(presets.keys()), label="Select Preset") camera = gr.Dropdown(choices=list(camera_lens_map.keys()), label="Camera Model") lens = gr.Dropdown(choices=[], label="Lens Model") film = gr.Dropdown(choices=[], label="Color Film Type") light = gr.Dropdown(choices=light_conditions, label="Light Condition") preset.change(fn=apply_preset, inputs=preset, outputs=[camera, lens, film, light, scene := gr.Textbox(label="Scene Description")]) camera.change(fn=lambda x: gr.update(choices=camera_lens_map[x]), inputs=camera, outputs=lens) camera.change(fn=lambda x: gr.update(choices=camera_film_map[x]), inputs=camera, outputs=film) with gr.Tab("Midjourney"): mjv = gr.Dropdown(choices=mj_versions, label="Midjourney Version", value="7") ar = gr.Textbox(label="Aspect Ratio", value="5:4") q = gr.Textbox(label="Quality", value="2") s = gr.Textbox(label="Stylize", value="0") seed = gr.Textbox(label="Seed (optional)") num = gr.Slider(1,5,value=3,label="Number of Prompts") out_mid, state_mid = gr.Textbox(lines=10), gr.State([]) gen = gr.Button("Generate") gen.click(fn=generate_mid, inputs=[camera, lens, film, light, mjv, ar, q, s, seed, scene, num], outputs=[out_mid, state_mid]) txtb = gr.Button("Export TXT"); csvb = gr.Button("Export CSV") dtxt = gr.File(visible=False); dcsv = gr.File(visible=False) txtb.click(export_txt, state_mid, dtxt); csvb.click(export_csv, state_mid, dcsv) with gr.Tab("ChatGPT Sora"): out_s, state_s = gr.Textbox(lines=5), gr.State([]) gen_s = gr.Button("Generate") gen_s.click(fn=generate_sora, inputs=[camera, lens, film, light, scene], outputs=[out_s, state_s]) txt_s = gr.Button("Export TXT"); csv_s = gr.Button("Export CSV") dtxt_s = gr.File(visible=False); dcsv_s = gr.File(visible=False) txt_s.click(export_txt, state_s, dtxt_s); csv_s.click(export_csv, state_s, dcsv_s) gr.Markdown('Pro Studio Mode by TischEins.org') demo.launch()