File size: 3,764 Bytes
5e5fd54
72398d0
 
 
9c51543
8182768
79251e5
72398d0
8a226e2
31520f0
8a226e2
d4bdcdb
0d3242a
683915d
f94dc93
c95b55d
9c51543
314a6d7
9c51543
72398d0
c95b55d
72398d0
 
8182768
 
314a6d7
72398d0
8182768
72398d0
8182768
 
febdcdd
c95b55d
d4bdcdb
 
 
9c51543
89dc556
9c51543
314a6d7
9c51543
 
d4bdcdb
febdcdd
9c51543
d4bdcdb
9c51543
 
d4bdcdb
8a226e2
d4bdcdb
 
9c51543
d4bdcdb
9c51543
8182768
 
9c51543
 
8182768
 
9c51543
8182768
9c51543
8182768
314a6d7
8182768
 
 
 
 
 
79251e5
 
 
 
 
 
 
 
 
 
8182768
 
 
 
 
 
 
 
9c51543
 
c95b55d
 
 
 
 
9c51543
c95b55d
4c8d63a
c95b55d
8182768
 
 
 
9c51543
 
72398d0
5e5fd54
9c51543
314a6d7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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()