awacke1's picture
Update app.py
531cd37
import gradio as gr
import os
import sys
from pathlib import Path
from PIL import Image
import re
from PIL import Image
import numpy as np
# Coder: Create directories if they don't exist
if not os.path.exists('saved_prompts'):
os.makedirs('saved_prompts')
if not os.path.exists('saved_images'):
os.makedirs('saved_images')
# Humanities: Elegant function to generate a safe filename ๐Ÿ“
def generate_safe_filename(text):
return re.sub('[^a-zA-Z0-9]', '_', text)
def load_models_from_file(filename):
with open(filename, 'r') as f:
return [line.strip() for line in f]
if __name__ == "__main__":
models = load_models_from_file('models.txt')
print(models)
#removed to removed.txt
current_model = models[0]
#text_gen1=gr.Interface.load("spaces/Omnibus/MagicPrompt-Stable-Diffusion_link")
#text_gen1=gr.Interface.load("awacke1/MagicPrompt-Stable-Diffusion", src="spaces")
text_gen1=gr.Interface.load("awacke1/MagicPrompt-Stable-Diffusion", live=True, src="spaces")
models2 = [gr.Interface.load(f"models/{model}", live=True, preprocess=False, src="models") for model in models]
def text_it1(inputs,text_gen1=text_gen1):
go_t1=text_gen1(inputs)
return(go_t1)
def set_model(current_model):
current_model = models[current_model]
return gr.update(label=(f"{current_model}"))
# Analysis: Function to list saved prompts and images ๐Ÿ“Š
def list_saved_prompts_and_images():
saved_prompts = os.listdir('saved_prompts')
saved_images = os.listdir('saved_images')
html_str = "<h2>Saved Prompts and Images:</h2><ul>"
for prompt_file in saved_prompts:
image_file = f"{prompt_file[:-4]}.png"
if image_file in saved_images:
html_str += f'<li>Prompt: {prompt_file[:-4]} | <a href="saved_images/{image_file}" download>Download Image</a></li>'
html_str += "</ul>"
return html_str
# Coder: Modified function to save the prompt and image ๐Ÿ–ผ๏ธ
def send_it1(inputs, model_choice):
proc1 = models2[model_choice]
output1 = proc1(inputs)
safe_filename = generate_safe_filename(inputs[0])
image_path = f"saved_images/{safe_filename}.png"
prompt_path = f"saved_prompts/{safe_filename}.txt"
with open(prompt_path, 'w') as f:
f.write(inputs[0])
# Check the type of output1 before saving
if isinstance(output1, np.ndarray): # If it's a numpy array
Image.fromarray(np.uint8(output1)).save(image_path)
elif isinstance(output1, Image.Image): # If it's already a PIL Image
output1.save(image_path)
elif isinstance(output1, str): # If it's a string (this should not happen in ideal conditions)
print(f"Warning: output1 is a string. Cannot save as image. Value: {output1}")
else:
print(f"Warning: Unexpected type {type(output1)} for output1.")
#Image.fromarray(output1).save(image_path)
saved_output.update(list_saved_prompts_and_images())
return output1
css=""""""
with gr.Blocks(css=css) as myface:
gr.HTML("""<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="twitter:card" content="player"/>
<meta name="twitter:site" content=""/>
<meta name="twitter:player" content="https://omnibus-maximum-multiplier-places.hf.space"/>
<meta name="twitter:player:stream" content="https://omnibus-maximum-multiplier-places.hf.space"/>
<meta name="twitter:player:width" content="100%"/>
<meta name="twitter:player:height" content="600"/>
<meta property="og:title" content="Embedded Live Viewer"/>
<meta property="og:description" content="Tweet Genie - A Huggingface Space"/>
<meta property="og:image" content="https://cdn.glitch.global/80dbe92e-ce75-44af-84d5-74a2e21e9e55/omnicard.png?v=1676772531627"/>
<!--<meta http-equiv="refresh" content="0; url=https://huggingface.co/spaces/corbt/tweet-genie">-->
</head>
</html>
""")
with gr.Row():
with gr.Column(scale=100):
saved_output = gr.HTML(label="Saved Prompts and Images")
with gr.Row():
with gr.Tab("Title"):
gr.HTML("""<title>Prompt to Generate Image</title><div style="text-align: center; max-width: 1500px; margin: 0 auto;">
<h1>Enter a Prompt in Textbox then click Generate Image</h1>""")
with gr.Tab("Tools"):
with gr.Tab("View"):
with gr.Row():
with gr.Column(style="width=50%, height=70%"):
gr.Pil(label="Crop")
with gr.Column(style="width=50%, height=70%"):
gr.Pil(label="Crop")
with gr.Tab("Draw"):
with gr.Column(style="width=50%, height=70%"):
gr.Pil(label="Crop")
with gr.Column(style="width=50%, height=70%"):
gr.Pil(label="Draw")
gr.ImagePaint(label="Draw")
with gr.Tab("Text"):
with gr.Row():
with gr.Column(scale=50):
gr.Textbox(label="", lines=8, interactive=True)
with gr.Column(scale=50):
gr.Textbox(label="", lines=8, interactive=True)
with gr.Tab("Color Picker"):
with gr.Row():
with gr.Column(scale=50):
gr.ColorPicker(label="Color", interactive=True)
with gr.Column(scale=50):
gr.ImagePaint(label="Draw", interactive=True)
with gr.Row():
with gr.Column(scale=100):
magic1=gr.Textbox(lines=4)
run=gr.Button("Generate Image")
with gr.Row():
with gr.Column(scale=100):
model_name1 = gr.Dropdown(label="Select Model", choices=[m for m in models], type="index", value=current_model, interactive=True)
with gr.Row():
with gr.Column(style="width=800px"):
output1=gr.Image(label=(f"{current_model}"))
# Check the type before attempting to save the image
if isinstance(output1, Image.Image): # Check if it's a PIL Image object
output1.save(image_path)
elif isinstance(output1, np.ndarray): # Check if it's a NumPy array
Image.fromarray(np.array(output1, dtype=np.uint8)).save(image_path)
else:
print(f"Warning: Unexpected type {type(output1)} for output1.")
with gr.Row():
with gr.Column(scale=50):
input_text=gr.Textbox(label="Prompt Idea",lines=2)
use_short=gr.Button("Use Short Prompt")
see_prompts=gr.Button("Extend Idea")
with gr.Row():
with gr.Column(scale=100):
saved_output = gr.HTML(label=list_saved_prompts_and_images(), live=True)
def short_prompt(inputs):
return(inputs)
use_short.click(short_prompt,inputs=[input_text],outputs=magic1)
see_prompts.click(text_it1,inputs=[input_text],outputs=magic1)
# Reasoning: Link functions to Gradio components ๐ŸŽ›๏ธ
model_name1.change(set_model, inputs=model_name1, outputs=[output1])
run.click(send_it1, inputs=[magic1, model_name1], outputs=[output1])
myface.queue(concurrency_count=200)
myface.launch(inline=True, show_api=False, max_threads=400)