Spaces:
Running
Running
| import requests | |
| from PIL import Image, PngImagePlugin | |
| import base64 | |
| import os | |
| from datetime import datetime | |
| import io | |
| import yaml | |
| # Configuration | |
| IMAGE_GENERATION_URL = os.getenv("SD_API_URL") | |
| CACHE_DIR = '/tmp/cache' # Use /tmp directory which is writable | |
| IMGBB_API_KEY = os.getenv("IMGBB_API_KEY") # Replace with your ImgBB API key | |
| # Ensure the cache directory exists | |
| os.makedirs(CACHE_DIR, exist_ok=True) | |
| def load_config(): | |
| with open('config.yaml', 'r') as f: | |
| return yaml.safe_load(f) | |
| def upload_to_imgbb(image_path, file_name): | |
| """ | |
| Uploads image file to ImgBB and returns the URL. | |
| Args: | |
| image_path (str): Path to the image file. | |
| file_name (str): Name of the image file. | |
| Returns: | |
| str: URL of the uploaded image on ImgBB. | |
| """ | |
| try: | |
| with open(image_path, 'rb') as f: | |
| image_data = f.read() | |
| response = requests.post( | |
| "https://api.imgbb.com/1/upload", | |
| params={ | |
| "key": IMGBB_API_KEY, | |
| }, | |
| files={ | |
| "image": (file_name, image_data) | |
| } | |
| ) | |
| response.raise_for_status() | |
| result = response.json() | |
| if result["data"] and "url" in result["data"]: | |
| return result["data"]["url"] | |
| else: | |
| print("Failed to upload image to ImgBB.") | |
| return None | |
| except requests.RequestException as e: | |
| print(f"Error uploading image to ImgBB: {e}") | |
| return None | |
| except Exception as e: | |
| print(f"Unexpected error uploading image to ImgBB: {e}") | |
| return None | |
| def generate_sd(prompt): | |
| """ | |
| Generate an image using the specified prompt and save it to the cache directory. | |
| Embeds the YAML payload into the image metadata. | |
| Returns: | |
| image_data (bytes): Raw image data as bytes. | |
| image_path (str): Absolute path to the saved image file using forward slashes. | |
| image_url (str): URL of the uploaded image on ImgBB. | |
| """ | |
| config = load_config() | |
| config = config['config'] | |
| # Define payload for the POST request | |
| payload = { | |
| "prompt": prompt, | |
| "steps": config['SD']['steps'], | |
| "width": config['SD']['width'], | |
| "height": config['SD']['height'], | |
| "sampler_name": config['SD']['sampler_name'], | |
| "seed": -1, | |
| "cfg_scale": config['SD']['cfg_scale'], | |
| "negative_prompt": config['SD']['negative_prompt'], | |
| } | |
| try: | |
| # Send POST request to the image generation endpoint | |
| response = requests.post(IMAGE_GENERATION_URL, json=payload) | |
| response.raise_for_status() # Raise an exception for HTTP errors | |
| r = response.json() | |
| # Decode the image and save it to the cache folder | |
| if 'images' in r and r['images']: | |
| image_data = base64.b64decode(r['images'][0]) | |
| timestamp = datetime.now().strftime("%Y%m%d%H%M%S") | |
| image_filename = f"image_{timestamp}.png" | |
| image_path = os.path.abspath(os.path.join(CACHE_DIR, image_filename)) | |
| # Save the image as a PNG file | |
| with open(image_path, 'wb') as f: | |
| f.write(image_data) | |
| # Open the image with Pillow | |
| img = Image.open(image_path) | |
| # Convert payload to YAML string | |
| yaml_data = yaml.dump(payload) | |
| # Embed YAML data into image metadata | |
| metadata = PngImagePlugin.PngInfo() | |
| metadata.add_text("YAML", yaml_data) | |
| # Save the image with updated metadata | |
| img.save(image_path, "PNG", pnginfo=metadata) | |
| # Upload image to ImgBB | |
| image_url = upload_to_imgbb(image_path, image_filename) | |
| # Convert the path to use forward slashes | |
| image_path = image_path.replace('\\', '/') | |
| return image_data, image_path | |
| else: | |
| print("No images found in the response.") | |
| return None, None | |
| except requests.RequestException as e: | |
| print(f"HTTP request error: {e}") | |
| return None, None | |
| except Exception as e: | |
| print(f"Error generating image: {e}") | |
| return None, None | |