{"record":{"id":"097751a8bc38bf28","repo":"tonhowtf/omniget","slug":"ja-esta-gravando-screen-record","errorCode":null,"errorMessage":"ja esta gravando","messagePattern":"ja esta gravando","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/screen_record.rs","lineNumber":334,"sourceCode":"            \"-segment_time\".into(),\n            \"5\".into(),\n            \"-segment_wrap\".into(),\n            wrap,\n            \"-reset_timestamps\".into(),\n            \"1\".into(),\n            \"-segment_format_options\".into(),\n            \"movflags=+faststart\".into(),\n        ]);\n        a.push(target.join(\"seg-%03d.mp4\").to_string_lossy().to_string());\n    } else {\n        a.push(target.to_string_lossy().to_string());\n    }\n    a\n}\n\npub async fn start(opts: RecordOptions) -> anyhow::Result<RecordState> {\n    if SESSION.lock().unwrap_or_else(|e| e.into_inner()).is_some() {\n        return Err(anyhow!(\"ja esta gravando\"));\n    }\n    if cfg!(target_os = \"linux\")\n        && std::env::var(\"WAYLAND_DISPLAY\").is_ok()\n        && std::env::var(\"DISPLAY\").is_err()\n    {\n        return Err(anyhow!(\"sessao Wayland sem XWayland: o x11grab nao enxerga a tela. Use a captura do OmniDisc (PipeWire) ou entre numa sessao X11.\"));\n    }\n    let ffmpeg = crate::core::dependencies::ensure_ffmpeg().await?;\n    let dir = if opts.output_dir.trim().is_empty() {\n        videos_dir()\n    } else {\n        PathBuf::from(opts.output_dir.trim())\n    };\n    std::fs::create_dir_all(&dir)?;\n    let ring = opts.replay_seconds > 0;\n    let (target, ring_dir, output) = if ring {\n        let r = super::temp_dir().join(format!(\"replay-{}\", uuid::Uuid::new_v4()));\n        std::fs::create_dir_all(&r)?;","sourceCodeStart":316,"sourceCodeEnd":352,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/screen_record.rs#L316-L352","documentation":"screen_record::start() keeps the active recording in a global SESSION mutex. If a session is already present, starting another one raises this error ('already recording') — the tool supports only one screen recording at a time per process.","triggerScenarios":"Calling start() twice without an intervening stop(); a previous session that was never stopped because its process is long-lived; calling start from two concurrent invocations.","commonSituations":"A UI button double-click launching two recordings; a crash of the calling layer leaving the session registered; an automation script that starts recording each run but only stops on success paths.","solutions":["Call stop() before start() if a session may be active","Check the current state via state() / the SESSION-based accessor before starting","Fix callers that leak sessions on error paths — ensure stop() runs in a cleanup/finalizer","If a stale session is certain (dead ffmpeg child), stop it first to release the slot"],"exampleFix":"// before\nstart(opts).await?; // may fail if already recording\n// after\nif state().recording { stop().await?; }\nstart(opts).await?;","handlingStrategy":"validation","validationCode":"if screen_record::state().recording {\n    return Err(anyhow!(\"a recording is already active\"));\n}","typeGuard":null,"tryCatchPattern":"match screen_record::start(opts).await {\n    Ok(s) => Ok(s),\n    Err(e) if e.to_string().contains(\"ja esta gravando\") => {\n        // stop the previous session, then retry once\n        screen_record::stop().await?;\n        screen_record::start(opts).await\n    }\n    Err(e) => Err(e),\n}","preventionTips":["Check recording state before every start()","Pair every start() with a stop() in a cleanup path (drop guard / finally)","Serialize start/stop behind a single UI control or lock"],"tags":["screen-recording","state","concurrency"],"backgroundTag":"invalid-state-transition","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"}