feat: criado protótipo local de montagem incremental com gancho e

- criado protótipo local de montagem incremental com gancho e trechos preservados
- adicionado checkbox no painel para executar planos pelo modo de montagem incremental

Resumo:
- 8 arquivos alterados
- 4 novos
- 4 modificados
- 0 removidos

 4 files changed, 230 insertions(+)

Arquivos:
  - .jhonny/analises.db
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/src/tools/timeline.ts
  - code/engine/aplicar_montagem_incremental_prototipo.py
  - code/engine/editor/pedido_montagem_incremental_exemplo.json
  - code/engine/editor/plano_montagem_incremental_6.json
  - code/engine/editor/prototipo_montagem_incremental.py
This commit is contained in:
João Henrique
2026-09-10 19:21:07 -04:00
parent 024b004938
commit 59f1358f18
8 changed files with 643 additions and 0 deletions
+50
View File
@@ -419,6 +419,7 @@ function inserirLegendasNaTimeline() {
// ---- Teste isolado de ações pela engine Python ----------------------------
var TESTAR_ACOES_ENGINE_SCRIPT = "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine/aplicar_plano_de_edicao.py";
var MONTAGEM_INCREMENTAL_ENGINE_SCRIPT = "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine/aplicar_montagem_incremental_prototipo.py";
function testarAcoesCarregarExemplo() {
var exemplo = {
@@ -3805,6 +3806,11 @@ function applyEditorialActions() {
}
var numActions = plan.actions.length;
if (document.getElementById("editorialIncrementalMode") && document.getElementById("editorialIncrementalMode").checked) {
aplicarMontagemIncremental(plan, numActions);
return;
}
var summary =
numActions + " ação(ões) no plano (cortes, ganchos, zooms, textos e/ou marcadores).\n\n" +
"Um backup da sequência atual será criado antes de aplicar. Confirmar?";
@@ -3867,6 +3873,50 @@ function applyEditorialActions() {
);
}
function aplicarMontagemIncremental(plan, numActions) {
var summary =
numActions + " ação(ões) serão convertidas em trechos preservados.\n\n" +
"Será criada uma nova sequência clonada; a sequência original não será cortada. Confirmar?";
if (typeof window.confirm === "function" && !window.confirm(summary)) return;
setBusy("btnApplyEditorialActions", true);
setStep(3, "running", "Montando cópia…");
taskStart("Montagem incremental (teste)", "Clonando a sequência e preparando os trechos");
var caminhoDoPlano = path.join(silenceState.outputDir || os.tmpdir(), "plano-incremental-" + Date.now() + ".json");
try { fs.writeFileSync(caminhoDoPlano, JSON.stringify(plan, null, 2), "utf-8"); } catch (erroEscrita) {
setBusy("btnApplyEditorialActions", false);
setStep(3, "error", "Falhou");
taskEnd(false, "Não foi possível salvar o plano incremental.", erroEscrita.message);
return;
}
var processoIncremental = null;
taskStart("Montagem incremental (teste)", "Executando na sequência clonada", null, function () {
if (processoIncremental) processoIncremental.kill("SIGTERM");
});
processoIncremental = runStreamed(
SCANNER_PYTHON_BIN,
[MONTAGEM_INCREMENTAL_ENGINE_SCRIPT, caminhoDoPlano],
function (line) { silenceLog(line); },
function (code, lastErr, lastOutput) {
processoIncremental = null;
setBusy("btnApplyEditorialActions", false);
if (code !== 0) {
setStep(3, "error", "Falhou");
var detalhe = lastErr || "A montagem incremental não retornou detalhes.";
try { detalhe = JSON.parse(lastOutput || "{}").erro || detalhe; } catch (_) {}
taskEnd(false, "A montagem incremental falhou.", detalhe);
silenceLog("Montagem incremental não aplicada: " + detalhe, "err");
return;
}
setStep(3, "done", "Cópia montada");
var resultado = null;
try { resultado = JSON.parse(lastOutput || "{}").resultado || null; } catch (_) {}
var nome = resultado && resultado.destinationSequenceName ? resultado.destinationSequenceName : "nova sequência";
taskEnd(true, "Montagem incremental concluída em " + nome + ".");
silenceLog("Montagem incremental concluída em " + nome + ".", "ok");
}
);
}
// Abre o seletor de arquivos nativo do CEP em vez de exigir que a pessoa cole
// um caminho absoluto à mão.
function pickEditorialPlanFile() {