# image_handler.py import time from typing import Dict, Any from datetime import datetime import requests import base64 from requests.exceptions import RequestException import tempfile import os class ImageHandler: def __init__(self): self.available_models = ["flux", "flux-realism", "flux-3d", "flux-pro", "flux-anime", "flux-cablyai", "turbo", "flux-dark"] self.base_url = "https://image.pollinations.ai/prompt/{prompt}" def _get_size_dimensions(self, size: str) -> tuple: size_map = { "256x256": (256, 256), "512x512": (512, 512), "1024x1024": (1024, 1024), "1792x1024": (1792, 1024), "1024x1792": (1024, 1792) } return size_map.get(size, (768, 768)) def _save_temp_image(self, image_data: bytes) -> str: """Save image to temporary file and return its URL.""" temp_dir = tempfile.gettempdir() temp_file = os.path.join(temp_dir, f"image_{int(time.time())}.jpg") with open(temp_file, 'wb') as f: f.write(image_data) return f"file://{temp_file}" def generate_images(self, params: Dict[str, Any]) -> Dict[str, Any]: prompt = params.get("prompt") n = min(params.get("n", 1), 10) size = params.get("size", "1024x1024") model = params.get("model", "flux-pro") if model not in self.available_models: model = "flux-pro" response_format = params.get("response_format", "b64_json") if response_format != "b64_json": response_format = "bs64_json" width, height = self._get_size_dimensions(size) headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0", } images = [] for _ in range(n): try: url = self.base_url.format(prompt=prompt) url += f"?width={width}&height={height}&model={model}" response = requests.get(url, headers=headers, timeout=60) response.raise_for_status() # Get the image data image_data = response.content if response_format == "b64_json": # Convert to base64 image_b64 = base64.b64encode(image_data).decode('utf-8') images.append({"b64_json": image_b64}) else: # Two options for URL: # 1. Save locally and return file URL (good for testing) # 2. Return the pollinations URL (might expire) # Option 1: Local file temp_url = self._save_temp_image(image_data) images.append({"url": temp_url}) # Option 2: Pollinations URL (uncomment if preferred) # images.append({"url": url}) except RequestException as e: raise Exception(f"Image generation failed: {str(e)}") return { "created": int(datetime.now().timestamp()), "data": images }