{"record":{"id":"d3b58ada676f95fb","repo":"tonhowtf/omniget","slug":"n-o-consegui-medir-a-dura-o-do-v-deo","errorCode":null,"errorMessage":"não consegui medir a duração do vídeo","messagePattern":"não consegui medir a duração do vídeo","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/yt_chapters.rs","lineNumber":444,"sourceCode":"            \"-\",\n        ])\n        .output()\n        .await\n        .map_err(|e| anyhow!(\"o ffmpeg não iniciou: {}\", e))?;\n    Ok(parse_scene_times(&String::from_utf8_lossy(&out.stderr)))\n}\n\npub async fn run(opts: Options, progress: super::ProgressFn) -> anyhow::Result<ChaptersResult> {\n    let input = PathBuf::from(opts.input.trim());\n    if !input.exists() {\n        return Err(anyhow!(\"arquivo não encontrado: {}\", opts.input));\n    }\n    let ffmpeg = crate::core::dependencies::ensure_ffmpeg().await?;\n    super::report(&progress, ID, \"progress\", 0, Some(3), None);\n    let probe = crate::core::ffmpeg::probe(&input).await?;\n    let total = probe.duration_seconds;\n    if total <= 0.0 {\n        return Err(anyhow!(\"não consegui medir a duração do vídeo\"));\n    }\n\n    let mut cues: Vec<Cue> = Vec::new();\n    if !opts.subtitle_path.trim().is_empty() {\n        if let Ok(text) = std::fs::read_to_string(opts.subtitle_path.trim()) {\n            cues = super::subtitle::parse(&text).unwrap_or_default();\n            cues = super::yt_notes::dedup_cues(&cues);\n        }\n    }\n    let titled = !cues.is_empty();\n\n    let silences = if opts.use_silence {\n        super::report(&progress, ID, \"progress\", 1, Some(3), None);\n        detect_silence(&ffmpeg, &input, opts.silence_db, opts.min_silence, total).await?\n    } else {\n        Vec::new()\n    };\n    let scenes = if opts.use_scene && probe.streams.iter().any(|s| s.codec_type == \"video\") {","sourceCodeStart":426,"sourceCodeEnd":462,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/yt_chapters.rs#L426-L462","documentation":"ffmpeg's probe of the input succeeded (or at least ran) but reported a duration of zero or negative, so the tool cannot compute chapter timestamps. This guards against dividing/mapping chapter marks onto an unknown timeline.","triggerScenarios":"`crate::core::ffmpeg::probe(&input)` returns a probe whose `duration_seconds <= 0.0` — corrupt file, unsupported container, or a probe output missing the duration field.","commonSituations":"Truncated or zero-byte video file; exotic container ffmpeg can't parse; stream without duration metadata (live recording, raw stream); broken ffmpeg/ffprobe install.","solutions":["Verify the file plays in a media player and reports a duration","Re-download or re-mux the file (e.g. `ffmpeg -i in -c copy out`) to restore duration metadata","Update ffmpeg/ffprobe to a version that parses the container","Check that ffprobe (not only ffmpeg) is available, since probe depends on it"],"exampleFix":"// before\nrun(opts, progress).await?;\n// after\nlet probe = crate::core::ffmpeg::probe(Path::new(&opts.input)).await?;\nif probe.duration_seconds <= 0.0 {\n    anyhow::bail!(\"input has no measurable duration; re-encode or re-download\");\n}\nrun(opts, progress).await?;","handlingStrategy":"validation","validationCode":"let probe = crate::core::ffmpeg::probe(&input).await?;\nif probe.duration_seconds <= 0.0 { anyhow::bail!(\"vídeo sem duração utilizável\"); }","typeGuard":null,"tryCatchPattern":"match run(opts, progress).await {\n    Err(e) if e.to_string().contains(\"não consegui medir a duração\") => {\n        eprintln!(\"reencode/rebaixe o arquivo; ffprobe não lê a duração\");\n    }\n    other => other?,\n}","preventionTips":["Verify files play and report duration before processing","Keep ffprobe installed alongside ffmpeg","Re-mux truncated downloads"],"tags":["rust","ffmpeg","metadata","duration"],"backgroundTag":"invalid-argument-value","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}