MoviePilot/app/chain/__init__.py
2023-06-06 07:15:17 +08:00

59 lines
1.7 KiB
Python

from abc import abstractmethod
from typing import Optional, Any
from app.core import Context, ModuleManager, EventManager
from app.log import logger
from app.utils.singleton import AbstractSingleton, Singleton
class _ChainBase(AbstractSingleton, metaclass=Singleton):
"""
处理链基类
"""
def __init__(self):
"""
公共初始化
"""
self.modulemanager = ModuleManager()
self.eventmanager = EventManager()
@abstractmethod
def process(self, *args, **kwargs) -> Optional[Context]:
"""
处理链,返回上下文
"""
pass
def run_module(self, method: str, *args, **kwargs) -> Any:
"""
运行包含该方法的所有模块,然后返回结果
"""
def is_result_empty(ret):
"""
判断结果是否为空
"""
if isinstance(ret, tuple):
return all(value is None for value in ret)
else:
return result is None
logger.info(f"请求模块执行:{method} ...")
result = None
modules = self.modulemanager.get_modules(method)
for module in modules:
try:
if is_result_empty(result):
result = getattr(module, method)(*args, **kwargs)
else:
if isinstance(result, tuple):
temp = getattr(module, method)(*result)
else:
temp = getattr(module, method)(result)
if temp:
result = temp
except Exception as err:
logger.error(f"运行模块出错:{module.__class__.__name__} - {err}")
return result