{"record":{"id":"083f0b7f6983f810","repo":"tonhowtf/omniget","slug":"audio-clean","errorCode":null,"errorMessage":"{}","messagePattern":"\\{\\}","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/audio_clean.rs","lineNumber":254,"sourceCode":"    if has_video {\n        // O vídeo não é tocado: só a trilha de áudio é reescrita.\n        cmd.args([\"-c:v\", \"copy\", \"-map\", \"0\"]);\n    } else {\n        cmd.args([\"-vn\"]);\n    }\n    match ext.as_str() {\n        \"wav\" => cmd.args([\"-c:a\", \"pcm_s16le\"]),\n        \"flac\" => cmd.args([\"-c:a\", \"flac\"]),\n        \"mp3\" => cmd.args([\"-c:a\", \"libmp3lame\", \"-b:a\", \"192k\"]),\n        _ => cmd.args([\"-c:a\", \"aac\", \"-b:a\", \"192k\"]),\n    };\n    let out = cmd\n        .arg(&output)\n        .output()\n        .await\n        .map_err(|e| anyhow!(\"ffmpeg nao iniciou: {}\", e))?;\n    if !out.status.success() {\n        return Err(anyhow!(\"{}\", String::from_utf8_lossy(&out.stderr).trim()));\n    }\n\n    Ok(CleanItem {\n        input: input.to_string(),\n        output: Some(output.to_string_lossy().to_string()),\n        gain_db: measured.map(|m| target_i - m.input_i).unwrap_or(0.0),\n        measured,\n        target_i,\n        filter,\n        ok: true,\n        error: None,\n    })\n}\n\npub async fn run(opts: CleanOptions, progress: super::ProgressFn) -> anyhow::Result<CleanResult> {\n    let ffmpeg = crate::core::dependencies::ensure_ffmpeg().await?;\n    let total = opts.inputs.len() as u64;\n    let mut items = Vec::new();","sourceCodeStart":236,"sourceCodeEnd":272,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/audio_clean.rs#L236-L272","documentation":"When the final ffmpeg pass spawns but exits with a non-zero status, clean_one surfaces ffmpeg's trimmed stderr verbatim via anyhow!(\"{}\"). The message content is whatever ffmpeg printed — codec errors, bad filter graphs, unwritable output path, etc.","triggerScenarios":"run -> clean_one where the ffmpeg encode command exits non-zero: invalid filter combination, unsupported output codec/container, output file not writable, input decode errors, or disk full.","commonSituations":"aac encoder unavailable in the ffmpeg build; output directory without write permission; filename/container mismatch (e.g. .mp3 extension with aac codec); filter chain producing invalid audio parameters.","solutions":["Read the embedded stderr in the error to see ffmpeg's actual complaint","Confirm the ffmpeg build includes the required encoders (`ffmpeg -encoders | grep aac`)","Check the output path is writable and the extension matches the chosen codec","Test the filter chain manually: `ffmpeg -i in -af <filter> -c:a aac -b:a 192k out.m4a`"],"exampleFix":"// before\nif !out.status.success() {\n    return Err(anyhow!(\"{}\", String::from_utf8_lossy(&out.stderr).trim()));\n}\n// after\nif !out.status.success() {\n    let stderr = String::from_utf8_lossy(&out.stderr).trim().to_string();\n    anyhow::bail!(\"ffmpeg conversion failed for '{}' -> '{}' (exit {}): {}\",\n        input, output.display(), out.status, stderr);\n}","handlingStrategy":"try-catch","validationCode":"// Pre-check output writability and encoder availability\nanyhow::ensure!(\n    out_dir_writable(&output_dir)?,\n    \"output directory not writable: {}\",\n    output_dir.display()\n);","typeGuard":null,"tryCatchPattern":"if let Err(e) = clean_one(&ffmpeg, &opts, &input).await {\n    let msg = e.to_string();\n    if msg.contains(\"Unknown encoder\") { /* install ffmpeg with aac */ }\n    else if msg.contains(\"Permission denied\") { /* fix output path perms */ }\n    // always log the ffmpeg stderr embedded in msg\n    return Err(e);\n}","preventionTips":["Verify required encoders exist in the ffmpeg build (`ffmpeg -encoders`)","Match output file extension to the selected audio codec","Ensure output directories exist and are writable before encoding","Capture full ffmpeg stderr for batch job reports"],"tags":["ffmpeg","process-exit","audio","stderr","rust"],"backgroundTag":"api-error-response","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}