diff --git a/.jhonny/analises.db b/.jhonny/analises.db index 62f15b5..393a21d 100644 Binary files a/.jhonny/analises.db and b/.jhonny/analises.db differ diff --git a/admin/PremiereMCP.command b/admin/PremiereMCP.command index be89b09..625e10d 100755 --- a/admin/PremiereMCP.command +++ b/admin/PremiereMCP.command @@ -18,7 +18,7 @@ # agente de IA buscar o codigo certo. Best-effort: se o # abre o tunel temporariamente quando necessario e fecha o # processo que este ciclo iniciou ao terminar. -# 4. LEMBRETE reinicie o Premiere Pro por completo para o painel +# 4. LEMBRETE recarregue somente a extensao CEP para o painel # reinstalado ser carregado - este passo so imprime isso # # Nao mexe em git (este projeto nao e um repositorio git) e nao sobe @@ -199,19 +199,18 @@ elif run_step rag; then fi # ------------------------------------------------------------ -# 4) Lembrete de recarregar o painel dentro do Premiere +# 4) Lembrete de recarregar somente a extensao dentro do Premiere # ------------------------------------------------------------ if run_step reload; then - step "4/4 REINICIAR O PREMIERE" - echo "O painel ja foi reinstalado (passo 1), mas o Premiere so carrega a" - echo "copia nova depois de um restart completo:" - echo " 1. Feche o Premiere Pro por completo (Cmd+Q)" - echo " 2. Abra de novo e va em Window > Extensions > MCP for Adobe Premiere Pro" - echo " 3. Confira se aparecem as abas 'Bridge' e 'Cortar silencio'" + step "4/4 RECARREGAR A EXTENSAO CEP" + echo "O painel ja foi reinstalado (passo 1). Para carregar a copia nova:" + echo " 1. Feche somente o painel MCP for Adobe Premiere Pro" + echo " 2. Abra novamente em Window > Extensions > MCP for Adobe Premiere Pro" + echo " 3. Confira a aba Editar video e os passos Concluir edicao / Aplicar na timeline" fi echo if [ "$FAILED" != "0" ]; then die "ciclo terminou com pendencias - corrija os avisos acima antes de testar no Premiere." fi -ok "Ciclo concluido. Pronto para recarregar o painel no Premiere." +ok "Ciclo concluido. Pronto para recarregar somente a extensao no Premiere." diff --git a/code/cep-plugin/index.html b/code/cep-plugin/index.html index 0d48afb..7df80be 100755 --- a/code/cep-plugin/index.html +++ b/code/cep-plugin/index.html @@ -95,7 +95,7 @@

Análise do Scanner

Não carregada
-

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

+

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

-
+
-
-

Transcrever a fala

-

Gera o texto com marcação de tempo usando o Whisper local.

-
- Bloqueado -
-
- - - - - - - -
-
- - Só grava a preferência no JSON — não corta nada aqui. A IA decide os cortes usando esse valor. -
-
- - -
-
- - -
-
- - - -
-
-

Concluir edição

Salva no banco a análise carregada, o tipo de vídeo e as configurações editoriais escolhidas. O JSON para a IA poderá ser gerado depois, quando necessário.

- Bloqueado + Bloqueado
@@ -255,14 +145,14 @@
-
+
- +

Aplicar na timeline

Selecione o plano de edição que a IA devolveu (cortes, zooms, textos, marcadores) e execute na sequência.

- Bloqueado + Bloqueado
diff --git a/code/cep-plugin/main.js b/code/cep-plugin/main.js index fe6139e..61d71a5 100755 --- a/code/cep-plugin/main.js +++ b/code/cep-plugin/main.js @@ -2151,11 +2151,13 @@ function silenceSelecionarTipoVideo() { if (!tipo) { document.getElementById("silenceTipoVideoInfo").textContent = "Selecione um tipo cadastrado para continuar."; setStep(1, "ready", "Selecione um tipo"); + setStep(2, "locked", "Selecione o tipo"); document.getElementById("btnBuildPlan").disabled = true; return; } document.getElementById("silenceTipoVideoInfo").textContent = tipo.nome + " · instruções serão incluídas no JSON para a IA."; setStep(1, "done", "Selecionado"); + setStep(2, "ready", "Pronto para concluir"); document.getElementById("btnBuildPlan").disabled = false; silenceLog("Tipo de vídeo selecionado: " + tipo.nome + ".", "ok"); } @@ -2371,10 +2373,9 @@ function silenceLoadScannerAnalysis() { info.textContent = silenceState.sequenceName + " · " + quantidade + " trecho(s) · " + (audioDoBanco.metricas_de_voz_disponiveis ? "métricas disponíveis" : "métricas não realizadas") + " · " + (audioDoBanco.diarizacao_disponivel ? falantes.length + " falante(s)" : "diarização não realizada"); - setStep(3, "ready", "Pronto"); + setStep(2, "locked", "Selecione o tipo"); setStep(1, "ready", "Selecione um tipo"); - setStep(4, "locked", "Selecione o tipo"); - setStep(5, "locked", "Bloqueado"); + setStep(3, "locked", "Aguardando conclusão"); renderizarTiposDeVideoParaEdicao(); document.getElementById("btnBuildPlan").disabled = true; // btnDiarize/btnVoiceFeatures/silenceDiarizeInfo/silenceVoiceFeaturesInfo ficavam no @@ -2712,10 +2713,8 @@ function silenceDetectClip() { // muda — evita aplicar um plano gerado para outro material. function lockStepsFrom(first) { var buttons = { - 2: ["btnTranscribe"], - 3: ["btnDiarize", "btnVoiceFeatures"], - 4: ["btnBuildPlan"], - 5: ["btnApplyEditorialActions"], + 2: ["btnBuildPlan"], + 3: ["btnApplyEditorialActions"], }; for (var n = first; n <= 5; n++) { setStep(n, "locked", "Bloqueado"); @@ -2769,8 +2768,7 @@ function silenceUseCachedTranscript() { // Passos que dependem de existir uma transcrição, seja nova ou reaproveitada. function unlockAfterTranscript() { setStep(2, "done", "Transcrito"); - setStep(3, "ready", "Opcional"); - setStep(4, "ready", "Sua vez"); + setStep(2, "ready", "Pronto para concluir"); document.getElementById("btnBuildPlan").disabled = false; // btnDiarize/btnVoiceFeatures ficavam no step3 (legado, comentado em 2026-09-09). var elBtnDiarize = document.getElementById("btnDiarize"); @@ -3264,14 +3262,6 @@ function silenceConcluirEdicao() { configuracao: { nome_do_tipo: silenceState.tipoVideo.nome, instrucoes_do_tipo: tipoVideoResumoParaJson(silenceState.tipoVideo), - configuracoes_de_fala: speakerConfigurationForJson(), - configuracoes_de_edicao: { - remocao_de_silencio: { - habilitada: document.getElementById("silenceRemovalEnabled").checked, - duracao_minima_segundos: Number(document.getElementById("silenceRemovalMinDuration").value) || 0.8, - }, - legendas: carregarConfiguracaoDeLegendas(), - }, transcricao: { caminho: silenceState.transcriptPath, origem: "Scanner", @@ -3287,7 +3277,7 @@ function silenceConcluirEdicao() { } setBusy("btnBuildPlan", true); - setStep(4, "running", "Salvando…"); + setStep(2, "running", "Salvando…"); taskStart("Concluindo a edição", "Salvando a configuração no banco"); silenceLog("Salvando o tipo de vídeo e as configurações editoriais no banco…"); runStreamed( @@ -3297,14 +3287,14 @@ function silenceConcluirEdicao() { function (codigo, ultimoErro) { setBusy("btnBuildPlan", false); if (codigo !== 0) { - setStep(4, "error", "Falhou"); + setStep(2, "error", "Falhou"); taskEnd(false, "Não foi possível concluir a edição.", ultimoErro); silenceLog("Falha ao salvar a configuração editorial.", "err"); showToast("err", ultimoErro || "Não foi possível salvar a edição no banco."); return; } - setStep(4, "done", "Edição concluída"); - setStep(5, "locked", "Aguardando plano da IA"); + setStep(2, "done", "Edição concluída"); + setStep(3, "locked", "Aguardando plano da IA"); taskEnd(true, "Edição concluída e salva no banco."); silenceLog("Edição concluída e salva no banco de análises.", "ok"); showToast("ok", "Edição concluída e salva no banco."); @@ -3323,20 +3313,15 @@ function silenceGenerateJson() { return; } setBusy("btnBuildPlan", true); - setStep(4, "running", "Gerando…"); + setStep(2, "running", "Gerando…"); silenceLog("Gerando arquivo JSON para a IA…"); try { var transcript = JSON.parse(fs.readFileSync(silenceState.transcriptPath, "utf-8")); - var silenceEnabled = document.getElementById("silenceRemovalEnabled").checked; - var minSilence = parseFloat(document.getElementById("silenceRemovalMinDuration").value); - if (!isFinite(minSilence) || minSilence < 0) minSilence = 0.8; - transcript.sequence = { name: silenceState.sequenceName, media_path: silenceState.mediaPath, }; transcript.settings = Object.assign({}, transcript.settings, { - silence_removal: { enabled: silenceEnabled, min_silence_seconds: minSilence }, legendas: carregarConfiguracaoDeLegendas(), }); transcript.speaker_configuration = speakerConfigurationForJson(); @@ -3361,13 +3346,13 @@ function silenceGenerateJson() { document.getElementById("silencePlanInfo").textContent = "Envie este arquivo a um agente de IA externo. Ele deve devolver o plano de edição em JSON para o passo 5."; - setStep(4, "done", "JSON pronto"); - setStep(5, "ready", "Sua vez"); + setStep(2, "done", "JSON pronto"); + setStep(3, "ready", "Sua vez"); document.getElementById("btnApplyEditorialActions").disabled = false; showToast("ok", "JSON gerado: " + path.basename(out)); silenceLog("JSON gerado em " + out + " (" + segCount + " trechos).", "ok"); } catch (e) { - setStep(4, "error", "Falhou"); + setStep(2, "error", "Falhou"); showToast("err", "Falha ao gerar o JSON: " + e.message); silenceLog("Falha ao gerar o JSON: " + e.message, "err"); } @@ -3442,7 +3427,7 @@ function applyEditorialActions() { if (typeof window.confirm === "function" && !window.confirm(summary)) return; setBusy("btnApplyEditorialActions", true); - setStep(5, "running", "Aplicando…"); + setStep(3, "running", "Aplicando…"); taskStart("Aplicando o plano de edição", "Criando backup da sequência"); silenceLog("Criando backup da sequência…"); cs.evalScript( @@ -3457,7 +3442,7 @@ function applyEditorialActions() { var caminhoDoPlano = path.join(silenceState.outputDir || os.tmpdir(), "plano-editorial-" + Date.now() + ".json"); try { fs.writeFileSync(caminhoDoPlano, JSON.stringify(plan, null, 2), "utf-8"); } catch (erroEscrita) { setBusy("btnApplyEditorialActions", false); - setStep(5, "error", "Falhou"); + setStep(3, "error", "Falhou"); taskEnd(false, "Não foi possível salvar o plano.", erroEscrita.message); return; } @@ -3474,12 +3459,12 @@ function applyEditorialActions() { processoAplicacao = null; setBusy("btnApplyEditorialActions", false); if (code !== 0) { - setStep(5, "error", "Falhou"); + setStep(3, "error", "Falhou"); taskEnd(false, "Falha ao aplicar o plano (código " + code + ").", lastErr); silenceLog("Falha ao aplicar o plano (código " + code + ").", "err"); return; } - setStep(5, "done", "Aplicado"); + setStep(3, "done", "Aplicado"); taskEnd(true, numActions + " ação(ões) aplicadas na timeline!"); silenceLog("Plano de edição aplicado com sucesso!", "ok"); } @@ -4134,8 +4119,8 @@ function downloadModel(model, btn, approxMB) { setStep(1, "locked", "Scanner"); setStep(2, "locked", "Scanner"); setStep(3, "locked", "Aguardando análise"); - setStep(4, "locked", "Aguardando análise"); - setStep(5, "locked", "Aguardando plano"); + setStep(2, "locked", "Aguardando análise"); + setStep(3, "locked", "Aguardando análise"); log("MCP for Adobe Premiere Pro CEP connector loaded"); setStatus("waiting", "Aguardando — a ponte está iniciando");