{"record":{"id":"f995af8aaecd9fe0","repo":"tonhowtf/omniget","slug":"paleta","errorCode":null,"errorMessage":"paleta: {}","messagePattern":"paleta: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/video_gif.rs","lineNumber":173,"sourceCode":"            .args([\"-y\", \"-hide_banner\", \"-loglevel\", \"error\"])\n            .args(&cut)\n            .arg(\"-i\")\n            .arg(inp)\n            .args([\n                \"-vf\",\n                &format!(\n                    \"{},palettegen=max_colors={}:stats_mode=diff\",\n                    chain,\n                    opts.max_colors.clamp(4, 256)\n                ),\n            ])\n            .arg(&tmp)\n            .output()\n            .await\n            .map_err(|e| anyhow!(\"ffmpeg nao iniciou: {}\", e))?;\n        if !pass1.status.success() {\n            let _ = std::fs::remove_file(&tmp);\n            return Err(anyhow!(\n                \"paleta: {}\",\n                String::from_utf8_lossy(&pass1.stderr).trim()\n            ));\n        }\n        let pass2 = crate::core::process::command(ffmpeg)\n            .args([\"-y\", \"-hide_banner\", \"-loglevel\", \"error\"])\n            .args(&cut)\n            .arg(\"-i\")\n            .arg(inp)\n            .arg(\"-i\")\n            .arg(&tmp)\n            .args([\n                \"-lavfi\",\n                &format!(\n                    \"{}[x];[x][1:v]paletteuse={}\",\n                    chain,\n                    dither_arg(&opts.dither)\n                ),","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/video_gif.rs#L155-L191","documentation":"Raised after the first ffmpeg pass (palettegen with stats_mode=diff and clamped max_colors) exits with a non-zero status; the {} is ffmpeg's stderr tail. The temporary palette file is removed before the error propagates, aborting the two-pass GIF conversion in convert_one.","triggerScenarios":"Pass 1 (`palettegen` with max_colors clamped 4-256) returns non-zero: input can't be decoded, the -vf palettegen arguments are rejected by the installed ffmpeg version, or the temp output PNG path is unwritable.","commonSituations":"Very old ffmpeg without palettegen filter (added in ffmpeg 2.x, but some minimal builds strip filters); corrupt input video; TMPDIR pointing to a read-only location; max_colors producing an invalid filter string.","solutions":["Read the stderr after 'paleta:' for ffmpeg's concrete failure.","Check ffmpeg supports palettegen: `<ffmpeg> -filters | grep palettegen`; upgrade ffmpeg if missing.","Verify TMPDIR/temp_dir is writable so the palette PNG can be written.","Validate the input decodes (`ffprobe <input>`); repair or re-download corrupt media."],"exampleFix":"// before\nreturn Err(anyhow!(\"paleta: {}\", String::from_utf8_lossy(&pass1.stderr).trim()));\n// after\nlet stderr = String::from_utf8_lossy(&pass1.stderr).trim().to_string();\nif stderr.contains(\"No such filter\") {\n    anyhow::bail!(\"ffmpeg build lacks palettegen; install a full ffmpeg build\");\n}\nanyhow::bail!(\"paleta: {}\", stderr);","handlingStrategy":"try-catch","validationCode":"let out = crate::core::process::command(ffmpeg)\n    .args([\"-hide_banner\", \"-filters\"])\n    .output().await?;\nanyhow::ensure!(String::from_utf8_lossy(&out.stdout).contains(\"palettegen\"), \"ffmpeg sem filtro palettegen\");","typeGuard":null,"tryCatchPattern":"match convert_one(...).await {\n    Err(e) if e.to_string().starts_with(\"paleta:\") => {\n        log::error!(\"palettegen falhou: {e}\"); // fallback: convert without palette\n    }\n    r => r,\n}","preventionTips":["Require a modern full ffmpeg build that includes palettegen/paletteuse.","Check filter availability at startup, not at conversion time.","Validate input decodes before running the two-pass pipeline."],"tags":["ffmpeg","nonzero-exit","palettegen","rust"],"backgroundTag":"http-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"}