|
import gradio as gr |
|
import time |
|
import logging |
|
import threading |
|
import uuid |
|
|
|
|
|
|
|
logging.basicConfig( |
|
level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s" |
|
) |
|
logger = logging.getLogger(__name__) |
|
|
|
def load_model(model_path): |
|
logger.info(f"Attempting to load model from {model_path}...") |
|
try: |
|
demo = gr.load(model_path) |
|
logger.info(f"Successfully loaded demo from {model_path}.") |
|
return demo |
|
except Exception as e: |
|
logger.error(f"Failed to load demo from {model_path}: {e}") |
|
return None |
|
|
|
|
|
demo = load_model("models/John6666/lustify-sdxl-nsfwsfw-v2-sdxl") |
|
|
|
def generate_image(prompt, max_retries=5): |
|
call_id = uuid.uuid4() |
|
thread_id = threading.get_ident() |
|
logger.info(f"Call ID: {call_id}, Thread ID: {thread_id}, Attempt 1: Starting image generation with prompt: {prompt}") |
|
if demo is None: |
|
return None, "Error: Demo failed to load." |
|
|
|
for attempt in range(max_retries): |
|
try: |
|
logger.info(f"Attempt {attempt + 1}: Starting image generation with prompt: {prompt}") |
|
start_time = time.time() |
|
result = demo(prompt) |
|
generation_time = time.time() - start_time |
|
logger.info(f"Generation completed in {generation_time:.2f} seconds") |
|
logger.info(result) |
|
return result, f"Image generated successfully\nGeneration time: {generation_time:.2f} seconds" |
|
except Exception as e: |
|
logger.error(f"Error on attempt {attempt + 1}: {str(e)}") |
|
if attempt < max_retries - 1: |
|
logger.info(f"Retrying... ({attempt + 2}/{max_retries})") |
|
else: |
|
logger.error("Max retries reached. Giving up.") |
|
return None, f"Failed to generate image after {max_retries} attempts. Last error: {str(e)}" |
|
|
|
|
|
return None, "Unexpected error occurred" |
|
|
|
|
|
ROOT_DIR = "./tmp" |
|
|
|
|
|
FILE_EXPLORER_PASSWORD = "secret123" |
|
|
|
def show_image(file_path): |
|
logger.info(f"show_image function called with file_path: {file_path}") |
|
if file_path: |
|
result = file_path[0] if isinstance(file_path, list) else file_path |
|
logger.info(f"Returning file path: {result}") |
|
return result, f"Selected image: {result}" |
|
logger.warning("No file path provided") |
|
return None, "No image selected" |
|
|
|
def check_seed(seed): |
|
logger.info("Seed check initiated") |
|
if seed == FILE_EXPLORER_PASSWORD: |
|
logger.info("Correct seed entered") |
|
return gr.update(visible=True) |
|
else: |
|
logger.info("Incorrect seed entered") |
|
return gr.update(visible=False) |
|
|
|
logger.info("Starting Gradio app") |
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Text-to-Image Generation and File Explorer") |
|
gr.Markdown("Enter a prompt to generate an image or enter the correct seed to access additional features.") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
prompt_input = gr.Textbox(label="Enter your prompt") |
|
seed_input = gr.Textbox(label="Enter seed", type="password") |
|
generate_button = gr.Button("Generate Image") |
|
|
|
file_explorer = gr.FileExplorer( |
|
glob="**/*.webp", |
|
file_count="single", |
|
root_dir=ROOT_DIR, |
|
label="Select a WebP image", |
|
visible=False |
|
) |
|
output_info = gr.Textbox(label="Output Information", lines=3) |
|
|
|
with gr.Column(scale=2): |
|
shared_image = gr.Image(label="Image Display") |
|
|
|
|
|
generate_button.click( |
|
generate_image, |
|
inputs=prompt_input, |
|
outputs=[shared_image, output_info] |
|
) |
|
|
|
seed_input.change( |
|
check_seed, |
|
inputs=seed_input, |
|
outputs=file_explorer |
|
) |
|
|
|
file_explorer.change( |
|
show_image, |
|
inputs=file_explorer, |
|
outputs=[shared_image, output_info] |
|
) |
|
|
|
logger.info("Launching Gradio app") |
|
demo.launch(max_threads=1) |
|
logger.info("Gradio app launched") |
|
|