import gradio as gr import threading import os import shutil import tempfile import time from util import process_multi_image_edit, process_local_image_edit, download_and_check_result_nsfw from nfsw import NSFWDetector # Configuration parameters FREE_TRY_N = 20 # Free phase: first 20 tries without restrictions SLOW_TRY_N = 30 # Slow phase start: 30 tries SLOW2_TRY_N = 40 # Slow phase start: 30 tries RATE_LIMIT_60 = 60 # Full restriction: blocked after 60 tries # Time window configuration (minutes) PHASE_1_WINDOW = 5 # 20-30 tries: 3 minutes PHASE_2_WINDOW = 8 # 30-40 tries: 6 minutes PHASE_3_WINDOW = 15 # 40-60 tries: 10 minutes MAX_IMAGES_PER_WINDOW = 2 # Max images per time window IP_Dict = {} # IP generation statistics and time window tracking IP_Generation_Count = {} # Record total generation count for each IP IP_Rate_Limit_Track = {} # Record generation count and timestamp in current time window for each IP def get_ip_generation_count(client_ip): """ Get IP generation count """ if client_ip not in IP_Generation_Count: IP_Generation_Count[client_ip] = 0 return IP_Generation_Count[client_ip] def increment_ip_generation_count(client_ip): """ Increment IP generation count """ if client_ip not in IP_Generation_Count: IP_Generation_Count[client_ip] = 0 IP_Generation_Count[client_ip] += 1 return IP_Generation_Count[client_ip] def get_ip_phase(client_ip): """ Get current phase for IP Returns: str: 'free', 'rate_limit_1', 'rate_limit_2', 'rate_limit_3', 'blocked' """ count = get_ip_generation_count(client_ip) if count < FREE_TRY_N: # 0-19 tries return 'free' elif count < SLOW_TRY_N: # 20-29 tries return 'rate_limit_1' # NSFW blur + 3 minutes 2 images elif count < SLOW2_TRY_N: # 30-39 tries return 'rate_limit_2' # NSFW blur + 6 minutes 2 images elif count < RATE_LIMIT_60: # 40-59 tries return 'rate_limit_3' # NSFW blur + 10 minutes 2 images else: # 60+ tries return 'blocked' # Generation blocked def check_rate_limit_for_phase(client_ip, phase): """ Check rate limit for specific phase Returns: tuple: (is_limited, wait_time_minutes, current_count) """ if phase not in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3']: return False, 0, 0 # Determine time window if phase == 'rate_limit_1': window_minutes = PHASE_1_WINDOW # 3 minutes elif phase == 'rate_limit_2': window_minutes = PHASE_2_WINDOW # 6 minutes else: # rate_limit_3 window_minutes = PHASE_3_WINDOW # 10 minutes current_time = time.time() window_key = f"{client_ip}_{phase}" # Clean expired records if window_key in IP_Rate_Limit_Track: track_data = IP_Rate_Limit_Track[window_key] # Check if within current time window if current_time - track_data['start_time'] > window_minutes * 60: # Time window expired, reset IP_Rate_Limit_Track[window_key] = { 'count': 0, 'start_time': current_time, 'last_generation': current_time } else: # Initialize IP_Rate_Limit_Track[window_key] = { 'count': 0, 'start_time': current_time, 'last_generation': current_time } track_data = IP_Rate_Limit_Track[window_key] # Check if exceeded limit if track_data['count'] >= MAX_IMAGES_PER_WINDOW: # Calculate remaining wait time elapsed = current_time - track_data['start_time'] wait_time = (window_minutes * 60) - elapsed wait_minutes = max(0, wait_time / 60) return True, wait_minutes, track_data['count'] return False, 0, track_data['count'] def record_generation_attempt(client_ip, phase): """ Record generation attempt """ # Increment total count increment_ip_generation_count(client_ip) # Record time window count if phase in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3']: window_key = f"{client_ip}_{phase}" current_time = time.time() if window_key in IP_Rate_Limit_Track: IP_Rate_Limit_Track[window_key]['count'] += 1 IP_Rate_Limit_Track[window_key]['last_generation'] = current_time else: IP_Rate_Limit_Track[window_key] = { 'count': 1, 'start_time': current_time, 'last_generation': current_time } def apply_gaussian_blur_to_image_url(image_url, blur_strength=50): """ Apply Gaussian blur to image URL Args: image_url (str): Original image URL blur_strength (int): Blur strength, default 50 (heavy blur) Returns: PIL.Image: Blurred PIL Image object """ try: import requests from PIL import Image, ImageFilter import io # Download image response = requests.get(image_url, timeout=30) if response.status_code != 200: return None # Convert to PIL Image image_data = io.BytesIO(response.content) image = Image.open(image_data) # Apply heavy Gaussian blur blurred_image = image.filter(ImageFilter.GaussianBlur(radius=blur_strength)) return blurred_image except Exception as e: print(f"⚠️ Failed to apply Gaussian blur: {e}") return None # Initialize NSFW detector (download from Hugging Face) try: nsfw_detector = NSFWDetector() # Auto download falconsai_yolov9_nsfw_model_quantized.pt from Hugging Face print("✅ NSFW detector initialized successfully") except Exception as e: print(f"❌ NSFW detector initialization failed: {e}") nsfw_detector = None def edit_image_interface(input_image1, input_image2, input_image3, prompt, aspect_ratio, request: gr.Request, progress=gr.Progress()): """ Interface function for processing multi-image editing with phase-based limitations """ try: # Extract user IP client_ip = request.client.host x_forwarded_for = dict(request.headers).get('x-forwarded-for') if x_forwarded_for: client_ip = x_forwarded_for if client_ip not in IP_Dict: IP_Dict[client_ip] = 0 IP_Dict[client_ip] += 1 # Validate input images input_images = [input_image1, input_image2, input_image3] valid_images = [img for img in input_images if img is not None] if len(valid_images) < 2: return None, "Please upload at least 2 images", gr.update(visible=False) if len(valid_images) > 3: return None, "Maximum 3 images allowed", gr.update(visible=False) if not prompt or prompt.strip() == "": return None, "Please enter editing prompt", gr.update(visible=False) # Check if prompt length is greater than 3 characters if len(prompt.strip()) <= 3: return None, "❌ Editing prompt must be more than 3 characters", gr.update(visible=False) except Exception as e: print(f"⚠️ Request preprocessing error: {e}") return None, "❌ Request processing error", gr.update(visible=False) # Get user current phase current_phase = get_ip_phase(client_ip) current_count = get_ip_generation_count(client_ip) print(f"📊 User phase info - IP: {client_ip}, current phase: {current_phase}, generation count: {current_count}") # Check if completely blocked if current_phase == 'blocked': # Generate blocked limit button blocked_button_html = f"""
""" return None, f"❌ You have reached Hugging Face's free generation limit. Please visit https://omnicreator.net/multi-image-edit#generator for unlimited generation", gr.update(value=blocked_button_html, visible=True) # Check rate limit (applies to rate_limit phases) if current_phase in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3']: is_limited, wait_minutes, window_count = check_rate_limit_for_phase(client_ip, current_phase) if is_limited: wait_minutes_int = int(wait_minutes) + 1 # Generate rate limit button rate_limit_button_html = f""" """ return None, f"❌ You have reached Hugging Face's free generation limit. Please visit https://omnicreator.net/multi-image-edit#generator for unlimited generation, or wait {wait_minutes_int} minutes before generating again", gr.update(value=rate_limit_button_html, visible=True) # Parse aspect ratio to get width and height width, height = 0, 0 # Default to auto sizing if aspect_ratio and aspect_ratio != "Auto": aspect_ratios = { "16:9": (1364, 768), "4:3": (1182, 887), "1:1": (1024, 1024), "3:4": (887, 1182), "9:16": (768, 1364) } if aspect_ratio in aspect_ratios: width, height = aspect_ratios[aspect_ratio] # Handle NSFW detection based on phase is_nsfw_task = False # Track if this task involves NSFW content # Skip NSFW detection in free phase - check first image for NSFW if current_phase != 'free' and nsfw_detector is not None and valid_images: try: nsfw_result = nsfw_detector.predict_pil_label_only(valid_images[0]) if nsfw_result.lower() == "nsfw": is_nsfw_task = True print(f"🔍 Input NSFW detected in {current_phase} phase: ❌❌❌ {nsfw_result} - IP: {client_ip} (will blur result)") else: print(f"🔍 Input NSFW check passed: ✅✅✅ {nsfw_result} - IP: {client_ip}") except Exception as e: print(f"⚠️ Input NSFW detection failed: {e}") # Allow continuation when detection fails result_url = None status_message = "" def progress_callback(message): try: nonlocal status_message status_message = message # Add error handling to prevent progress update failure if progress is not None: progress(0.5, desc=message) except Exception as e: print(f"⚠️ Progress update failed: {e}") try: # Record generation attempt (before actual generation to ensure correct count) record_generation_attempt(client_ip, current_phase) updated_count = get_ip_generation_count(client_ip) print(f"✅ Multi-image processing started - IP: {client_ip}, phase: {current_phase}, total count: {updated_count}, images: {len(valid_images)}, size: {width}x{height}, prompt: {prompt.strip()}", flush=True) # Call multi-image editing processing function result_url, message, task_uuid = process_multi_image_edit(valid_images, prompt.strip(), width, height, progress_callback) if result_url: print(f"✅ Processing completed successfully - IP: {client_ip}, result_url: {result_url}, task_uuid: {task_uuid}", flush=True) # Detect result image NSFW content (only in rate limit phases) if nsfw_detector is not None and current_phase != 'free': try: if progress is not None: progress(0.9, desc="Checking result image...") is_nsfw, nsfw_error = download_and_check_result_nsfw(result_url, nsfw_detector) if nsfw_error: print(f"⚠️ Result image NSFW detection error - IP: {client_ip}, error: {nsfw_error}") elif is_nsfw: is_nsfw_task = True # Mark task as NSFW print(f"🔍 Result image NSFW detected in {current_phase} phase: ❌❌❌ - IP: {client_ip} (will blur result)") else: print(f"🔍 Result image NSFW check passed: ✅✅✅ - IP: {client_ip}") except Exception as e: print(f"⚠️ Result image NSFW detection exception - IP: {client_ip}, error: {str(e)}") # Apply blur if this is an NSFW task in rate limit phases should_blur = False if current_phase in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3'] and is_nsfw_task: should_blur = True # Apply blur processing if should_blur: if progress is not None: progress(0.95, desc="Applying content filter...") blurred_image = apply_gaussian_blur_to_image_url(result_url) if blurred_image is not None: final_result = blurred_image # Return PIL Image object final_message = f"⚠️ NSFW content detected, content filter applied. NSFW content is prohibited by Hugging Face, but you can generate unlimited content at our official website https://omnicreator.net/multi-image-edit#generator" print(f"🔒 Applied Gaussian blur for NSFW content - IP: {client_ip}") else: # Blur failed, return original URL with warning final_result = result_url final_message = f"⚠️ NSFW content detected, but content filter failed. Please visit https://omnicreator.net/multi-image-edit#generator for better experience" # Generate NSFW button for blurred content nsfw_action_buttons_html = f""" """ return final_result, final_message, gr.update(value=nsfw_action_buttons_html, visible=True) else: final_result = result_url final_message = "✅ " + message try: if progress is not None: progress(1.0, desc="Processing completed") except Exception as e: print(f"⚠️ Final progress update failed: {e}") # Generate action buttons HTML like Trump AI Voice action_buttons_html = "" if task_uuid: task_detail_url = f"https://omnicreator.net/my-creations/task/{task_uuid}" action_buttons_html = f""" """ return final_result, final_message, gr.update(value=action_buttons_html, visible=True) else: print(f"❌ Processing failed - IP: {client_ip}, error: {message}", flush=True) return None, "❌ " + message, gr.update(visible=False) except Exception as e: print(f"❌ Processing exception - IP: {client_ip}, error: {str(e)}") return None, f"❌ Error occurred during processing: {str(e)}", gr.update(visible=False) def local_edit_interface(image_dict, prompt, request: gr.Request, progress=gr.Progress()): """ Handle local editing requests (with phase-based limitations) """ try: # Extract user IP client_ip = request.client.host x_forwarded_for = dict(request.headers).get('x-forwarded-for') if x_forwarded_for: client_ip = x_forwarded_for if client_ip not in IP_Dict: IP_Dict[client_ip] = 0 IP_Dict[client_ip] += 1 if image_dict is None: return None, "Please upload an image and draw the area to edit", gr.update(visible=False) # Check if background and layers exist if "background" not in image_dict or "layers" not in image_dict: return None, "Please draw the area to edit on the image", gr.update(visible=False) base_image = image_dict["background"] layers = image_dict["layers"] if not layers: return None, "Please draw the area to edit on the image", gr.update(visible=False) if not prompt or prompt.strip() == "": return None, "Please enter editing prompt", gr.update(visible=False) # Check prompt length if len(prompt.strip()) <= 3: return None, "❌ Editing prompt must be more than 3 characters", gr.update(visible=False) except Exception as e: print(f"⚠️ Local edit request preprocessing error: {e}") return None, "❌ Request processing error", gr.update(visible=False) # Get user current phase current_phase = get_ip_phase(client_ip) current_count = get_ip_generation_count(client_ip) print(f"📊 Local edit user phase info - IP: {client_ip}, current phase: {current_phase}, generation count: {current_count}") # Check if completely blocked if current_phase == 'blocked': # Generate blocked limit button blocked_button_html = f""" """ return None, f"❌ You have reached Hugging Face's free generation limit. Please visit https://omnicreator.net/multi-image-edit#generator for unlimited generation", gr.update(value=blocked_button_html, visible=True) # Check rate limit (applies to rate_limit phases) if current_phase in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3']: is_limited, wait_minutes, window_count = check_rate_limit_for_phase(client_ip, current_phase) if is_limited: wait_minutes_int = int(wait_minutes) + 1 # Generate rate limit button rate_limit_button_html = f""" """ return None, f"❌ You have reached Hugging Face's free generation limit. Please visit https://omnicreator.net/multi-image-edit#generator for unlimited generation, or wait {wait_minutes_int} minutes before generating again", gr.update(value=rate_limit_button_html, visible=True) # Handle NSFW detection based on phase is_nsfw_task = False # Track if this task involves NSFW content # Skip NSFW detection in free phase if current_phase != 'free' and nsfw_detector is not None and base_image is not None: try: nsfw_result = nsfw_detector.predict_pil_label_only(base_image) if nsfw_result.lower() == "nsfw": is_nsfw_task = True print(f"🔍 Local edit input NSFW detected in {current_phase} phase: ❌❌❌ {nsfw_result} - IP: {client_ip} (will blur result)") else: print(f"🔍 Local edit input NSFW check passed: ✅✅✅ {nsfw_result} - IP: {client_ip}") except Exception as e: print(f"⚠️ Local edit input NSFW detection failed: {e}") # Allow continuation when detection fails result_url = None status_message = "" def progress_callback(message): try: nonlocal status_message status_message = message # Add error handling to prevent progress update failure if progress is not None: progress(0.5, desc=message) except Exception as e: print(f"⚠️ Local edit progress update failed: {e}") try: # Record generation attempt (before actual generation to ensure correct count) record_generation_attempt(client_ip, current_phase) updated_count = get_ip_generation_count(client_ip) print(f"✅ Local editing started - IP: {client_ip}, phase: {current_phase}, total count: {updated_count}, prompt: {prompt.strip()}", flush=True) # Call local image editing processing function result_url, message, task_uuid = process_local_image_edit(base_image, layers, prompt.strip(), progress_callback) if result_url: print(f"✅ Local editing completed successfully - IP: {client_ip}, result_url: {result_url}, task_uuid: {task_uuid}", flush=True) # Detect result image NSFW content (only in rate limit phases) if nsfw_detector is not None and current_phase != 'free': try: if progress is not None: progress(0.9, desc="Checking result image...") is_nsfw, nsfw_error = download_and_check_result_nsfw(result_url, nsfw_detector) if nsfw_error: print(f"⚠️ Local edit result image NSFW detection error - IP: {client_ip}, error: {nsfw_error}") elif is_nsfw: is_nsfw_task = True # Mark task as NSFW print(f"🔍 Local edit result image NSFW detected in {current_phase} phase: ❌❌❌ - IP: {client_ip} (will blur result)") else: print(f"🔍 Local edit result image NSFW check passed: ✅✅✅ - IP: {client_ip}") except Exception as e: print(f"⚠️ Local edit result image NSFW detection exception - IP: {client_ip}, error: {str(e)}") # Apply blur if this is an NSFW task in rate limit phases should_blur = False if current_phase in ['rate_limit_1', 'rate_limit_2', 'rate_limit_3'] and is_nsfw_task: should_blur = True # Apply blur processing if should_blur: if progress is not None: progress(0.95, desc="Applying content filter...") blurred_image = apply_gaussian_blur_to_image_url(result_url) if blurred_image is not None: final_result = blurred_image # Return PIL Image object final_message = f"⚠️ NSFW content detected, content filter applied. NSFW content is prohibited by Hugging Face, but you can generate unlimited content at our official website https://omnicreator.net/multi-image-edit#generator" print(f"🔒 Local edit applied Gaussian blur for NSFW content - IP: {client_ip}") else: # Blur failed, return original URL with warning final_result = result_url final_message = f"⚠️ NSFW content detected, but content filter failed. Please visit https://omnicreator.net/multi-image-edit#generator for better experience" # Generate NSFW button for blurred content nsfw_action_buttons_html = f""" """ return final_result, final_message, gr.update(value=nsfw_action_buttons_html, visible=True) else: final_result = result_url final_message = "✅ " + message try: if progress is not None: progress(1.0, desc="Processing completed") except Exception as e: print(f"⚠️ Local edit final progress update failed: {e}") # Generate action buttons HTML like Trump AI Voice action_buttons_html = "" if task_uuid: task_detail_url = f"https://omnicreator.net/my-creations/task/{task_uuid}" action_buttons_html = f""" """ return final_result, final_message, gr.update(value=action_buttons_html, visible=True) else: print(f"❌ Local editing processing failed - IP: {client_ip}, error: {message}", flush=True) return None, "❌ " + message, gr.update(visible=False) except Exception as e: print(f"❌ Local editing exception - IP: {client_ip}, error: {str(e)}") return None, f"❌ Error occurred during processing: {str(e)}", gr.update(visible=False) # Create Gradio interface def create_app(): with gr.Blocks( title="AI Image Editor", theme=gr.themes.Soft(), css=""" .main-container { max-width: 1200px; margin: 0 auto; } .upload-area { border: 2px dashed #ccc; border-radius: 10px; padding: 20px; text-align: center; } .result-area { margin-top: 20px; padding: 20px; border-radius: 10px; background-color: #f8f9fa; } .use-as-input-btn { margin-top: 10px; width: 100%; } """, # Improve concurrency performance configuration head=""" """ ) as app: # Main title - styled like Trump AI Voice gr.HTML("""powered by omnicreator.net
Experience the ultimate freedom in AI image creation! Generate and edit unlimited images without restrictions, including NSFW content, with our premium AI image editing platform.
Join thousands of creators who trust Omni Creator for unrestricted AI image generation!
Transform multiple images into stunning compositions with our advanced AI multi-image editing platform. Combine, merge, and blend 2-3 images to create artistic masterpieces, collages, and seamless compositions with complete creative freedom and professional quality results.
Premium users enjoy unlimited image generation without daily limits, rate restrictions, or content barriers. Create as many images as you need, whenever you need them.
Generate and edit any type of content without NSFW filters or content limitations. Complete creative freedom for artists, designers, and content creators.
Advanced AI infrastructure delivers high-quality results in seconds. No waiting in queues, no processing delays - just instant, professional-grade image editing.
Global transformations, precision local editing, style transfer, object removal, background replacement, and dozens of other professional editing capabilities.
State-of-the-art AI models trained on millions of images deliver exceptional quality and realism. Professional results suitable for commercial use and high-end projects.
Support for all image formats, styles, and use cases. From photorealistic portraits to artistic creations, product photography to digital art - we handle everything.
Generate unlimited images without waiting periods or daily restrictions
Create any type of content without NSFW filters or censorship
Skip queues and get instant results with dedicated processing power
Access to latest AI models and cutting-edge editing capabilities
Use detailed, specific prompts for better results. Describe colors, styles, lighting, and composition clearly.
Use precise brush strokes to select areas for local editing. Smaller, focused edits often yield better results.
Use "Use as Input" feature to refine results. Multiple iterations can achieve complex transformations.
Higher resolution input images (up to 10MB) generally produce better editing results and finer details.
Powered by Omni Creator
The ultimate AI image generation and editing platform • Unlimited creativity, zero restrictions