{"record":{"id":"10cbb21472f4baba","repo":"tonhowtf/omniget","slug":"o-envio-p-blico-e-vale-para-todo-mundo-confirme-antes","errorCode":null,"errorMessage":"o envio é público e vale para todo mundo: confirme antes","messagePattern":"o envio é público e vale para todo mundo: confirme antes","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/sponsorblock.rs","lineNumber":340,"sourceCode":"pub fn submit_error(status: u16, body: &str) -> String {\n    let corpo = body.trim();\n    let curto = if corpo.len() > 200 {\n        &corpo[..200]\n    } else {\n        corpo\n    };\n    match status {\n        400 => format!(\"o SponsorBlock recusou o envio: {}\", curto),\n        403 => format!(\"envio bloqueado pelo SponsorBlock: {}\", curto),\n        409 => \"esse trecho já tinha sido enviado\".to_string(),\n        429 => \"muitos envios seguidos; espere alguns minutos e tente de novo\".to_string(),\n        _ => format!(\"SponsorBlock: HTTP {} {}\", status, curto),\n    }\n}\n\npub async fn submit(opts: SubmitOptions) -> anyhow::Result<SubmitResult> {\n    if !opts.confirmed {\n        return Err(anyhow!(\n            \"o envio é público e vale para todo mundo: confirme antes\"\n        ));\n    }\n    let id = video_id(&opts.url)\n        .ok_or_else(|| anyhow!(\"nao reconheci um video do YouTube em: {}\", opts.url))?;\n    let user = local_user_id()?;\n    let body = build_payload(&id, &user, opts.video_duration, &opts.segments)?;\n\n    let client = super::client()?;\n    let resp = client\n        .post(format!(\"{}/api/skipSegments\", SERVER))\n        .json(&body)\n        .send()\n        .await?;\n    let status = resp.status().as_u16();\n    let text = resp.text().await.unwrap_or_default();\n    if !(200..300).contains(&status) {\n        return Err(anyhow!(\"{}\", submit_error(status, &text)));","sourceCodeStart":322,"sourceCodeEnd":358,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/sponsorblock.rs#L322-L358","documentation":"submit refuses to run unless SubmitOptions.confirmed is true. SponsorBlock submissions are public and affect every viewer of the video, so the library makes an explicit confirmation flag a hard gate rather than an implicit default.","triggerScenarios":"Calling submit with SubmitOptions { confirmed: false, .. } — i.e. any programmatic submission that did not go through a user confirmation step.","commonSituations":"Testing the submit function with a default-constructed options struct; forgetting to wire the UI confirmation dialog's result into the confirmed field; batch scripts submitting without any user interaction.","solutions":["Set confirmed: true only after the user explicitly approves the submission in the UI.","Show a confirmation dialog before calling submit and pass its result through.","If the error appears despite user confirmation, check you are constructing SubmitOptions with the field set (not relying on a Default).","In automated tests, construct SubmitOptions with confirmed: true explicitly."],"exampleFix":"// before\nsubmit(SubmitOptions { url, segments, ..Default::default() }).await?; // confirmed: false\n// after\nif confirm_dialog(\"Publicar no SponsorBlock?\")? {\n    submit(SubmitOptions { url, segments, confirmed: true, .. }).await?;\n}","handlingStrategy":"try-catch","validationCode":"if !opts.confirmed {\n    return Err(anyhow!(\"confirme o envio antes de chamar submit\"));\n}","typeGuard":null,"tryCatchPattern":"match submit(opts).await {\n    Err(e) if e.to_string().contains(\"confirme antes\") => show_confirmation_dialog_then_retry(),\n    other => other?,\n}","preventionTips":["Always route submissions through a UI confirmation that sets confirmed: true.","Never use SubmitOptions::default() in production submission paths.","Make the confirmation explicit in code reviews of submission flows."],"tags":["sponsorblock","confirmation","rust","safety-gate"],"backgroundTag":"authentication-required","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"}