feat: corrigida a resolução do Node.js ao executar planos Python p
- corrigida a resolução do Node.js ao executar planos Python pelo painel CEP Resumo: - 2 arquivos alterados - 1 novos - 1 modificados - 0 removidos 1 file changed, 38 insertions(+), 1 deletion(-) Arquivos: - code/engine/aplicar_plano_de_edicao.py - code/engine/testes/test_aplicar_plano_de_edicao.py
This commit is contained in:
@@ -18,6 +18,8 @@ troca de sequência.
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
@@ -41,6 +43,40 @@ from engine.integracoes.premiere.sessao_mcp import SessaoMCP
|
||||
CAMINHO_DO_SERVIDOR_MCP = CAMINHO_DO_CODIGO / "dist" / "index.js"
|
||||
|
||||
|
||||
def resolver_caminho_do_node() -> str:
|
||||
"""Resolve o executável Node mesmo quando o painel CEP possui um PATH reduzido.
|
||||
|
||||
A variável ``PREMIERE_NODE_BIN`` permite que o painel ou o sistema informe
|
||||
um caminho explícito. Em seguida, a resolução tenta o ``PATH`` e os
|
||||
caminhos comuns de instalação local. Levanta :class:`FileNotFoundError`
|
||||
com orientação acionável quando o Node não está disponível.
|
||||
"""
|
||||
caminho_configurado = os.environ.get("PREMIERE_NODE_BIN", "").strip()
|
||||
if caminho_configurado:
|
||||
if os.path.isfile(caminho_configurado) and os.access(caminho_configurado, os.X_OK):
|
||||
return caminho_configurado
|
||||
raise FileNotFoundError(
|
||||
f"Node.js configurado em PREMIERE_NODE_BIN não é executável: {caminho_configurado}"
|
||||
)
|
||||
|
||||
encontrado_no_path = shutil.which("node.exe" if os.name == "nt" else "node")
|
||||
if encontrado_no_path:
|
||||
return encontrado_no_path
|
||||
|
||||
caminhos_conhecidos = (
|
||||
("C:/Program Files/nodejs/node.exe", "C:/Program Files/nodejs/nodejs.exe")
|
||||
if os.name == "nt"
|
||||
else ("/opt/homebrew/bin/node", "/usr/local/bin/node", "/usr/bin/node")
|
||||
)
|
||||
for caminho in caminhos_conhecidos:
|
||||
if os.path.isfile(caminho) and os.access(caminho, os.X_OK):
|
||||
return caminho
|
||||
raise FileNotFoundError(
|
||||
"Node.js não encontrado. Instale o Node.js ou configure PREMIERE_NODE_BIN "
|
||||
"com o caminho completo do executável."
|
||||
)
|
||||
|
||||
|
||||
def executar(caminho_do_plano: Path) -> dict:
|
||||
"""Lê o plano em ``caminho_do_plano`` e o aplica na sequência ativa do Premiere.
|
||||
|
||||
@@ -52,7 +88,8 @@ def executar(caminho_do_plano: Path) -> dict:
|
||||
# A pausa é aplicada no cliente, e não dentro do aplicador, para valer
|
||||
# igualmente nas leituras da timeline e nas escritas — são todas
|
||||
# round-trips síncronos no processo principal do Premiere.
|
||||
cliente = ClienteMCPComPausa(ClienteMCPPorStdio(["node", str(CAMINHO_DO_SERVIDOR_MCP)]))
|
||||
caminho_do_node = resolver_caminho_do_node()
|
||||
cliente = ClienteMCPComPausa(ClienteMCPPorStdio([caminho_do_node, str(CAMINHO_DO_SERVIDOR_MCP)]))
|
||||
with SessaoMCP(cliente):
|
||||
acesso_ao_editor = AcessoAoEditor(AcessoATimeline(cliente))
|
||||
conversor_de_timeline = ConversorDeTimeline()
|
||||
|
||||
Reference in New Issue
Block a user