diff --git a/src/adapters/ffmpeg/command_builder.rs b/src/adapters/ffmpeg/command_builder.rs index 9410e3d..48e252f 100644 --- a/src/adapters/ffmpeg/command_builder.rs +++ b/src/adapters/ffmpeg/command_builder.rs @@ -14,6 +14,10 @@ impl FfmpegCommandBuilder { pub fn build(project: &Project) -> Vec { let mut args: Vec = Vec::new(); + // Sobrescreve o arquivo de saída sem prompt interativo. + // Sem isso o FFmpeg aguarda [y/N] no stdin e o processo trava. + args.push("-y".to_string()); + // ── Inputs ────────────────────────────────────────────────────────────── // Input 0: arquivo fonte (sempre sem itsoffset próprio) args.push("-i".to_string()); diff --git a/src/infrastructure/process/mod.rs b/src/infrastructure/process/mod.rs index d0ef543..e0d2846 100644 --- a/src/infrastructure/process/mod.rs +++ b/src/infrastructure/process/mod.rs @@ -13,6 +13,7 @@ pub async fn run_ffmpeg_async( ) -> Result<()> { let mut child = Command::new("ffmpeg") .args(&args) + .stdin(std::process::Stdio::null()) .stderr(std::process::Stdio::piped()) .stdout(std::process::Stdio::null()) .spawn() diff --git a/src/ui/components/batch_panel.rs b/src/ui/components/batch_panel.rs index 77d43f6..9dc8f2f 100644 --- a/src/ui/components/batch_panel.rs +++ b/src/ui/components/batch_panel.rs @@ -187,11 +187,11 @@ impl BatchPanel { let (icon, color) = match &item.state { ExecutionState::Idle => ("⏳", egui::Color32::GRAY), ExecutionState::Running => ("⟳", egui::Color32::YELLOW), - ExecutionState::Success => ("✓", egui::Color32::GREEN), + ExecutionState::Success => ("✔", egui::Color32::GREEN), ExecutionState::Cancelled => { ("⊘", egui::Color32::from_rgb(255, 200, 0)) } - ExecutionState::Error(_) => ("✗", egui::Color32::RED), + ExecutionState::Error(_) => ("✘", egui::Color32::RED), }; ui.colored_label(color, icon); ui.label(format!("#{} — {} >> {}", idx + 1, source_name, output_name)); @@ -300,7 +300,7 @@ impl BatchPanel { events.push(BatchPanelEvent::ProcessAll); } } else if all_finished && !items.is_empty() { - ui.colored_label(egui::Color32::GREEN, "✓ Lote concluído."); + ui.colored_label(egui::Color32::GREEN, "✔ Lote concluído."); } }); } @@ -483,9 +483,9 @@ impl BatchPanel { let can_add = self.form_video.is_some() && self.form_output.is_some(); let confirm_label = if is_edit { - "Salvar alterações ✓" + "Salvar alterações" } else { - "Adicionar ✓" + "Adicionar ao carrinho" }; if ui diff --git a/src/ui/components/execution_panel.rs b/src/ui/components/execution_panel.rs index 40f8d3f..af1dc06 100644 --- a/src/ui/components/execution_panel.rs +++ b/src/ui/components/execution_panel.rs @@ -76,13 +76,13 @@ impl ExecutionPanel { ui.label("Processando..."); } ExecutionState::Success => { - ui.colored_label(egui::Color32::GREEN, "✓ Arquivo gerado com sucesso!"); + ui.colored_label(egui::Color32::GREEN, "✔ Arquivo gerado com sucesso!"); } ExecutionState::Cancelled => { ui.colored_label(egui::Color32::YELLOW, "⊘ Geração cancelada pelo usuário."); } ExecutionState::Error(msg) => { - ui.colored_label(egui::Color32::RED, "✗ Erro durante o processamento:"); + ui.colored_label(egui::Color32::RED, "✘ Erro durante o processamento:"); ui.add( egui::TextEdit::multiline(&mut msg.as_str()) .desired_rows(4)