mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
run setup config step inside venv
This commit is contained in:
+50
-2
@@ -899,7 +899,7 @@ def _merge_notification_switches(existing_items: list[dict]) -> list[dict]:
|
|||||||
return [merged[key] for key in [*preferred_order, *extras]]
|
return [merged[key] for key in [*preferred_order, *extras]]
|
||||||
|
|
||||||
|
|
||||||
def apply_local_system_config(config_payload: dict[str, Any]) -> None:
|
def _apply_local_system_config_inner(config_payload: dict[str, Any]) -> None:
|
||||||
for directory in config_payload.get("directories") or []:
|
for directory in config_payload.get("directories") or []:
|
||||||
download_path = directory.get("download_path")
|
download_path = directory.get("download_path")
|
||||||
library_path = directory.get("library_path")
|
library_path = directory.get("library_path")
|
||||||
@@ -953,6 +953,41 @@ def apply_local_system_config(config_payload: dict[str, Any]) -> None:
|
|||||||
print_step("已写入本地系统配置")
|
print_step("已写入本地系统配置")
|
||||||
|
|
||||||
|
|
||||||
|
def _current_python_matches(target_python: Optional[Path]) -> bool:
|
||||||
|
if not target_python:
|
||||||
|
return True
|
||||||
|
current_python = Path(sys.executable).expanduser()
|
||||||
|
target_python = target_python.expanduser()
|
||||||
|
if not current_python.is_absolute():
|
||||||
|
current_python = (ROOT / current_python).absolute()
|
||||||
|
if not target_python.is_absolute():
|
||||||
|
target_python = (ROOT / target_python).absolute()
|
||||||
|
return str(current_python) == str(target_python)
|
||||||
|
|
||||||
|
|
||||||
|
def apply_local_system_config(config_payload: dict[str, Any], runtime_python: Optional[Path] = None) -> None:
|
||||||
|
if _current_python_matches(runtime_python):
|
||||||
|
_apply_local_system_config_inner(config_payload)
|
||||||
|
return
|
||||||
|
|
||||||
|
with TemporaryDirectory() as temp_dir:
|
||||||
|
payload_path = Path(temp_dir) / "moviepilot-config.json"
|
||||||
|
payload_path.write_text(
|
||||||
|
json.dumps(config_payload, ensure_ascii=False, indent=2),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
run(
|
||||||
|
[
|
||||||
|
str(runtime_python),
|
||||||
|
str(Path(__file__).resolve()),
|
||||||
|
"apply-config",
|
||||||
|
"--config-json-file",
|
||||||
|
str(payload_path),
|
||||||
|
],
|
||||||
|
cwd=ROOT,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def init_local(
|
def init_local(
|
||||||
*,
|
*,
|
||||||
resources_repo: Optional[Path],
|
resources_repo: Optional[Path],
|
||||||
@@ -961,6 +996,7 @@ def init_local(
|
|||||||
resources_ready: bool,
|
resources_ready: bool,
|
||||||
force_token: bool,
|
force_token: bool,
|
||||||
wizard: bool,
|
wizard: bool,
|
||||||
|
runtime_python: Optional[Path] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
ensure_local_dirs()
|
ensure_local_dirs()
|
||||||
|
|
||||||
@@ -979,7 +1015,7 @@ def init_local(
|
|||||||
install_resources(resources_repo=resources_repo, resource_dir=resource_dir)
|
install_resources(resources_repo=resources_repo, resource_dir=resource_dir)
|
||||||
|
|
||||||
if wizard_payload:
|
if wizard_payload:
|
||||||
apply_local_system_config(wizard_payload)
|
apply_local_system_config(wizard_payload, runtime_python=runtime_python)
|
||||||
|
|
||||||
|
|
||||||
def install_deps(*, python_bin: str, venv_dir: Path, recreate: bool) -> Path:
|
def install_deps(*, python_bin: str, venv_dir: Path, recreate: bool) -> Path:
|
||||||
@@ -1178,6 +1214,9 @@ def build_parser() -> argparse.ArgumentParser:
|
|||||||
update_parser.add_argument("--skip-resources", action="store_true", help="更新 all 时跳过资源同步")
|
update_parser.add_argument("--skip-resources", action="store_true", help="更新 all 时跳过资源同步")
|
||||||
update_parser.add_argument("--config-dir", help="配置目录,默认使用程序目录外的系统配置目录")
|
update_parser.add_argument("--config-dir", help="配置目录,默认使用程序目录外的系统配置目录")
|
||||||
|
|
||||||
|
apply_config_parser = subparsers.add_parser("apply-config", help=argparse.SUPPRESS)
|
||||||
|
apply_config_parser.add_argument("--config-json-file", required=True, help=argparse.SUPPRESS)
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
|
||||||
@@ -1222,6 +1261,7 @@ def main() -> int:
|
|||||||
resources_ready=False,
|
resources_ready=False,
|
||||||
force_token=args.force_token,
|
force_token=args.force_token,
|
||||||
wizard=args.wizard,
|
wizard=args.wizard,
|
||||||
|
runtime_python=None,
|
||||||
)
|
)
|
||||||
print_step("初始化完成")
|
print_step("初始化完成")
|
||||||
print_step(f"当前配置目录:{config_dir}")
|
print_step(f"当前配置目录:{config_dir}")
|
||||||
@@ -1248,6 +1288,7 @@ def main() -> int:
|
|||||||
resources_ready=resources_installed,
|
resources_ready=resources_installed,
|
||||||
force_token=args.force_token,
|
force_token=args.force_token,
|
||||||
wizard=args.wizard,
|
wizard=args.wizard,
|
||||||
|
runtime_python=venv_python,
|
||||||
)
|
)
|
||||||
print_step(f"本地环境已完成安装与初始化:{venv_python}")
|
print_step(f"本地环境已完成安装与初始化:{venv_python}")
|
||||||
print_step(f"当前配置目录:{config_dir}")
|
print_step(f"当前配置目录:{config_dir}")
|
||||||
@@ -1282,6 +1323,13 @@ def main() -> int:
|
|||||||
print_step("资源文件已同步到最新")
|
print_step("资源文件已同步到最新")
|
||||||
print_step(f"更新完成,当前配置目录:{config_dir}")
|
print_step(f"更新完成,当前配置目录:{config_dir}")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
if args.command == "apply-config":
|
||||||
|
payload = json.loads(Path(args.config_json_file).read_text(encoding="utf-8"))
|
||||||
|
if not isinstance(payload, dict):
|
||||||
|
raise RuntimeError("配置负载格式错误")
|
||||||
|
_apply_local_system_config_inner(payload)
|
||||||
|
return 0
|
||||||
except subprocess.CalledProcessError as exc:
|
except subprocess.CalledProcessError as exc:
|
||||||
print(f"命令执行失败,退出码:{exc.returncode}", file=sys.stderr)
|
print(f"命令执行失败,退出码:{exc.returncode}", file=sys.stderr)
|
||||||
return exc.returncode
|
return exc.returncode
|
||||||
|
|||||||
Reference in New Issue
Block a user