Enhance image processing and error handling in AICore and tasks

- Improved response parsing in AICore to handle both array and dictionary formats, including detailed error logging.
- Updated image directory handling in tasks to prioritize web-accessible paths for image storage, with robust fallback mechanisms.
- Adjusted image URL generation in serializers and frontend components to support new directory structure and ensure proper accessibility.
This commit is contained in:
IGNY8 VPS (Salman)
2025-11-12 04:45:13 +00:00
parent c29ecc1664
commit 03909a1fab
4 changed files with 179 additions and 61 deletions

View File

@@ -537,12 +537,17 @@ def process_image_generation_queue(self, image_ids: list, account_id: int = None
from pathlib import Path
# Create images directory if it doesn't exist
# Use /data/app/igny8/images (mounted volume) for persistence
# Fallback to /data/app/images if mounted path not available
images_dir = '/data/app/igny8/images' # Use mounted volume path
# Use frontend/public/images/ai-images/ for web accessibility (like /images/logo/)
# This allows images to be served via app.igny8.com/images/ai-images/
write_test_passed = False
images_dir = None
# Try frontend/public/images/ai-images/ first (web-accessible)
try:
from django.conf import settings
base_dir = Path(settings.BASE_DIR) if hasattr(settings, 'BASE_DIR') else Path(__file__).resolve().parent.parent.parent
# Navigate to frontend/public/images/ai-images/
images_dir = str(base_dir / 'frontend' / 'public' / 'images' / 'ai-images')
os.makedirs(images_dir, exist_ok=True)
# Test write access
test_file = os.path.join(images_dir, '.write_test')
@@ -550,33 +555,31 @@ def process_image_generation_queue(self, image_ids: list, account_id: int = None
f.write('test')
os.remove(test_file)
write_test_passed = True
logger.info(f"[process_image_generation_queue] Image {image_id} - Directory writable (mounted volume): {images_dir}")
except Exception as write_test_error:
logger.warning(f"[process_image_generation_queue] Image {image_id} - Mounted directory not writable: {images_dir}, error: {write_test_error}")
# Fallback to /data/app/images
images_dir = '/data/app/images'
logger.info(f"[process_image_generation_queue] Image {image_id} - Directory writable (web-accessible): {images_dir}")
except Exception as web_dir_error:
logger.warning(f"[process_image_generation_queue] Image {image_id} - Web-accessible directory not writable: {images_dir}, error: {web_dir_error}")
# Fallback to /data/app/igny8/images (mounted volume)
try:
images_dir = '/data/app/igny8/images'
os.makedirs(images_dir, exist_ok=True)
test_file = os.path.join(images_dir, '.write_test')
with open(test_file, 'w') as f:
f.write('test')
os.remove(test_file)
write_test_passed = True
logger.info(f"[process_image_generation_queue] Image {image_id} - Using fallback directory (writable): {images_dir}")
except Exception as fallback_error:
logger.warning(f"[process_image_generation_queue] Image {image_id} - Fallback directory also not writable: {images_dir}, error: {fallback_error}")
# Final fallback to project-relative path
from django.conf import settings
base_dir = Path(settings.BASE_DIR) if hasattr(settings, 'BASE_DIR') else Path(__file__).resolve().parent.parent.parent
images_dir = str(base_dir / 'data' / 'app' / 'images')
logger.info(f"[process_image_generation_queue] Image {image_id} - Using mounted volume directory: {images_dir}")
except Exception as mounted_error:
logger.warning(f"[process_image_generation_queue] Image {image_id} - Mounted directory not writable: {images_dir}, error: {mounted_error}")
# Final fallback to /data/app/images
try:
images_dir = '/data/app/images'
os.makedirs(images_dir, exist_ok=True)
test_file = os.path.join(images_dir, '.write_test')
with open(test_file, 'w') as f:
f.write('test')
os.remove(test_file)
write_test_passed = True
logger.info(f"[process_image_generation_queue] Image {image_id} - Using project-relative directory (writable): {images_dir}")
logger.info(f"[process_image_generation_queue] Image {image_id} - Using fallback directory: {images_dir}")
except Exception as final_error:
logger.error(f"[process_image_generation_queue] Image {image_id} - All directories not writable. Last error: {final_error}")
raise Exception(f"None of the image directories are writable. Last error: {final_error}")
@@ -584,10 +587,12 @@ def process_image_generation_queue(self, image_ids: list, account_id: int = None
if not write_test_passed:
raise Exception(f"Failed to find writable directory for saving images")
# Generate filename: image_{image_id}_{timestamp}.png
# Generate filename: image_{image_id}_{timestamp}.png (or .webp for Runware)
import time
timestamp = int(time.time())
filename = f"image_{image_id}_{timestamp}.png"
# Use webp extension if provider is Runware, otherwise png
file_ext = 'webp' if provider == 'runware' else 'png'
filename = f"image_{image_id}_{timestamp}.{file_ext}"
file_path = os.path.join(images_dir, filename)
# Download image