From cad6bbf6e4d48060d75edf829af12725fc6cb91d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Henrique?= Date: Wed, 9 Sep 2026 19:26:55 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20corrigida=20a=20tela=20Editar=20v=C3=AD?= =?UTF-8?q?deo=20para=20iniciar=20pela=20an=C3=A1lise=20do=20S?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .jhonny/analises.db | Bin 1773568 -> 1781760 bytes code/cep-plugin/index.html | 12 +++-- code/cep-plugin/main.js | 96 +++++++++++++++++++++++++++++++++++-- code/cep-plugin/styles.css | 2 + 4 files changed, 104 insertions(+), 6 deletions(-) diff --git a/.jhonny/analises.db b/.jhonny/analises.db index 6a1bbcf3f4b7fa5877c43bd40fa9cf7f1e7abbe9..f3b048dcf737a8ac29424c27ad84f6754f5b7547 100644 GIT binary patch delta 9781 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 delta 1184 zcmXZbTS!zv7zglk_U!K2%h@w)mNs*`ffSmO^Q~(+FFRbu zw@F3z&_{RZqZ&+TW0dV_y~e|r#+R2bA76e~uhIXua?Uk|?HjXq1%H zRBg*-s@>pU&*DYgQ{yXT{S5H(3%FmTYFH{$<$)hRh0hJAiVvsy>=d8DmwDekOJv_Q zP!~Imi^Tb@74rOC@V2q|nwTTLSk`OczX%SC`igS!&NlFtC_bjT|HflqA}6S1l*k`L z53&IE_xZkRcRdYChUeWMwinmSb4fT?`;;6N_cX4O_sG{WACWQKQ#0zo)ADu89+RIu zSNpD&$kF3uv-2`ej`Q;iYN5_<5q*oCDHY@&AG5qhUUvwt%fv`pw4GQj+s*^uS4qBz zSgk9-X)XBvD$*nBy;ag>pTaWogvY&zJ(qI%3kTG=Voo>Cg>D9z|C4t>3#oDbFE3QX zcFB4SBA zX5CV+hrD+FCgj|oYVCEe6_-DzX7QEx)(ce5;ptenr&Sf9RK0 A4*&oF diff --git a/code/cep-plugin/index.html b/code/cep-plugin/index.html index f13a9d6..19368f6 100755 --- a/code/cep-plugin/index.html +++ b/code/cep-plugin/index.html @@ -82,9 +82,15 @@
-

Siga os passos de cima para baixo. Cada passo libera o seguinte.

+

A edição usa a análise já concluída pelo Scanner. Revise os dados, gere o plano JSON e aplique-o na timeline.

-
+
+

Análise do Scanner

Não carregada
+

Carregue a análise mais recente do Scanner antes de gerar o plano de edição.

+ +
+ +
@@ -109,7 +115,7 @@
-
+
diff --git a/code/cep-plugin/main.js b/code/cep-plugin/main.js index e8a114c..8d89d3e 100755 --- a/code/cep-plugin/main.js +++ b/code/cep-plugin/main.js @@ -2025,6 +2025,93 @@ var silenceState = { 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 speakerAudioQueue = null; @@ -3578,9 +3665,12 @@ function downloadModel(model, btn, approxMB) { renderEditorPersonalities(); restaurarConfiguracaoDeLegendas(); - // Passo 1 é o único liberado até o vídeo ser detectado. - setStep(1, "ready", "Comece aqui"); - lockStepsFrom(2); + // A aba Editar vídeo começa com a análise já produzida pelo Scanner. + setStep(1, "locked", "Scanner"); + 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"); setStatus("waiting", "Aguardando — a ponte está iniciando"); diff --git a/code/cep-plugin/styles.css b/code/cep-plugin/styles.css index e849670..1f28000 100755 --- a/code/cep-plugin/styles.css +++ b/code/cep-plugin/styles.css @@ -175,6 +175,8 @@ h1, h2, h3 { margin: 0; } .scanner-option-row .checkbox-field { flex: 1; } .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; } +.editar-video-legado { display: none; } +.scanner-analysis-card { margin-bottom: 12px; } /* --------------------- Painel de progresso (task dock) ------------------- */ .task-dock {