tonhowtf/omniget · error

Livestreams not supported

Error message

Livestreams not supported

What it means

parse_video_info inspects the yt-dlp JSON's is_live field; when it is true the media is a live broadcast (or an in-progress livestream), which this library deliberately does not support, so it fails fast instead of producing an unusable MediaInfo.

Solutions

  1. Wait until the livestream has ended and YouTube has published the VOD, then retry.
  2. Detect live URLs (or pre-check is_live) and surface a friendly 'livestream not supported' message to the user before download.
  3. For live capture, use yt-dlp directly with --live-from-start or a dedicated recording tool; this library will not handle it.
  4. Filter channel/playlist entries so live items are skipped rather than failing the whole batch.
Defensive patterns

Strategy: try-catch

Try / catch

match platform.get_media_info(url).await {
    Ok(info) => handle(info),
    Err(e) if e.to_string().contains("Livestreams not supported") => {
        notify_user("This is a livestream; try again after it ends.");
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling get_media_info/fetch_with_ytdlp on a URL that points to a YouTube livestream currently in progress, or a completed stream yt-dlp still marks as live; also pasting /live/<id> URLs that resolve to a live stream.

Common situations: Users paste a link to a stream that is airing right now; yt-dlp reports is_live true for premieres or upcoming-but-started broadcasts; automated pipelines process channel feeds that mix VODs and live streams.

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/b9a9d34d3f0bbb40. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/omniget-core/src/platforms/youtube.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)