feat: adiciona funcionalidade de cancelamento de geração de faixas de áudio e atualiza o painel de execução

This commit is contained in:
2026-02-28 14:57:11 -03:00
parent 02c6d8ede2
commit 4dec1ef8ed
4 changed files with 83 additions and 33 deletions
+21 -10
View File
@@ -5,7 +5,12 @@ use tokio::process::Command;
/// Executa o FFmpeg de forma assíncrona, capturando stderr em tempo real.
/// As linhas de saída são enviadas pelo canal `progress_tx` (std::sync::mpsc).
pub async fn run_ffmpeg_async(args: Vec<String>, progress_tx: Sender<String>) -> Result<()> {
/// Um sinal enviado em `cancel_rx` encerra o processo imediatamente.
pub async fn run_ffmpeg_async(
args: Vec<String>,
progress_tx: Sender<String>,
cancel_rx: tokio::sync::oneshot::Receiver<()>,
) -> Result<()> {
let mut child = Command::new("ffmpeg")
.args(&args)
.stderr(std::process::Stdio::piped())
@@ -25,16 +30,22 @@ pub async fn run_ffmpeg_async(args: Vec<String>, progress_tx: Sender<String>) ->
});
}
let status = child.wait().await.context("Erro ao aguardar ffmpeg")?;
if !status.success() {
return Err(anyhow!(
"FFmpeg encerrou com código de saída: {:?}",
status.code()
));
tokio::select! {
result = child.wait() => {
let status = result.context("Erro ao aguardar ffmpeg")?;
if !status.success() {
return Err(anyhow!(
"FFmpeg encerrou com código de saída: {:?}",
status.code()
));
}
Ok(())
}
_ = cancel_rx => {
let _ = child.kill().await;
Err(anyhow!("Cancelado pelo usuário"))
}
}
Ok(())
}
/// Verifica se um binário está disponível no PATH.