mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 16:07:01 +08:00
Merge pull request #2929 from InfinityPacer/feature/setup
This commit is contained in:
@@ -339,6 +339,7 @@ class PluginManager(metaclass=Singleton):
|
|||||||
missing_dependencies = self.pluginhelper.find_missing_dependencies()
|
missing_dependencies = self.pluginhelper.find_missing_dependencies()
|
||||||
if not missing_dependencies:
|
if not missing_dependencies:
|
||||||
return missing_dependencies
|
return missing_dependencies
|
||||||
|
logger.debug(f"检测到缺失的依赖项: {missing_dependencies}")
|
||||||
logger.info(f"开始安装缺失的依赖项,共 {len(missing_dependencies)} 个...")
|
logger.info(f"开始安装缺失的依赖项,共 {len(missing_dependencies)} 个...")
|
||||||
# 第二步:安装依赖项并返回结果
|
# 第二步:安装依赖项并返回结果
|
||||||
total_start_time = time.time()
|
total_start_time = time.time()
|
||||||
|
|||||||
+6
-10
@@ -4,11 +4,10 @@ import traceback
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Dict, List, Optional, Tuple, Set
|
from typing import Any, Dict, List, Optional, Tuple, Set
|
||||||
|
|
||||||
import pkg_resources
|
|
||||||
from cachetools import TTLCache, cached
|
from cachetools import TTLCache, cached
|
||||||
from packaging.specifiers import SpecifierSet, InvalidSpecifier
|
from packaging.specifiers import SpecifierSet, InvalidSpecifier
|
||||||
from packaging.version import Version, InvalidVersion
|
from packaging.version import Version, InvalidVersion
|
||||||
from pkg_resources import Requirement
|
from pkg_resources import Requirement, working_set
|
||||||
|
|
||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.db.systemconfig_oper import SystemConfigOper
|
from app.db.systemconfig_oper import SystemConfigOper
|
||||||
@@ -404,7 +403,7 @@ class PluginHelper(metaclass=Singleton):
|
|||||||
:return: 备份目录路径
|
:return: 备份目录路径
|
||||||
"""
|
"""
|
||||||
plugin_dir = PLUGIN_DIR / pid
|
plugin_dir = PLUGIN_DIR / pid
|
||||||
backup_dir = Path(settings.TEMP_PATH) / "plugins_backup" / pid
|
backup_dir = Path(settings.TEMP_PATH) / "plugin_backup" / pid
|
||||||
|
|
||||||
if plugin_dir.exists():
|
if plugin_dir.exists():
|
||||||
# 备份时清理已有的备份目录,防止残留文件影响
|
# 备份时清理已有的备份目录,防止残留文件影响
|
||||||
@@ -577,12 +576,12 @@ class PluginHelper(metaclass=Singleton):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# 收集所有插件的依赖项
|
# 收集所有插件的依赖项
|
||||||
missing_dependencies = self.__find_plugin_dependencies() # 返回格式为 {package_name: version_specifier}
|
plugin_dependencies = self.__find_plugin_dependencies() # 返回格式为 {package_name: version_specifier}
|
||||||
# 获取已安装的包及其版本
|
# 获取已安装的包及其版本
|
||||||
installed_packages = self.__get_installed_packages() # 返回格式为 {package_name: Version}
|
installed_packages = self.__get_installed_packages() # 返回格式为 {package_name: Version}
|
||||||
# 需要安装或更新的依赖项列表
|
# 需要安装或更新的依赖项列表
|
||||||
dependencies_to_install = []
|
dependencies_to_install = []
|
||||||
for pkg_name, version_specifier in missing_dependencies.items():
|
for pkg_name, version_specifier in plugin_dependencies.items():
|
||||||
spec_set = SpecifierSet(version_specifier)
|
spec_set = SpecifierSet(version_specifier)
|
||||||
installed_version = installed_packages.get(pkg_name)
|
installed_version = installed_packages.get(pkg_name)
|
||||||
if installed_version is None:
|
if installed_version is None:
|
||||||
@@ -620,7 +619,7 @@ class PluginHelper(metaclass=Singleton):
|
|||||||
requirements_temp_file.parent.mkdir(parents=True, exist_ok=True)
|
requirements_temp_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
with open(requirements_temp_file, "w", encoding="utf-8") as f:
|
with open(requirements_temp_file, "w", encoding="utf-8") as f:
|
||||||
for dep in dependencies:
|
for dep in dependencies:
|
||||||
f.write(dep + '\n')
|
f.write(dep + "\n")
|
||||||
|
|
||||||
# 使用自动降级策略安装依赖
|
# 使用自动降级策略安装依赖
|
||||||
success, message = self.__pip_install_with_fallback(requirements_temp_file)
|
success, message = self.__pip_install_with_fallback(requirements_temp_file)
|
||||||
@@ -640,7 +639,7 @@ class PluginHelper(metaclass=Singleton):
|
|||||||
"""
|
"""
|
||||||
installed_packages = {}
|
installed_packages = {}
|
||||||
try:
|
try:
|
||||||
for dist in pkg_resources.working_set:
|
for dist in working_set:
|
||||||
pkg_name = self.__standardize_pkg_name(dist.project_name)
|
pkg_name = self.__standardize_pkg_name(dist.project_name)
|
||||||
try:
|
try:
|
||||||
installed_packages[pkg_name] = Version(dist.version)
|
installed_packages[pkg_name] = Version(dist.version)
|
||||||
@@ -668,7 +667,6 @@ class PluginHelper(metaclass=Singleton):
|
|||||||
# 解析当前插件的 requirements.txt,获取依赖项
|
# 解析当前插件的 requirements.txt,获取依赖项
|
||||||
plugin_deps = self.__parse_requirements(requirements_file)
|
plugin_deps = self.__parse_requirements(requirements_file)
|
||||||
for pkg_name, version_specifiers in plugin_deps.items():
|
for pkg_name, version_specifiers in plugin_deps.items():
|
||||||
logger.debug(f"当前处理的包:{pkg_name}, 版本约束:{version_specifiers}")
|
|
||||||
if pkg_name in dependencies:
|
if pkg_name in dependencies:
|
||||||
# 更新已存在的包的版本约束集合
|
# 更新已存在的包的版本约束集合
|
||||||
dependencies[pkg_name].update(version_specifiers)
|
dependencies[pkg_name].update(version_specifiers)
|
||||||
@@ -699,7 +697,6 @@ class PluginHelper(metaclass=Singleton):
|
|||||||
req = Requirement(line)
|
req = Requirement(line)
|
||||||
pkg_name = self.__standardize_pkg_name(req.name)
|
pkg_name = self.__standardize_pkg_name(req.name)
|
||||||
version_specifier = str(req.specifier)
|
version_specifier = str(req.specifier)
|
||||||
logger.debug(f"解析到依赖项:包名={pkg_name}, 版本约束={version_specifier}")
|
|
||||||
if pkg_name in dependencies:
|
if pkg_name in dependencies:
|
||||||
dependencies[pkg_name].append(version_specifier)
|
dependencies[pkg_name].append(version_specifier)
|
||||||
else:
|
else:
|
||||||
@@ -723,7 +720,6 @@ class PluginHelper(metaclass=Singleton):
|
|||||||
try:
|
try:
|
||||||
merged_dependencies = {}
|
merged_dependencies = {}
|
||||||
for pkg_name, version_specifiers in dependencies.items():
|
for pkg_name, version_specifiers in dependencies.items():
|
||||||
logger.debug(f"合并包:{pkg_name} 的版本约束:{version_specifiers}")
|
|
||||||
# 合并版本约束
|
# 合并版本约束
|
||||||
spec_set = SpecifierSet()
|
spec_set = SpecifierSet()
|
||||||
for specifier in version_specifiers:
|
for specifier in version_specifiers:
|
||||||
|
|||||||
@@ -41,10 +41,13 @@ async def init_plugins_async():
|
|||||||
|
|
||||||
|
|
||||||
async def execute_task(loop, task_func, task_name):
|
async def execute_task(loop, task_func, task_name):
|
||||||
|
"""
|
||||||
|
执行后台任务
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
result = await loop.run_in_executor(None, task_func)
|
result = await loop.run_in_executor(None, task_func)
|
||||||
if isinstance(result, list) and result:
|
if isinstance(result, list) and result:
|
||||||
logger.info(f"{task_name} 已完成,共处理 {len(result)} 个项目")
|
logger.debug(f"{task_name} 已完成,共处理 {len(result)} 个项目")
|
||||||
else:
|
else:
|
||||||
logger.debug(f"没有新的 {task_name} 需要处理")
|
logger.debug(f"没有新的 {task_name} 需要处理")
|
||||||
return result
|
return result
|
||||||
|
|||||||
Reference in New Issue
Block a user