""" Art DAG Celery Application Streaming video rendering for the Art DAG system. Uses S-expression recipes with frame-by-frame processing. """ import os import sys from celery import Celery from celery.signals import worker_ready # Use central config sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from app.config import settings app = Celery( 'art_celery', broker=settings.redis_url, backend=settings.redis_url, include=['tasks', 'tasks.streaming', 'tasks.ipfs_upload'] ) @worker_ready.connect def log_config_on_startup(sender, **kwargs): """Log configuration when worker starts.""" print("=" * 60, file=sys.stderr) print("WORKER STARTED - CONFIGURATION", file=sys.stderr) print("=" * 60, file=sys.stderr) settings.log_config() print(f"Worker: {sender}", file=sys.stderr) print("=" * 60, file=sys.stderr) app.conf.update( result_expires=86400 * 7, # 7 days - allow time for recovery after restarts task_serializer='json', accept_content=['json', 'pickle'], # pickle needed for internal Celery messages result_serializer='json', event_serializer='json', timezone='UTC', enable_utc=True, task_track_started=True, task_acks_late=True, # Don't ack until task completes - survives worker restart worker_prefetch_multiplier=1, task_reject_on_worker_lost=True, # Re-queue if worker dies task_acks_on_failure_or_timeout=True, # Ack failed tasks so they don't retry forever ) if __name__ == '__main__': app.start()