""" 存储管理器初始化模块 本模块负责初始化和配置存储管理器,注册所有可用的存储提供者工厂。 提供统一的存储服务访问入口,简化使用复杂度。 使用方式: from utils.storage_manager_init import get_storage_manager, get_provider # 获取存储管理器 manager = get_storage_manager() # 直接获取默认存储提供者 provider = get_provider() # 获取指定类型的存储提供者 s3_provider = get_provider("s3", {"access_key_id": "...", "secret_access_key": "..."}) """ from typing import Any, Dict, Optional import loguru from ..config_utils import config from .providers.cos_provider import COSStorageFactory from .providers.s3_provider import S3StorageFactory from .providers.vod_provider import VODStorageFactory from .storage_interface import ( DownloadResult, StorageProvider, UploadResult, storage_manager, ) def initialize_storage_manager(): """ 初始化存储管理器,注册所有可用的存储工厂 注册的存储类型: - S3: AWS S3存储服务 - COS: 腾讯云COS存储服务 - VOD: 腾讯云VOD视频点播服务 """ try: # 注册S3存储工厂 s3_factory = S3StorageFactory() for storage_type in s3_factory.get_supported_types(): storage_manager.register_factory(storage_type, s3_factory) # 注册COS存储工厂 cos_factory = COSStorageFactory() for storage_type in cos_factory.get_supported_types(): storage_manager.register_factory(storage_type, cos_factory) # 注册VOD存储工厂 vod_factory = VODStorageFactory() for storage_type in vod_factory.get_supported_types(): storage_manager.register_factory(storage_type, vod_factory) loguru.logger.info("存储管理器初始化完成") loguru.logger.info(f"支持的存储类型: {storage_manager.get_supported_types()}") except Exception as e: loguru.logger.error(f"存储管理器初始化失败: {e}") raise def create_default_providers(): """ 创建默认的存储提供者 根据配置文件中的可用配置自动创建存储提供者实例。 优先级: S3 > COS """ providers_created = [] # 尝试创建S3提供者 if config.has_aws_config(): try: aws_config = config.get_aws_config() s3_provider = storage_manager.create_provider( "s3", aws_config, "default_s3" ) providers_created.append("S3") loguru.logger.info("默认S3存储提供者创建成功") except Exception as e: loguru.logger.warning(f"S3存储提供者创建失败: {e}") # 尝试创建COS提供者 if config.has_cos_config(): try: cos_config = config.get_cos_config() cos_provider = storage_manager.create_provider( "cos", cos_config, "default_cos" ) providers_created.append("COS") loguru.logger.info("默认COS存储提供者创建成功") except Exception as e: loguru.logger.warning(f"COS存储提供者创建失败: {e}") # 尝试创建VOD提供者 if config.has_vod_config(): try: vod_config = config.get_vod_config() vod_provider = storage_manager.create_provider( "vod", vod_config, "default_vod" ) providers_created.append("VOD") loguru.logger.info("默认VOD存储提供者创建成功") except Exception as e: loguru.logger.warning(f"VOD存储提供者创建失败: {e}") if providers_created: loguru.logger.info(f"默认存储提供者创建完成: {', '.join(providers_created)}") else: loguru.logger.warning("未能创建任何默认存储提供者,请检查配置文件") def get_storage_manager(): """ 获取已初始化的存储管理器实例 Returns: StorageManager: 存储管理器实例 """ if not storage_manager.get_supported_types(): initialize_storage_manager() create_default_providers() return storage_manager def get_provider( provider_type: Optional[str] = None, config_dict: Optional[Dict[str, Any]] = None ) -> StorageProvider: """ 获取存储提供者实例 Args: provider_type: 存储类型(如:"s3", "cos"),为None时返回默认提供者 config_dict: 自定义配置字典,为None时使用全局配置 Returns: StorageProvider: 存储提供者实例 Raises: ValueError: 当找不到合适的存储提供者时抛出异常 """ manager = get_storage_manager() # 如果没有指定类型,返回默认提供者 if provider_type is None: try: return manager.get_provider() except ValueError: # 如果没有默认提供者,尝试创建一个 if config.has_aws_config(): aws_config = config.get_aws_config() return manager.create_provider("s3", aws_config) elif config.has_cos_config(): cos_config = config.get_cos_config() return manager.create_provider("cos", cos_config) elif config.has_vod_config(): vod_config = config.get_vod_config() return manager.create_provider("vod", vod_config) else: raise ValueError("无法找到有效的存储配置,请检查配置文件") # 创建指定类型的提供者 if config_dict: provider_id = f"{provider_type}_{hash(str(config_dict))}" return manager.create_provider(provider_type, config_dict, provider_id) else: # 尝试从已有提供者中获取 try: return manager.get_provider(f"default_{provider_type}") except ValueError: # 如果不存在,使用全局配置创建 if provider_type in ["s3", "aws", "amazon"] and config.has_aws_config(): aws_config = config.get_aws_config() return manager.create_provider( "s3", aws_config, f"default_{provider_type}" ) elif ( provider_type in ["cos", "qcloud", "tencent"] and config.has_cos_config() ): cos_config = config.get_cos_config() return manager.create_provider( "cos", cos_config, f"default_{provider_type}" ) elif ( provider_type in ["vod", "tencent_vod", "qcloud_vod"] and config.has_vod_config() ): vod_config = config.get_vod_config() return manager.create_provider( "vod", vod_config, f"default_{provider_type}" ) else: raise ValueError( f"无法为类型 {provider_type} 创建存储提供者,缺少配置信息" ) def get_available_storage_types() -> Dict[str, bool]: """ 获取所有可用的存储类型及其可用状态 Returns: Dict[str, bool]: 存储类型及其可用状态的字典 """ manager = get_storage_manager() supported_types = manager.get_supported_types() availability = {} for storage_type in supported_types: try: # 尝试创建提供者来检查可用性 if storage_type in ["s3", "aws", "amazon"]: availability[storage_type] = config.has_aws_config() elif storage_type in ["cos", "qcloud", "tencent"]: availability[storage_type] = config.has_cos_config() elif storage_type in ["vod", "tencent_vod", "qcloud_vod"]: availability[storage_type] = config.has_vod_config() else: availability[storage_type] = False except Exception: availability[storage_type] = False return availability def validate_storage_config(storage_type: str, config_dict: Dict[str, Any]) -> bool: """ 验证存储配置的有效性 Args: storage_type: 存储类型 config_dict: 配置字典 Returns: bool: 配置是否有效 """ try: manager = get_storage_manager() # 尝试创建提供者以验证配置 test_provider = manager.create_provider( storage_type, config_dict, "test_provider" ) # 清理测试提供者 # 注意:这里我们不从manager中移除,因为create_provider会缓存它 return True except Exception as e: loguru.logger.error(f"存储配置验证失败: {e}") return False # 在模块加载时自动初始化 try: initialize_storage_manager() create_default_providers() except Exception as e: loguru.logger.error(f"存储管理器自动初始化失败: {e}") # 导出主要接口 __all__ = [ "get_storage_manager", "get_provider", "get_available_storage_types", "validate_storage_config", "UploadResult", "DownloadResult", ]