creative / app.py
artintel235's picture
Update app.py
8a226e2 verified
import gradio as gr
import requests
from io import BytesIO
from PIL import Image
import os
import tempfile
import mimetypes
TOKEN = os.getenv("TOKEN0")
API_URL = os.getenv("API_URL")
token_id = 0
tokens_tried = 0
no_of_accounts = 11
model_id = os.getenv("MODEL_ID")
def get_image_from_url(url):
"""
Fetches and returns an image from a given URL, converting to PNG if needed.
"""
try:
response = requests.get(url, stream=True)
response.raise_for_status()
image = Image.open(BytesIO(response.content))
return image, url # Return the image and the URL
except requests.exceptions.RequestException as e:
return f"Error fetching image: {e}", None
except Exception as e:
return f"Error processing image: {e}", None
def generate_image(prompt, aspect_ratio, realism):
global token_id
global TOKEN
global tokens_tried
global no_of_accounts
global model_id
payload = {
"id": model_id,
"inputs": [prompt, aspect_ratio, str(realism).lower()],
}
headers = {"Authorization": f"Bearer {TOKEN}"}
try:
response_data = requests.post(API_URL, json=payload, headers=headers).json()
if "error" in response_data:
if 'error 429' in response_data['error']:
if tokens_tried < no_of_accounts:
token_id = (token_id + 1) % (no_of_accounts)
tokens_tried += 1
TOKEN = os.getenv(f"TOKEN{token_id}")
response_data = generate_image(prompt, aspect_ratio, realism)
tokens_tried = 0
return response_data
return "No credits available", None
return response_data, None
elif "output" in response_data:
url = response_data['output']
image, url = get_image_from_url(url)
return image, url # Return the image and the URL
else:
return "Error: Unexpected response from server", None
except Exception as e:
return f"Error", None
def download_image(image_url):
if not image_url:
return None # Return None if image_url is empty
try:
response = requests.get(image_url, stream=True)
response.raise_for_status()
# Get the content type from the headers
content_type = response.headers.get('content-type')
extension = mimetypes.guess_extension(content_type)
if not extension:
extension = ".png" # Default to .png if can't determine the extension
# Create a temporary file with the correct extension
with tempfile.NamedTemporaryFile(suffix=extension, delete=False) as tmp_file:
for chunk in response.iter_content(chunk_size=8192):
tmp_file.write(chunk)
temp_file_path = tmp_file.name
return temp_file_path
except Exception as e:
return None
# Define the Gradio interface
interface = gr.Interface(
fn=generate_image,
inputs=[
gr.Textbox(label="Prompt", placeholder="Describe the image you want to generate"),
gr.Radio(
choices=["1:1", "3:4", "4:3", "9:16", "16:9", "9:21", "21:9"],
label="Aspect Ratio",
value="16:9" # Default value
),
gr.Checkbox(label="Realism", value=False), # Checkbox for realism (True/False)
],
outputs=[
gr.Image(type="pil"), # Output image
gr.File(label="Download Image", file_types = [".png", ".jpg", ".jpeg"]), # Output File to be downloaded
],
title="Image Generator",
description="Provide a prompt, select an aspect ratio, and set realism to generate an image.",
)
# Launch the interface
interface.launch()