feat: corrigido encoding UTF-8 nos spawns de Python do painel CEP

- corrigido encoding UTF-8 nos spawns de Python do painel CEP para exibir caracteres acentuados corretamente

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

 3 files changed, 21 insertions(+), 17 deletions(-)

Arquivos:
  - .jhonny/analises.db
  - code/cep-plugin/main.js
  - code/engine/aplicar_plano_de_edicao.py
This commit is contained in:
João Henrique
2026-09-10 17:36:54 -04:00
parent 2c11ba8dda
commit 0260254e45
3 changed files with 21 additions and 17 deletions
+20 -17
View File
@@ -852,10 +852,10 @@ function analisesCarregar() {
analisesRelatorioPath = path.join(os.tmpdir(), "jhonny-analises-" + stamp + ".json");
setBusy("btnAnalisesCarregar", true); taskStart("Análises", "Lendo o banco de análises", null);
var child = childProcess.spawn(SCANNER_PYTHON_BIN, [ANALISES_ENGINE_SCRIPT, ANALISES_DB_PATH, analisesRelatorioPath],
{ cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code", stdio: ["ignore", "pipe", "pipe"] });
{ cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code", stdio: ["ignore", "pipe", "pipe"], env: Object.assign({}, process.env, { PYTHONIOENCODING: "utf-8" }) });
var stderr = "", stdout = "";
child.stdout.on("data", function (chunk) { stdout += chunk.toString(); });
child.stderr.on("data", function (chunk) { stderr += chunk.toString(); });
child.stdout.on("data", function (chunk) { stdout += chunk.toString("utf-8"); });
child.stderr.on("data", function (chunk) { stderr += chunk.toString("utf-8"); });
child.on("error", function (error) { setBusy("btnAnalisesCarregar", false); taskEnd(false, "Análises indisponíveis", error.stack || error.message); });
child.on("close", function (code) {
setBusy("btnAnalisesCarregar", false);
@@ -1081,15 +1081,15 @@ function retakesAnalisar() {
document.getElementById("retakesProgressoCard").hidden = false;
document.getElementById("retakesProgressoEtapa").textContent = "Analisando retakes…";
var child = childProcess.spawn(SCANNER_PYTHON_BIN, [RETAKES_ENGINE_SCRIPT, entrada, path.join(retakesRaiz(), retakesCasoAtual)],
{ cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine", stdio: ["ignore", "pipe", "pipe"] });
{ cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code/engine", stdio: ["ignore", "pipe", "pipe"], env: Object.assign({}, process.env, { PYTHONIOENCODING: "utf-8" }) });
retakesProcesso = child;
var resto = "";
var erroTecnico = "";
child.stdout.on("data", function (pedaco) {
resto += pedaco.toString(); var linhas = resto.split("\n"); resto = linhas.pop();
resto += pedaco.toString("utf-8"); var linhas = resto.split("\n"); resto = linhas.pop();
linhas.forEach(function (linha) { var evento; try { evento = JSON.parse(linha); } catch (_) { return; } retakesProcessarEvento(evento); });
});
child.stderr.on("data", function (pedaco) { erroTecnico += pedaco.toString(); if (pedaco.toString().trim()) retakesLog(pedaco.toString().trim()); });
child.stderr.on("data", function (pedaco) { var texto = pedaco.toString("utf-8"); erroTecnico += texto; if (texto.trim()) retakesLog(texto.trim()); });
child.on("error", function (erro) { retakesProcesso = null; setBusy("btnRetakesAnalisar", false); taskEnd(false, "Engine indisponível", erro.stack || erroTecnico || erro.message); showToast("err", erro.message); });
child.on("close", function (codigo) {
retakesProcesso = null; setBusy("btnRetakesAnalisar", false);
@@ -1379,17 +1379,17 @@ function scannerIniciarProcessamento() {
scannerReportPath=path.join(outputRoot,"relatorio-"+stamp+".json");
fs.writeFileSync(input,JSON.stringify({perfil:profile,timeline:scannerTimeline},null,2),"utf-8");
setBusy("btnScannerProcess",true);
var spawnOptions={cwd:"/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code",stdio:["ignore","pipe","pipe"]};
var huggingFaceEnvironment=hfSpawnOptions(); if(huggingFaceEnvironment&&huggingFaceEnvironment.env) spawnOptions.env=huggingFaceEnvironment.env;
var spawnOptions={cwd:"/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code",stdio:["ignore","pipe","pipe"],env:Object.assign({},process.env,{PYTHONIOENCODING:"utf-8"})};
var huggingFaceEnvironment=hfSpawnOptions(); if(huggingFaceEnvironment&&huggingFaceEnvironment.env) spawnOptions.env=Object.assign({},spawnOptions.env,huggingFaceEnvironment.env);
var child=childProcess.spawn(SCANNER_PYTHON_BIN,[SCANNER_ENGINE_SCRIPT,input,scannerReportPath],spawnOptions);
scannerProcesso=child; scannerCancelSolicitado=false;
taskStart("Scanner", "Preparando análise", null, function () { scannerCancelSolicitado=true; if (scannerProcesso) scannerProcesso.kill("SIGTERM"); });
var stderr="", stdout="";
child.stdout.on("data",function(chunk) {
stdout += chunk.toString(); var lines=stdout.split("\n"); stdout=lines.pop();
stdout += chunk.toString("utf-8"); var lines=stdout.split("\n"); stdout=lines.pop();
lines.forEach(function(line) { try { var event=JSON.parse(line); if (event.evento === "progresso") taskUpdate({stage:event.etapa, detail:event.clipe || "", pct:event.percentual}); if (event.evento === "concluido" && event.arquivo) scannerReportPath=event.arquivo; } catch (_) {} });
});
child.stderr.on("data",function(chunk){stderr+=chunk.toString();});
child.stderr.on("data",function(chunk){stderr+=chunk.toString("utf-8");});
child.on("error",function(error){setBusy("btnScannerProcess",false);taskEnd(false,"Scanner indisponível",error.stack||error.message);showToast("err",error.message);});
child.on("close",function(code){var foiCancelado=scannerCancelSolicitado;scannerProcesso=null;setBusy("btnScannerProcess",false);if(foiCancelado){taskEnd(false,"Scanner cancelado");return;}if(code!==0||!fs.existsSync(scannerReportPath)){taskEnd(false,"Scanner falhou",stderr||"Não foi possível gerar o relatório.");showToast("err",stderr||"Não foi possível gerar o relatório.");return;}scannerRelatorioExistente=scannerReportPath;scannerAtualizarComplementos();taskEnd(true,"Relatório JSON gerado");document.getElementById("scannerReportPath").textContent=scannerReportPath;document.getElementById("scannerReportCard").hidden=false;showToast("ok","Scanner concluído.");});
}
@@ -1401,16 +1401,16 @@ function scannerProcessarComplemento(acao) {
var entrada = path.join(scannerOutputRoot(), "pedido-complemento-" + Date.now() + ".json");
var perfil; try { perfil = scannerProfileFromScreen(); } catch (error) { setBusy(botao.id, false); showToast("err", error.message); return; }
fs.writeFileSync(entrada, JSON.stringify({perfil: perfil, timeline: scannerTimeline}, null, 2), "utf-8");
var opcoes = {cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code", stdio: ["ignore", "pipe", "pipe"]};
var hf = hfSpawnOptions(); if (hf && hf.env) opcoes.env = hf.env;
var opcoes = {cwd: "/Volumes/Merongo/SISTEMAS/GENIAL SISTEMAS/Jhonny/code", stdio: ["ignore", "pipe", "pipe"], env: Object.assign({}, process.env, { PYTHONIOENCODING: "utf-8" })};
var hf = hfSpawnOptions(); if (hf && hf.env) opcoes.env = Object.assign({}, opcoes.env, hf.env);
var processo = null;
taskStart("Complementando a análise do Scanner", acao === "diarizacao" ? "Detectando locutores" : "Calculando métricas de voz", null, function () {
if (processo) processo.kill("SIGTERM");
});
processo = childProcess.spawn(SCANNER_PYTHON_BIN, [SCANNER_ENGINE_SCRIPT, entrada, scannerRelatorioExistente, "--complemento", acao], opcoes);
var erro = "";
processo.stderr.on("data", function (bloco) { erro += bloco.toString(); });
processo.stdout.on("data", function (bloco) { bloco.toString().split("\n").forEach(function (linha) { try { var evento = JSON.parse(linha); if (evento.evento === "progresso") taskUpdate({stage: evento.etapa, detail: evento.clipe || "", pct: evento.percentual}); } catch (_) {} }); });
processo.stderr.on("data", function (bloco) { erro += bloco.toString("utf-8"); });
processo.stdout.on("data", function (bloco) { bloco.toString("utf-8").split("\n").forEach(function (linha) { try { var evento = JSON.parse(linha); if (evento.evento === "progresso") taskUpdate({stage: evento.etapa, detail: evento.clipe || "", pct: evento.percentual}); } catch (_) {} }); });
processo.on("close", function (codigo) { processo = null; setBusy(botao.id, false); if (taskState.canceled) { taskEnd(false, "Complemento cancelado"); return; } if (codigo !== 0) { taskEnd(false, "Falha ao processar o complemento.", erro || "Não foi possível processar este complemento."); showToast("err", erro || "Não foi possível processar este complemento."); return; } scannerAtualizarComplementos(); document.getElementById("scannerReportPath").textContent = scannerRelatorioExistente; document.getElementById("scannerReportCard").hidden = false; taskEnd(true, "Complemento concluído"); showToast("ok", acao === "diarizacao" ? "Locutores processados sem refazer a transcrição." : "Métricas da fala processadas sem refazer a transcrição."); });
}
@@ -2844,7 +2844,10 @@ var PROGRESS_PREFIX = "@@PROGRESS ";
function runStreamed(bin, args, onLine, onDone, options) {
var childProcess = nodeRequire("child_process");
var child = childProcess.spawn(bin, args, options || {});
var baseEnv = Object.assign({}, process.env || {}, { PYTHONIOENCODING: "utf-8" });
var finalEnv = Object.assign(baseEnv, options && options.env || {});
var mergedOptions = Object.assign({}, options || {}, { env: finalEnv });
var child = childProcess.spawn(bin, args, mergedOptions);
var buffer = "";
var ultimoErro = "";
var ultimaSaida = "";
@@ -2868,8 +2871,8 @@ function runStreamed(bin, args, onLine, onDone, options) {
if (parts[i].trim()) handleLine(parts[i]);
}
}
child.stdout.on("data", function (d) { ultimaSaida += d.toString(); flushLines(d.toString()); });
child.stderr.on("data", function (d) { ultimoErro = d.toString().trim() || ultimoErro; flushLines(d.toString()); });
child.stdout.on("data", function (d) { ultimaSaida += d.toString("utf-8"); flushLines(d.toString("utf-8")); });
child.stderr.on("data", function (d) { ultimoErro = d.toString("utf-8").trim() || ultimoErro; flushLines(d.toString("utf-8")); });
child.on("error", function (err) { onDone(1, "spawn error: " + err.message); });
child.on("close", function (code) {
if (buffer.trim()) handleLine(buffer);