mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 07:56:52 +08:00
feat:工作流支持调用插件动作
This commit is contained in:
@@ -0,0 +1,71 @@
|
|||||||
|
from pydantic import Field
|
||||||
|
|
||||||
|
from app.actions import BaseAction
|
||||||
|
from app.core.plugin import PluginManager
|
||||||
|
from app.log import logger
|
||||||
|
from app.schemas import ActionParams, ActionContext
|
||||||
|
|
||||||
|
|
||||||
|
class InvokePluginParams(ActionParams):
|
||||||
|
"""
|
||||||
|
调用插件动作参数
|
||||||
|
"""
|
||||||
|
plugin_id: str = Field(default=None, description="插件ID")
|
||||||
|
action_id: str = Field(default=None, description="动作ID")
|
||||||
|
action_params: dict = Field(default={}, description="动作参数")
|
||||||
|
|
||||||
|
|
||||||
|
class InvokePluginAction(BaseAction):
|
||||||
|
"""
|
||||||
|
调用插件
|
||||||
|
"""
|
||||||
|
|
||||||
|
_success = False
|
||||||
|
|
||||||
|
def __init__(self, action_id: str):
|
||||||
|
super().__init__(action_id)
|
||||||
|
self._success = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@property
|
||||||
|
def name(cls) -> str: # noqa
|
||||||
|
return "调用插件"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@property
|
||||||
|
def description(cls) -> str: # noqa
|
||||||
|
return "调用插件提供的动作"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@property
|
||||||
|
def data(cls) -> dict: # noqa
|
||||||
|
return InvokePluginParams().dict()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def success(self) -> bool:
|
||||||
|
return self._success
|
||||||
|
|
||||||
|
def execute(self, workflow_id: int, params: dict, context: ActionContext) -> ActionContext:
|
||||||
|
"""
|
||||||
|
执行插件定义的动作
|
||||||
|
"""
|
||||||
|
params = InvokePluginParams(**params)
|
||||||
|
if not params.plugin_id or not params.action_id:
|
||||||
|
return context
|
||||||
|
try:
|
||||||
|
plugin_actions = PluginManager().get_plugin_actions(params.plugin_id)
|
||||||
|
if not plugin_actions:
|
||||||
|
logger.error(f"插件不存在: {params.plugin_id}")
|
||||||
|
return context
|
||||||
|
action = next((action for action in plugin_actions if action.action_id == params.action_id), None)
|
||||||
|
if not action or not action.get("func"):
|
||||||
|
logger.error(f"插件动作不存在: {params.plugin_id} - {params.action_id}")
|
||||||
|
return context
|
||||||
|
# 执行插件动作
|
||||||
|
self._success, context = action["func"](context, **params.action_params)
|
||||||
|
except Exception as e:
|
||||||
|
self._success = False
|
||||||
|
logger.error(f"调用插件动作失败: {e}")
|
||||||
|
return context
|
||||||
|
self.job_done()
|
||||||
|
return context
|
||||||
@@ -536,6 +536,30 @@ class PluginManager(metaclass=Singleton):
|
|||||||
logger.error(f"获取插件 {plugin_id} 模块出错:{str(e)}")
|
logger.error(f"获取插件 {plugin_id} 模块出错:{str(e)}")
|
||||||
return ret_modules
|
return ret_modules
|
||||||
|
|
||||||
|
def get_plugin_actions(self, pid: Optional[str] = None) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
获取插件动作
|
||||||
|
[{
|
||||||
|
"id": "动作ID",
|
||||||
|
"name": "动作名称",
|
||||||
|
"func": self.xxx,
|
||||||
|
"kwargs": {} # 需要附加传递的参数
|
||||||
|
}]
|
||||||
|
"""
|
||||||
|
ret_actions = []
|
||||||
|
for plugin_id, plugin in self._running_plugins.items():
|
||||||
|
if pid and pid != plugin_id:
|
||||||
|
continue
|
||||||
|
if hasattr(plugin, "get_actions") and ObjectUtils.check_method(plugin.get_actions):
|
||||||
|
try:
|
||||||
|
if not plugin.get_state():
|
||||||
|
continue
|
||||||
|
actions = plugin.get_actions() or []
|
||||||
|
ret_actions.extend(actions)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"获取插件 {plugin_id} 动作出错:{str(e)}")
|
||||||
|
return ret_actions
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_plugin_remote_entry(plugin_id: str, dist_path: str) -> str:
|
def get_plugin_remote_entry(plugin_id: str, dist_path: str) -> str:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -182,6 +182,22 @@ class _PluginBase(metaclass=ABCMeta):
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def get_actions(self) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
获取插件工作流动作
|
||||||
|
[{
|
||||||
|
"id": "动作ID",
|
||||||
|
"name": "动作名称",
|
||||||
|
"func": self.xxx,
|
||||||
|
"kwargs": {} # 需要附加传递的参数
|
||||||
|
}]
|
||||||
|
|
||||||
|
对实现函数的要求:
|
||||||
|
1、函数的第一个参数固定为 ActionContent 实例,如需要传递额外参数,在kwargs中定义
|
||||||
|
2、函数的返回:执行状态 True / False,更新后的 ActionContent 实例
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def stop_service(self):
|
def stop_service(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user