feat: corrigida a tela Editar vídeo para iniciar pela análise do S

- corrigida a tela Editar vídeo para iniciar pela análise do Scanner e exibir somente o fluxo pós-Scanner

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

 4 files changed, 104 insertions(+), 6 deletions(-)

Arquivos:
  - .jhonny/analises.db
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/cep-plugin/styles.css
This commit is contained in:
João Henrique
2026-09-09 19:26:55 -04:00
parent 5e1e471b3a
commit cad6bbf6e4
4 changed files with 104 additions and 6 deletions
Binary file not shown.
+9 -3
View File
@@ -82,9 +82,15 @@
<!-- ============================= EDITAR VÍDEO ============================= --> <!-- ============================= EDITAR VÍDEO ============================= -->
<div class="tab-panel" id="tabSilence" role="tabpanel" aria-labelledby="tabBtnSilence"> <div class="tab-panel" id="tabSilence" role="tabpanel" aria-labelledby="tabBtnSilence">
<p class="tab-intro">Siga os passos de cima para baixo. Cada passo libera o seguinte.</p> <p class="tab-intro">A edição usa a análise já concluída pelo Scanner. Revise os dados, gere o plano JSON e aplique-o na timeline.</p>
<section class="step" id="step1" data-state="ready"> <section class="card scanner-analysis-card" id="scannerAnalysisCard">
<div class="card-head"><h2>Análise do Scanner</h2><span class="step-chip" id="scannerAnalysisStatus">Não carregada</span></div>
<p class="field-help" id="scannerAnalysisInfo">Carregue a análise mais recente do Scanner antes de gerar o plano de edição.</p>
<button id="btnLoadScannerAnalysis" class="button button-primary" onclick="silenceLoadScannerAnalysis()" type="button">Carregar análise do Scanner</button>
</section>
<section class="step editar-video-legado" id="step1" data-state="ready">
<div class="step-head"> <div class="step-head">
<span class="step-number" aria-hidden="true">1</span> <span class="step-number" aria-hidden="true">1</span>
<div class="step-title"> <div class="step-title">
@@ -109,7 +115,7 @@
</div> </div>
</section> </section>
<section class="step" id="step2" data-state="locked"> <section class="step editar-video-legado" id="step2" data-state="locked">
<div class="step-head"> <div class="step-head">
<span class="step-number" aria-hidden="true">2</span> <span class="step-number" aria-hidden="true">2</span>
<div class="step-title"> <div class="step-title">
+93 -3
View File
@@ -2025,6 +2025,93 @@ var silenceState = {
speakerTurns: [], speakerTurns: [],
}; };
function silenceLocalizarUltimoRelatorioDoScanner() {
var raiz = scannerOutputRoot();
var candidatos = [];
try {
fs.readdirSync(raiz).forEach(function (nomeDaPasta) {
var pasta = path.join(raiz, nomeDaPasta);
var relatorio = path.join(pasta, nomeDaPasta + "-resultado.json");
if (fs.existsSync(relatorio)) candidatos.push(relatorio);
});
} catch (_) {}
candidatos.sort(function (a, b) {
try { return fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs; } catch (_) { return 0; }
});
return candidatos[0] || null;
}
function silenceConverterRelatorioDoScannerParaTranscricao(caminhoDoRelatorio, dadosDoRelatorio) {
var segmentos = [];
(dadosDoRelatorio.artefatos && dadosDoRelatorio.artefatos.audio || []).forEach(function (nomeDoArquivo) {
var caminhoDoAudio = path.join(path.dirname(caminhoDoRelatorio), nomeDoArquivo);
if (!fs.existsSync(caminhoDoAudio)) return;
var dadosDoAudio;
try { dadosDoAudio = JSON.parse(fs.readFileSync(caminhoDoAudio, "utf-8")); } catch (_) { return; }
(dadosDoAudio.segmentos_por_clipe || []).forEach(function (grupo) {
(grupo.segmentos || []).forEach(function (segmento) {
segmentos.push({
start: Number(segmento.inicio), end: Number(segmento.fim),
inicio: Number(segmento.inicio), fim: Number(segmento.fim),
text: segmento.texto || "", texto: segmento.texto || "",
confidence: segmento.confianca, confianca: segmento.confianca,
speaker: segmento.falante, falante: segmento.falante,
caracteristicas_acusticas: segmento.caracteristicas_acusticas || {},
words: segmento.palavras || [], palavras: segmento.palavras || [],
});
});
});
});
segmentos.sort(function (a, b) { return a.start - b.start; });
return { version: 1, segments: segmentos, origem: "scanner" };
}
function silenceLoadScannerAnalysis() {
var status = document.getElementById("scannerAnalysisStatus");
var info = document.getElementById("scannerAnalysisInfo");
setBusy("btnLoadScannerAnalysis", true);
var caminhoDoRelatorio = silenceLocalizarUltimoRelatorioDoScanner();
if (!caminhoDoRelatorio) {
setBusy("btnLoadScannerAnalysis", false);
status.textContent = "Não encontrada";
info.textContent = "Execute o Scanner primeiro para criar uma análise reutilizável.";
showToast("err", info.textContent);
return;
}
try {
var dadosDoRelatorio = JSON.parse(fs.readFileSync(caminhoDoRelatorio, "utf-8"));
var sequencia = dadosDoRelatorio.sequencia || {};
silenceState.sequenceId = sequencia.id || null;
silenceState.sequenceName = sequencia.nome || path.basename(caminhoDoRelatorio);
silenceState.mediaPath = null;
silenceState.fileBaseName = path.basename(path.dirname(caminhoDoRelatorio));
silenceState.outputDir = path.dirname(caminhoDoRelatorio);
silenceState.transcriptPath = path.join(silenceState.outputDir, "transcricao-do-scanner.json");
silenceState.cachedTranscriptPath = null;
fs.writeFileSync(silenceState.transcriptPath, JSON.stringify(
silenceConverterRelatorioDoScannerParaTranscricao(caminhoDoRelatorio, dadosDoRelatorio), null, 2), "utf-8");
var transcricao = JSON.parse(fs.readFileSync(silenceState.transcriptPath, "utf-8"));
var quantidade = transcricao.segments.length;
status.textContent = "Carregada";
info.textContent = silenceState.sequenceName + " · " + quantidade + " trecho(s) vindos do Scanner.";
setStep(3, "ready", "Pronto");
setStep(4, "ready", "Pronto");
setStep(5, "locked", "Bloqueado");
document.getElementById("btnBuildPlan").disabled = false;
document.getElementById("btnDiarize").disabled = true;
document.getElementById("btnVoiceFeatures").disabled = true;
document.getElementById("silenceDiarizeInfo").textContent = "Os falantes disponíveis vieram da análise do Scanner.";
document.getElementById("silenceVoiceFeaturesInfo").textContent = "As métricas disponíveis vieram da análise do Scanner.";
silenceLog("Análise do Scanner carregada: " + quantidade + " trecho(s).", "ok");
showToast("ok", "Análise do Scanner carregada.");
} catch (erro) {
status.textContent = "Erro";
info.textContent = "Não foi possível ler a análise: " + erro.message;
showToast("err", info.textContent);
}
setBusy("btnLoadScannerAnalysis", false);
}
var speakerAudioPlayer = null; var speakerAudioPlayer = null;
var speakerAudioQueue = null; var speakerAudioQueue = null;
@@ -3578,9 +3665,12 @@ function downloadModel(model, btn, approxMB) {
renderEditorPersonalities(); renderEditorPersonalities();
restaurarConfiguracaoDeLegendas(); restaurarConfiguracaoDeLegendas();
// Passo 1 é o único liberado até o vídeo ser detectado. // A aba Editar vídeo começa com a análise já produzida pelo Scanner.
setStep(1, "ready", "Comece aqui"); setStep(1, "locked", "Scanner");
lockStepsFrom(2); setStep(2, "locked", "Scanner");
setStep(3, "ready", "Aguardando análise");
setStep(4, "locked", "Aguardando análise");
setStep(5, "locked", "Aguardando plano");
log("MCP for Adobe Premiere Pro CEP connector loaded"); log("MCP for Adobe Premiere Pro CEP connector loaded");
setStatus("waiting", "Aguardando — a ponte está iniciando"); setStatus("waiting", "Aguardando — a ponte está iniciando");
+2
View File
@@ -175,6 +175,8 @@ h1, h2, h3 { margin: 0; }
.scanner-option-row .checkbox-field { flex: 1; } .scanner-option-row .checkbox-field { flex: 1; }
.button-mini { padding: 4px 8px; font-size: 10px; } .button-mini { padding: 4px 8px; font-size: 10px; }
.editorial-plan-json { width: 100%; min-height: 150px; resize: vertical; box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; line-height: 1.45; color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 9px; } .editorial-plan-json { width: 100%; min-height: 150px; resize: vertical; box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; line-height: 1.45; color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 9px; }
.editar-video-legado { display: none; }
.scanner-analysis-card { margin-bottom: 12px; }
/* --------------------- Painel de progresso (task dock) ------------------- */ /* --------------------- Painel de progresso (task dock) ------------------- */
.task-dock { .task-dock {