feat: aprimorado o preview de falantes na tela Refinar para reprod

- aprimorado o preview de falantes na tela Refinar para reproduzir os trechos do vídeo
- corrigida a leitura dos timestamps do preview de falantes usando os clipes do banco
- alterado o preview de falantes para reproduzir diretamente na timeline ativa do Premiere
- evitadas reinicializações concorrentes durante o monitoramento do preview na timeline
- substituído o polling contínuo por temporização de cada trecho do preview
- restaurado o preview de áudio dos falantes usando o WAV da transcrição
- corrigida a localização do WAV de transcrição ao carregar análises existentes
- atualizado o cabeçalho do painel CEP para Jhonny Marrone com ícone de lâmpada mágica

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

 4 files changed, 39 insertions(+), 5 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-10 10:04:54 -04:00
parent becdc3afd5
commit 37698ba62a
4 changed files with 39 additions and 5 deletions
+8 -2
View File
@@ -10,9 +10,15 @@
<div class="panel-shell">
<header class="panel-header">
<div class="brand-mark" aria-hidden="true"><span>M</span></div>
<div class="brand-mark" aria-hidden="true">
<svg viewBox="0 0 24 24" role="img" aria-label="Lâmpada mágica">
<path d="M8.1 14.2c-1.1-1-1.8-2.4-1.8-4.1 0-3.1 2.5-5.6 5.7-5.6s5.7 2.5 5.7 5.6c0 1.7-.7 3.1-1.8 4.1-.8.8-1.2 1.4-1.3 2.3H9.4c-.1-.9-.5-1.5-1.3-2.3Z" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
<path d="M9.6 19h4.8M10.5 21h3M4.2 5.8l-1.3-1.3M19.8 5.8l1.3-1.3M12 2.5V1M4.2 10.1H2.5M21.5 10.1h-1.7" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
<path d="m12 7.1.6 1.7 1.7.6-1.7.6-.6 1.7-.6-1.7-1.7-.6 1.7-.6.6-1.7Z" fill="currentColor" stroke="none"/>
</svg>
</div>
<div class="brand-copy">
<h1>MCP for Adobe Premiere Pro</h1>
<h1>Jhonny Marrone</h1>
<p>Conexão local com o Premiere</p>
</div>
<div class="header-status" id="headerStatus" data-state="waiting" title="Status da conexão">
+30 -3
View File
@@ -2246,8 +2246,28 @@ function silenceConsultarPreviewDeFalantes(videoId) {
} catch (_) { return null; }
}
function silenceLocalizarAudioParaFalantes(pasta) {
function silenceLocalizarAudioParaFalantes(pasta, dadosDoRelatorio) {
var encontrados = [];
var nomesDeMidia = [];
function adicionarNomeDeMidia(nome) {
if (!nome) return;
var base = path.parse(String(nome)).name;
if (base && nomesDeMidia.indexOf(base) < 0) nomesDeMidia.push(base);
}
adicionarNomeDeMidia(silenceState.mediaPath);
var artefatosDeAudio = dadosDoRelatorio && dadosDoRelatorio.artefatos && dadosDoRelatorio.artefatos.audio || [];
artefatosDeAudio.forEach(function (nomeDoArtefato) {
try {
var caminhoDoArtefato = path.join(pasta, nomeDoArtefato);
var dadosDoAudio = JSON.parse(fs.readFileSync(caminhoDoArtefato, "utf-8"));
(dadosDoAudio.faixa && dadosDoAudio.faixa.clipes || []).forEach(function (clipe) {
adicionarNomeDeMidia(clipe.nome || clipe.arquivo || clipe.sourceFile);
});
} catch (_) {}
});
function visitar(caminho) {
if (encontrados.length) return;
try {
@@ -2261,7 +2281,14 @@ function silenceLocalizarAudioParaFalantes(pasta) {
} catch (_) {}
}
visitar(pasta);
return encontrados[0] || null;
if (encontrados.length) return encontrados[0];
for (var indice = 0; indice < nomesDeMidia.length; indice++) {
var pastaDaTranscricao = path.join(SILENCE_OUTPUT_ROOT, nomesDeMidia[indice]);
var caminhoDoAudio = path.join(pastaDaTranscricao, nomesDeMidia[indice] + ".wav");
if (fs.existsSync(caminhoDoAudio)) return caminhoDoAudio;
}
return null;
}
function silenceLocalizarMidiaNoRelatorio(caminhoDoRelatorio, dadosDoRelatorio) {
@@ -2300,7 +2327,7 @@ function silenceLoadScannerAnalysis() {
silenceState.mediaPath = silenceLocalizarMidiaNoRelatorio(caminhoDoRelatorio, dadosDoRelatorio);
silenceState.fileBaseName = path.basename(path.dirname(caminhoDoRelatorio));
silenceState.outputDir = path.dirname(caminhoDoRelatorio);
silenceState.audioCachePath = silenceLocalizarAudioParaFalantes(silenceState.outputDir);
silenceState.audioCachePath = silenceLocalizarAudioParaFalantes(silenceState.outputDir, dadosDoRelatorio);
silenceState.transcriptPath = path.join(silenceState.outputDir, "transcricao-do-scanner.json");
silenceState.cachedTranscriptPath = null;
silenceState.tipoVideoId = null;
+1
View File
@@ -81,6 +81,7 @@ h1, h2, h3 { margin: 0; }
font-weight: 750;
letter-spacing: -0.04em;
}
.brand-mark svg { width: 21px; height: 21px; }
.brand-copy { min-width: 0; flex: 1; }
.brand-copy h1 { overflow: hidden; font-size: 12px; line-height: 1.25; font-weight: 650; text-overflow: ellipsis; white-space: nowrap; }