tonhowtf/omniget · error

informe o blog

Error message

informe o blog

What it means

The Tumblr backup tool derives the blog URL from the options before starting. If the blog field is empty the URL is empty and there is nothing to back up, so it bails with this short validation message.

Solutions

  1. Set the `blog` field in Options to the target Tumblr blog name or URL
  2. Validate the blog value before calling run (trim and check non-empty)
  3. Check the CLI/config binding so the blog name actually reaches Options

Example fix

// before
let opts = Options { blog: String::new(), .. }; // empty
// after
let opts = Options { blog: "myblog".into(), .. };
Defensive patterns

Strategy: validation

Validate before calling

if opts.blog.trim().is_empty() {
    return Err(anyhow!("blog é obrigatório"));
}

Type guard

fn blog_is_set(opts: &backup::Options) -> bool {
    !opts.blog.trim().is_empty()
}

Try / catch

match backup::run(&opts, progress).await {
    Err(e) if e.to_string() == "informe o blog" => eprintln!("configure o campo blog"),
    Err(e) => return Err(e),
    Ok(r) => use(r),
}

Prevention

When it happens

Trigger: Calling backup `run` with Options whose `blog` field is empty or whitespace, causing blog_url() to return an empty string.

Common situations: Forgot to set the blog name in config or CLI; env var/flag not wired into Options; default-constructed Options passed directly to run.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12). Data as JSON: /api/errors/c088e112c9306f34. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/omniget-core/src/core/tools/tumblr/backup.rs:515

fn media_map(posts: &[Post], index: &LocalIndex, root: &Path) -> HashMap<String, String> {
    let mut map = HashMap::new();
    if index.is_empty() {
        return map;
    }
    for post in posts {
        for url in &post.media {
            if let Some(local) = index.file_for_url(url) {
                map.insert(url.clone(), rel_to_root(root, &local));
            }
        }
    }
    map
}

pub async fn run(opts: &Options, progress: &super::super::ProgressFn) -> Result<BackupResult> {
    let url = blog_url(&opts.blog);
    if url.is_empty() {
        anyhow::bail!("informe o blog");
    }
    let cookies = match opts.session_netscape.as_deref() {
        Some(s) => gdl::write_cookies(s, &["tumblr.com"])?,
        None => None,
    };
    let used_session = cookies.is_some();
    let cookie_path = cookies.as_ref().map(|c| c.path.clone());

    let extra = vec![
        "-o".to_string(),
        "extractor.tumblr.posts=all".to_string(),
        "-o".to_string(),
        "extractor.tumblr.reblogs=true".to_string(),
        "-o".to_string(),
        "extractor.tumblr.original=true".to_string(),
    ];

    super::super::report(progress, TOOL_ID, "started", 0, None, Some(url.clone()));

View on GitHub (pinned to 8600b91f42)