ComfyUI-CustomNode/utils/object_storage/__init__.py

280 lines
9.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
存储管理器初始化模块
本模块负责初始化和配置存储管理器,注册所有可用的存储提供者工厂。
提供统一的存储服务访问入口,简化使用复杂度。
使用方式:
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",
]