mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-03-20 03:57:30 +08:00
feat(setup): support asynchronous install plugins on startup
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
import asyncio
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from fastapi import FastAPI
|
||||
|
||||
from app.startup.module_initializer import start_modules, shutdown_modules
|
||||
from app.startup.routers import init_routers
|
||||
from app.startup.modules_initializer import shutdown_modules, start_modules
|
||||
from app.startup.plugins_initializer import init_plugins_async
|
||||
from app.startup.routers_initializer import init_routers
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
@@ -14,6 +16,16 @@ async def lifespan(app: FastAPI):
|
||||
print("Starting up...")
|
||||
start_modules(app)
|
||||
init_routers(app)
|
||||
yield
|
||||
print("Shutting down...")
|
||||
shutdown_modules(app)
|
||||
plugin_init_task = asyncio.create_task(init_plugins_async())
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
print("Shutting down...")
|
||||
try:
|
||||
plugin_init_task.cancel()
|
||||
await plugin_init_task
|
||||
except asyncio.CancelledError:
|
||||
print("Plugin installation task cancelled.")
|
||||
except Exception as e:
|
||||
print(f"Error during plugin installation shutdown: {e}")
|
||||
shutdown_modules(app)
|
||||
|
||||
@@ -147,8 +147,6 @@ def start_modules(_: FastAPI):
|
||||
ModuleManager()
|
||||
# 启动事件消费
|
||||
EventManager().start()
|
||||
# 安装在线插件
|
||||
PluginManager().sync()
|
||||
# 加载插件
|
||||
PluginManager().start()
|
||||
# 启动监控任务
|
||||
37
app/startup/plugins_initializer.py
Normal file
37
app/startup/plugins_initializer.py
Normal file
@@ -0,0 +1,37 @@
|
||||
import asyncio
|
||||
|
||||
from app.core.plugin import PluginManager
|
||||
from app.log import logger
|
||||
from app.scheduler import Scheduler
|
||||
|
||||
|
||||
async def init_plugins_async():
|
||||
"""
|
||||
初始化安装插件,并动态注册后台任务及API
|
||||
"""
|
||||
try:
|
||||
loop = asyncio.get_event_loop()
|
||||
plugin_manager = PluginManager()
|
||||
scheduler = Scheduler()
|
||||
sync_plugins = await loop.run_in_executor(None, plugin_manager.sync)
|
||||
if not sync_plugins:
|
||||
return
|
||||
# 为避免初始化插件异常,这里所有插件都进行初始化
|
||||
logger.info(f"已同步安装 {len(sync_plugins)} 个在线插件,正在初始化所有插件")
|
||||
# 安装完成后重新初始化插件
|
||||
plugin_manager.init_config()
|
||||
# 插件启动后注册后台任务
|
||||
scheduler.init_plugin_jobs()
|
||||
# 插件启动后注册插件API
|
||||
register_plugin_api()
|
||||
logger.info("所有插件初始化完成")
|
||||
except Exception as e:
|
||||
logger.error(f"插件初始化过程中出现异常: {e}")
|
||||
|
||||
|
||||
def register_plugin_api():
|
||||
"""
|
||||
插件启动后注册插件API
|
||||
"""
|
||||
from app.api.endpoints import plugin
|
||||
plugin.register_plugin_api()
|
||||
Reference in New Issue
Block a user