diff --git a/.jhonny/analises.db b/.jhonny/analises.db index f165844..4b46ebf 100644 Binary files a/.jhonny/analises.db and b/.jhonny/analises.db differ diff --git a/code/cep-plugin/main.js b/code/cep-plugin/main.js index c74ea3d..3fa1874 100755 --- a/code/cep-plugin/main.js +++ b/code/cep-plugin/main.js @@ -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); diff --git a/code/engine/aplicar_plano_de_edicao.py b/code/engine/aplicar_plano_de_edicao.py index 6427369..d3d4b17 100644 --- a/code/engine/aplicar_plano_de_edicao.py +++ b/code/engine/aplicar_plano_de_edicao.py @@ -258,6 +258,7 @@ def executar( def main() -> None: """Ponto de entrada da linha de comando.""" + sys.stdout.reconfigure(encoding="utf-8") argumentos = argparse.ArgumentParser() argumentos.add_argument("plano", type=Path) argumentos.add_argument("--plano-id", type=int)