tonhowtf/omniget · error

frame da animacao fora do intervalo

Error message

frame da animacao fora do intervalo

What it means

During create, the animation frame index derived from the verification key (vk modulo 16) is used to pick a row from the parsed SVG animation frames. If the computed frame index has no corresponding row, it throws "frame da animacao fora do intervalo". This indicates the verification key and the animation SVG are inconsistent (usually a scrape of mismatched assets).

Solutions

  1. Re-fetch the verification key and the animation SVG from the same page/response so they are consistent.
  2. Log frame_idx and rows.len() to confirm the mismatch; if rows.len() < 16 the SVG parse is incomplete.
  3. Check whether X reduced the number of animation frames and clamp/derive the index against rows.len().
  4. Clear any cached vk bytes and retry with a fresh scrape.

Example fix

// before
let row = rows.get(frame_idx).ok_or_else(|| anyhow::anyhow!("frame da animacao fora do intervalo"))?;
// after
if rows.len() != 16 {
    return Err(anyhow::anyhow!("animacao com {} frames (esperado 16) — refazer scrape", rows.len()));
}
let row = rows.get(frame_idx).ok_or_else(|| anyhow::anyhow!("frame da animacao fora do intervalo"))?;
Defensive patterns

Strategy: validation

Validate before calling

// antes de derivar o frame
if rows.len() != 16 {
    return Err(anyhow!("SVG da animação incompleto: {} rows", rows.len()));
}
let frame_idx = (vk.get(idx[0]).copied().unwrap_or(0) % 16) as usize;
if frame_idx >= rows.len() {
    return Err(anyhow!("vk e SVG de fontes diferentes — refazer scrape"));
}

Try / catch

match create(...).await {
    Ok(v) => v,
    Err(e) if e.to_string().contains("fora do intervalo") => {
        eprintln!("vk/SVG inconsistentes; limpando cache e refazendo scrape");
        invalidate_cache();
        retry().await
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling create when vk[idx[0]] % 16 yields an index >= rows.len() — i.e. the verification key bytes came from a different page/version than the loading-x-anim SVG frames, or the SVG parsed to fewer than 16 rows.

Common situations: Caching the verification key from one request and the SVG from another; X changing the number of animation frames; partial HTML fetch truncating the SVG so fewer rows parse.

Related errors


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

Appendix: source

Thrown at src-tauri/omniget-core/src/core/tools/x/txid.rs:349

}

impl TxIdGen {
    /// Precisa da sessao logada: o X so entrega a pagina com os indices para
    /// quem esta autenticado.
    pub async fn create(http: &reqwest::Client, cookie: Option<&str>) -> anyhow::Result<Self> {
        let html = page_text(http, "https://x.com/tesla", cookie).await?;
        let vk = verification_bytes(&html)?;
        let rows = anim_frames(&html, &vk)?;
        let idx = indices(http, &html, cookie).await?;
        let mut frame_time: i64 = 1;
        for i in idx.iter().skip(1) {
            frame_time *= (vk.get(*i).copied().unwrap_or(0) % 16) as i64;
        }
        let frame_time = ((frame_time as f64 / 10.0 + 0.5).floor() * 10.0) as i64;
        let frame_idx = (vk.get(idx[0]).copied().unwrap_or(0) % 16) as usize;
        let row = rows
            .get(frame_idx)
            .ok_or_else(|| anyhow::anyhow!("frame da animacao fora do intervalo"))?;
        if row.len() < 11 {
            anyhow::bail!("frame da animacao incompleto");
        }
        let anim_key = calc_anim_key(row, frame_time as f64 / 4096.0);
        Ok(Self {
            vk_bytes: vk,
            anim_key,
        })
    }

    pub fn calc(&self, method: &str, path: &str) -> String {
        let now_ms = chrono::Utc::now().timestamp_millis();
        let ts = ((now_ms - 1_682_924_400_000) as f64 / 1000.0).floor() as i64;
        let ts_bytes: Vec<u8> = (0..4).map(|i| ((ts >> (i * 8)) & 0xff) as u8).collect();
        let payload = format!(
            "{}!{}!{}obfiowerehiring{}",
            method.to_uppercase(),
            path,

View on GitHub (pinned to 8600b91f42)