from enum import Enum from typing import Optional, Dict, Any from fastapi import status class ErrorCode(str, Enum): INVALID_URL = "INVALID_URL" UNSUPPORTED_FORMAT = "UNSUPPORTED_FORMAT" VIDEO_NOT_FOUND = "VIDEO_NOT_FOUND" TRANSCRIPT_NOT_AVAILABLE = "TRANSCRIPT_NOT_AVAILABLE" AI_SERVICE_ERROR = "AI_SERVICE_ERROR" RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED" INTERNAL_ERROR = "INTERNAL_ERROR" class BaseAPIException(Exception): def __init__( self, message: str, error_code: ErrorCode, status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR, details: Optional[Dict[str, Any]] = None, recoverable: bool = False ): self.message = message self.error_code = error_code self.status_code = status_code self.details = details or {} self.recoverable = recoverable super().__init__(message) class UserInputError(BaseAPIException): def __init__( self, message: str, error_code: ErrorCode, details: Optional[Dict[str, Any]] = None ): super().__init__( message=message, error_code=error_code, status_code=status.HTTP_400_BAD_REQUEST, details=details, recoverable=True ) class ValidationError(UserInputError): def __init__(self, message: str, details: Optional[Dict[str, Any]] = None): super().__init__( message=message, error_code=ErrorCode.INVALID_URL, details=details ) class UnsupportedFormatError(UserInputError): def __init__(self, message: str, details: Optional[Dict[str, Any]] = None): super().__init__( message=message, error_code=ErrorCode.UNSUPPORTED_FORMAT, details=details )