tonhowtf/omniget · error

Livestreams not supported

Error message

Livestreams not supported

What it means

Thrown by YouTubeDownloader::parse_video_info when the yt-dlp JSON reports is_live=true. Live streams cannot be downloaded by this downloader, so the operation is explicitly rejected rather than attempted.

Solutions

  1. Wait until the stream has ended and the VOD is published, then retry.
  2. Check the URL points to a normal video, not a live stream, before calling download.
  3. Pre-check metadata (e.g. yt-dlp --dump-json and inspect is_live) in the UI and disable download for live content.
  4. If live recording is genuinely needed, use a dedicated tool (e.g. streamlink) outside this library.

Example fix

// before
if is_live {
    return Err(anyhow!("Livestreams not supported"));
}
// after: give the user actionable context
if is_live {
    return Err(anyhow!("Livestreams not supported: '{}' is currently live. Retry after the stream ends.", title));
}
Defensive patterns

Strategy: validation

Validate before calling

let json = ytdlp::get_video_info(&ytdlp_path, url, &[]).await?;
if json.get("is_live").and_then(|v| v.as_bool()).unwrap_or(false) {
    eprintln!("{} is a live stream — download will be rejected; retry after it ends", url);
}

Type guard

fn is_live_stream(info: &serde_json::Value) -> bool {
    info.get("is_live").and_then(|v| v.as_bool()).unwrap_or(false)
}

Try / catch

match downloader.get_media_info(url).await {
    Err(e) if e.to_string().contains("Livestreams not supported") => {
        // inform user to retry after the stream ends, or use streamlink for live capture
        show_live_unsupported_notice();
    }
    other => other,
}

Prevention

When it happens

Trigger: Calling get_media_info/download on a YouTube URL pointing to an active live stream (or an upcoming/premiere in live state) whose yt-dlp metadata has is_live set to true.

Common situations: Users pasting youtube.com/live/... or /watch?v=... links while a stream is ongoing; scheduled premieres still marked live; users expecting VOD download before the stream has ended.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

Thrown at src-tauri/src/platforms/youtube/mod.rs:162

            .or_else(|| json.get("channel"))
            .and_then(|v| v.as_str())
            .unwrap_or("unknown")
            .to_string();

        let duration = json.get("duration").and_then(|v| v.as_f64());

        let thumbnail = json
            .get("thumbnail")
            .and_then(|v| v.as_str())
            .map(|s| s.to_string());

        let is_live = json
            .get("is_live")
            .and_then(|v| v.as_bool())
            .unwrap_or(false);

        if is_live {
            return Err(anyhow!("Livestreams not supported"));
        }

        let mut qualities: Vec<MediaVideoQuality> = Vec::new();
        let mut seen_heights: HashSet<u32> = HashSet::new();

        if let Some(formats) = json.get("formats").and_then(|v| v.as_array()) {
            for f in formats {
                let height = f.get("height").and_then(|v| v.as_u64()).unwrap_or(0) as u32;
                let width = f.get("width").and_then(|v| v.as_u64()).unwrap_or(0) as u32;
                let vcodec = f.get("vcodec").and_then(|v| v.as_str()).unwrap_or("none");
                let acodec = f.get("acodec").and_then(|v| v.as_str()).unwrap_or("none");

                if vcodec == "none" || height == 0 {
                    continue;
                }

                let has_audio = acodec != "none";

View on GitHub (pinned to 8600b91f42)