feat: adiciona funcionalidade de cancelamento de geração de faixas de áudio e atualiza o painel de execução
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user