import os from pathlib import Path # Base directory BASE_DIR = Path(__file__).parent.parent class Config: """Base configuration""" SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-secret-key-change-in-production' # Database configuration SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or \ f'sqlite:///{(BASE_DIR / "backend" / "instance" / "trivia.db").absolute()}' SQLALCHEMY_TRACK_MODIFICATIONS = False # File upload configuration UPLOAD_FOLDER = BASE_DIR / "backend" / "static" / "images" MAX_CONTENT_LENGTH = 5 * 1024 * 1024 # 5MB max file size ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} # Audio upload configuration AUDIO_FOLDER = BASE_DIR / "backend" / "static" / "audio" ALLOWED_AUDIO_EXTENSIONS = {'mp3', 'm4a', 'aac', 'wav'} MAX_AUDIO_LENGTH = 300 # 5 minutes in seconds MAX_AUDIO_SIZE = 50 * 1024 * 1024 # 50MB # Celery configuration CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://localhost:6379/0') CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/0') CELERY_TASK_TRACK_STARTED = True CELERY_TASK_TIME_LIMIT = 600 # 10 minutes max per task # yt-dlp configuration YTDLP_FORMAT = 'bestaudio/best' YTDLP_POSTPROCESSOR = 'mp3' YTDLP_QUALITY = '192' # kbps # CORS configuration CORS_ORIGINS = os.environ.get('CORS_ORIGINS', '*').split(',') CORS_SUPPORTS_CREDENTIALS = True # OIDC/Authelia configuration OIDC_ISSUER = os.environ.get('OIDC_ISSUER') OIDC_CLIENT_ID = os.environ.get('OIDC_CLIENT_ID', 'trivia-app') OIDC_CLIENT_SECRET = os.environ.get('OIDC_CLIENT_SECRET') OIDC_REDIRECT_URI = os.environ.get('OIDC_REDIRECT_URI', 'http://localhost:5001/api/auth/callback') OIDC_AUDIENCE = os.environ.get('OIDC_AUDIENCE', OIDC_CLIENT_ID) FRONTEND_URL = os.environ.get('FRONTEND_URL', 'http://localhost:3000') OIDC_JWKS_URI = os.environ.get('OIDC_JWKS_URI') # Optional, auto-fetched if not set # Cookie security SESSION_COOKIE_SECURE = os.environ.get('SESSION_COOKIE_SECURE', 'false').lower() == 'true' SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_SAMESITE = 'Strict' class DevelopmentConfig(Config): """Development configuration""" DEBUG = True FLASK_ENV = 'development' class ProductionConfig(Config): """Production configuration""" DEBUG = False FLASK_ENV = 'production' SECRET_KEY = os.environ.get('SECRET_KEY') # Must be set in production class TestConfig(Config): """Test configuration""" TESTING = True SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' WTF_CSRF_ENABLED = False # Configuration dictionary config = { 'development': DevelopmentConfig, 'production': ProductionConfig, 'test': TestConfig, 'default': DevelopmentConfig }