diff --git a/app/api/endpoints/site.py b/app/api/endpoints/site.py index ccbee518..770fc633 100644 --- a/app/api/endpoints/site.py +++ b/app/api/endpoints/site.py @@ -5,7 +5,6 @@ from sqlalchemy.orm import Session from starlette.background import BackgroundTasks from app import schemas -from app.api.endpoints.plugin import register_plugin_api from app.chain.site import SiteChain from app.chain.torrents import TorrentsChain from app.command import Command @@ -24,6 +23,7 @@ from app.helper.sites import SitesHelper from app.scheduler import Scheduler from app.schemas.types import SystemConfigKey, EventType from app.utils.string import StringUtils +from startup.plugins_initializer import register_plugin_api router = APIRouter() diff --git a/app/schemas/types.py b/app/schemas/types.py index f6c66911..116bb13f 100644 --- a/app/schemas/types.py +++ b/app/schemas/types.py @@ -197,13 +197,13 @@ class ContentType(str, Enum): 操作状态的通知消息类型标识 """ # 订阅添加成功 - SubscribeAdded: str = "subscribeAdded" + SubscribeAdded = "subscribeAdded" # 订阅完成 - SubscribeComplete: str = "subscribeComplete" + SubscribeComplete = "subscribeComplete" # 入库成功 - OrganizeSuccess: str = "organizeSuccess" + OrganizeSuccess = "organizeSuccess" # 下载开始(添加下载任务成功) - DownloadAdded: str = "downloadAdded" + DownloadAdded = "downloadAdded" # 消息渠道 diff --git a/app/startup/command_initializer.py b/app/startup/command_initializer.py new file mode 100644 index 00000000..5a04ae0a --- /dev/null +++ b/app/startup/command_initializer.py @@ -0,0 +1,14 @@ +from command import Command + + +def init_command(): + """ + 初始化命令 + """ + Command() + +def stop_command(): + """ + 停止命令 + """ + pass diff --git a/app/startup/lifecycle.py b/app/startup/lifecycle.py index bfeee1a2..2c006283 100644 --- a/app/startup/lifecycle.py +++ b/app/startup/lifecycle.py @@ -4,9 +4,26 @@ from contextlib import asynccontextmanager from fastapi import FastAPI from app.startup.workflow_initializer import init_workflow, stop_workflow -from app.startup.modules_initializer import shutdown_modules, start_modules -from app.startup.plugins_initializer import init_plugins_async, stop_plugins +from app.startup.modules_initializer import init_modules, stop_modules +from app.startup.plugins_initializer import init_plugins, stop_plugins from app.startup.routers_initializer import init_routers +from core.config import global_vars +from startup.command_initializer import init_command, stop_command +from startup.monitor_initializer import stop_monitor, init_monitor +from startup.scheduler_initializer import stop_scheduler, init_scheduler + + +async def init_extra_system(): + """ + 初始化额外的系统(依赖于插件初始化完成) + """ + await init_plugins() + # 启动监控器 + init_monitor() + # 启动定时器 + init_scheduler() + # 启动命令 + init_command() @asynccontextmanager @@ -15,30 +32,37 @@ async def lifespan(app: FastAPI): 定义应用的生命周期事件 """ print("Starting up...") - # 启动模块 - start_modules(app) - # 初始化工作流动作 - init_workflow(app) + # 初始化模块 + init_modules() # 初始化路由 init_routers(app) - # 初始化插件 - plugin_init_task = asyncio.create_task(init_plugins_async()) + # 初始化工作流 + init_workflow() + # 初始化插件依赖系统 + extra_init_task = asyncio.create_task(init_extra_system()) try: # 在此处 yield,表示应用已经启动,控制权交回 FastAPI 主事件循环 yield finally: print("Shutting down...") + # 停止信号 + global_vars.stop_system() try: - # 取消插件初始化 - plugin_init_task.cancel() - await plugin_init_task + extra_init_task.cancel() + await extra_init_task except asyncio.CancelledError: - print("Plugin installation task cancelled.") + pass except Exception as e: - print(f"Error during plugin installation shutdown: {e}") - # 清理模块 - shutdown_modules(app) - # 关闭工作流 - stop_workflow(app) - # 关闭插件 + print(str(e)) + # 停止插件 stop_plugins() + # 停止命令 + stop_command() + # 停止监控器 + stop_monitor() + # 停止定时器 + stop_scheduler() + # 停止工作流 + stop_workflow() + # 停止模块 + stop_modules() diff --git a/app/startup/modules_initializer.py b/app/startup/modules_initializer.py index d390458b..04368bf2 100644 --- a/app/startup/modules_initializer.py +++ b/app/startup/modules_initializer.py @@ -1,12 +1,11 @@ import sys -from fastapi import FastAPI - from app.core.cache import close_cache -from app.core.config import global_vars, settings +from app.core.config import settings from app.core.module import ModuleManager from app.log import logger from app.utils.system import SystemUtils +from command import CommandChain # SitesHelper涉及资源包拉取,提前引入并容错提示 try: @@ -22,13 +21,10 @@ from app.helper.thread import ThreadHelper from app.helper.display import DisplayHelper from app.helper.resource import ResourceHelper from app.helper.message import MessageHelper -from app.scheduler import Scheduler -from app.monitor import Monitor from app.schemas import Notification, NotificationType from app.schemas.types import SystemConfigKey from app.db import close_database from app.db.systemconfig_oper import SystemConfigOper -from app.command import Command, CommandChain def start_frontend(): @@ -108,22 +104,16 @@ def check_auth(): ) -def shutdown_modules(_: FastAPI): +def stop_modules(): """ 服务关闭 """ - # 停止信号 - global_vars.stop_system() # 停止模块 ModuleManager().stop() # 停止事件消费 EventManager().stop() # 停止虚拟显示 DisplayHelper().stop() - # 停止定时服务 - Scheduler().stop() - # 停止监控 - Monitor().stop() # 停止线程池 ThreadHelper().shutdown() # 停止缓存连接 @@ -136,7 +126,7 @@ def shutdown_modules(_: FastAPI): clear_temp() -def start_modules(_: FastAPI): +def init_modules(): """ 启动模块 """ @@ -152,12 +142,6 @@ def start_modules(_: FastAPI): ModuleManager() # 启动事件消费 EventManager().start() - # 启动监控任务 - Monitor() - # 启动定时服务 - Scheduler() - # 加载命令 - Command() # 启动前端服务 start_frontend() # 检查认证状态 diff --git a/app/startup/monitor_initializer.py b/app/startup/monitor_initializer.py new file mode 100644 index 00000000..85c679a5 --- /dev/null +++ b/app/startup/monitor_initializer.py @@ -0,0 +1,15 @@ +from monitor import Monitor + + +def init_monitor(): + """ + 初始化监控器 + """ + Monitor() + + +def stop_monitor(): + """ + 停止监控器 + """ + Monitor().stop() diff --git a/app/startup/plugins_initializer.py b/app/startup/plugins_initializer.py index adfa7878..88664b60 100644 --- a/app/startup/plugins_initializer.py +++ b/app/startup/plugins_initializer.py @@ -1,20 +1,16 @@ import asyncio -from app.command import Command from app.core.plugin import PluginManager from app.log import logger -from app.scheduler import Scheduler -async def init_plugins_async(): +async def init_plugins(): """ 初始化安装插件,并动态注册后台任务及API """ try: loop = asyncio.get_event_loop() plugin_manager = PluginManager() - scheduler = Scheduler() - command = Command() sync_result = await execute_task(loop, plugin_manager.sync, "插件同步到本地") resolved_dependencies = await execute_task(loop, plugin_manager.install_plugin_missing_dependencies, @@ -27,10 +23,6 @@ async def init_plugins_async(): logger.info("正在初始化所有插件") # 安装完成后初始化插件 plugin_manager.start() - # 插件启动后注册后台任务 - scheduler.init_plugin_jobs() - # 插件启动后注册菜单命令 - command.init_commands() # 插件启动后注册插件API register_plugin_api() logger.info("所有插件初始化完成") diff --git a/app/startup/scheduler_initializer.py b/app/startup/scheduler_initializer.py new file mode 100644 index 00000000..6e8b3e36 --- /dev/null +++ b/app/startup/scheduler_initializer.py @@ -0,0 +1,14 @@ +from scheduler import Scheduler + + +def init_scheduler(): + """ + 初始化定时器 + """ + Scheduler() + +def stop_scheduler(): + """ + 停止定时器 + """ + Scheduler().stop() diff --git a/app/startup/workflow_initializer.py b/app/startup/workflow_initializer.py index a0b937ea..d81c0e6e 100644 --- a/app/startup/workflow_initializer.py +++ b/app/startup/workflow_initializer.py @@ -1,16 +1,14 @@ -from fastapi import FastAPI - from app.core.workflow import WorkFlowManager -def init_workflow(_: FastAPI): +def init_workflow(): """ 初始化动作 """ WorkFlowManager() -def stop_workflow(_: FastAPI): +def stop_workflow(): """ 停止动作 """