diff --git a/app/api/endpoints/plugin.py b/app/api/endpoints/plugin.py index 04417c35..6a4631b4 100644 --- a/app/api/endpoints/plugin.py +++ b/app/api/endpoints/plugin.py @@ -232,22 +232,16 @@ async def install(plugin_id: str, install_plugins = SystemConfigOper().get(SystemConfigKey.UserInstalledPlugins) or [] # 首先检查插件是否已经存在,并且是否强制安装,否则只进行安装统计 plugin_helper = PluginHelper() - is_local_install = plugin_helper.is_local_repo_url(repo_url) - if not force and plugin_id in PluginManager().get_plugin_ids() and not is_local_install: - await plugin_helper.async_install_reg(pid=plugin_id) + if not force and plugin_id in PluginManager().get_plugin_ids(): + await plugin_helper.async_install_reg(pid=plugin_id, repo_url=repo_url) else: # 插件不存在或需要强制安装,下载安装并注册插件 - if is_local_install: - state, msg = await run_in_threadpool( - plugin_helper.install_local, - plugin_id, - repo_url, - force + if repo_url: + state, msg = await plugin_helper.async_install( + pid=plugin_id, + repo_url=repo_url, + force_install=force ) - if not state: - return schemas.Response(success=False, message=msg) - elif repo_url: - state, msg = await plugin_helper.async_install(pid=plugin_id, repo_url=repo_url) # 安装失败则直接响应 if not state: return schemas.Response(success=False, message=msg) diff --git a/app/core/plugin.py b/app/core/plugin.py index 7be5adfd..cce1f10d 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -343,7 +343,7 @@ class PluginManager(ConfigReloadMixin, metaclass=Singleton): f"但跳过处理:{candidate.get('skip_reason')}" ) continue - logger.warning(f"检测到本地插件 {candidate.get('id')} 依赖文件变化,请重新安装本地插件以安装依赖") + logger.warn(f"检测到本地插件 {candidate.get('id')} 依赖文件变化,请重新安装本地插件以安装依赖") continue # 跳过非 .py 文件 diff --git a/app/helper/plugin.py b/app/helper/plugin.py index 0031a8ed..003391d3 100644 --- a/app/helper/plugin.py +++ b/app/helper/plugin.py @@ -1,3 +1,4 @@ +import asyncio import importlib import io import json @@ -391,6 +392,9 @@ class PluginHelper(metaclass=WeakSingleton): :param force_install: 是否强制安装插件,默认不启用,启用时不进行备份和恢复操作 :return: (是否成功, 错误信息) """ + if self.is_local_repo_url(repo_url): + return self.install_local(pid=pid, repo_url=repo_url, force_install=force_install) + if SystemUtils.is_frozen(): return False, "可执行文件模式下,只能安装本地插件" @@ -840,10 +844,10 @@ class PluginHelper(metaclass=WeakSingleton): logger.error(f"{pid} 准备插件内容失败:{message}") if backup_dir: self.__restore_plugin(pid, backup_dir) - logger.warning(f"{pid} 插件安装失败,已还原备份插件") + logger.warn(f"{pid} 插件安装失败,已还原备份插件") else: self.__remove_old_plugin(pid) - logger.warning(f"{pid} 已清理对应插件目录,请尝试重新安装") + logger.warn(f"{pid} 已清理对应插件目录,请尝试重新安装") return False, message dependencies_exist, dep_ok, dep_msg = self.__install_dependencies_if_required(pid) @@ -851,10 +855,10 @@ class PluginHelper(metaclass=WeakSingleton): logger.error(f"{pid} 依赖安装失败:{dep_msg}") if backup_dir: self.__restore_plugin(pid, backup_dir) - logger.warning(f"{pid} 插件安装失败,已还原备份插件") + logger.warn(f"{pid} 插件安装失败,已还原备份插件") else: self.__remove_old_plugin(pid) - logger.warning(f"{pid} 已清理对应插件目录,请尝试重新安装") + logger.warn(f"{pid} 已清理对应插件目录,请尝试重新安装") return False, dep_msg self.install_reg(pid, repo_url) @@ -1635,6 +1639,9 @@ class PluginHelper(metaclass=WeakSingleton): :param force_install: 是否强制安装插件,默认不启用,启用时不进行备份和恢复操作 :return: (是否成功, 错误信息) """ + if self.is_local_repo_url(repo_url): + return await asyncio.to_thread(self.install_local, pid, repo_url, force_install) + if SystemUtils.is_frozen(): return False, "可执行文件模式下,只能安装本地插件" @@ -1722,10 +1729,10 @@ class PluginHelper(metaclass=WeakSingleton): logger.error(f"{pid} 准备插件内容失败:{message}") if backup_dir: await self.__async_restore_plugin(pid, backup_dir) - logger.warning(f"{pid} 插件安装失败,已还原备份插件") + logger.warn(f"{pid} 插件安装失败,已还原备份插件") else: await self.__async_remove_old_plugin(pid) - logger.warning(f"{pid} 已清理对应插件目录,请尝试重新安装") + logger.warn(f"{pid} 已清理对应插件目录,请尝试重新安装") return False, message dependencies_exist, dep_ok, dep_msg = await self.__async_install_dependencies_if_required(pid) @@ -1733,10 +1740,10 @@ class PluginHelper(metaclass=WeakSingleton): logger.error(f"{pid} 依赖安装失败:{dep_msg}") if backup_dir: await self.__async_restore_plugin(pid, backup_dir) - logger.warning(f"{pid} 插件安装失败,已还原备份插件") + logger.warn(f"{pid} 插件安装失败,已还原备份插件") else: await self.__async_remove_old_plugin(pid) - logger.warning(f"{pid} 已清理对应插件目录,请尝试重新安装") + logger.warn(f"{pid} 已清理对应插件目录,请尝试重新安装") return False, dep_msg await self.async_install_reg(pid, repo_url)