85 lines
2.8 KiB
Python
85 lines
2.8 KiB
Python
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
|
|
}
|