tonhowtf/omniget · error

Playlist empty or unavailable

Error message

Playlist empty or unavailable

What it means

Thrown by YouTubeDownloader::fetch_with_ytdlp when the URL is detected as a playlist (is_playlist_url) and ytdlp::get_playlist_info returns an empty entries list. It means the playlist exists at the URL level but yielded no downloadable video entries.

Solutions

  1. Verify the playlist is non-empty and public in a browser.
  2. Update yt-dlp to the latest version.
  3. Check the playlist ID in the URL is correct (list=... parameter).
  4. Handle the error upstream by prompting the user to supply a direct video URL instead.
  5. Log yt-dlp's raw output to distinguish an empty playlist from an extraction failure.

Example fix

// before
if entries.is_empty() {
    return Err(anyhow!("Playlist empty or unavailable"));
}
// after: distinguish empty vs fetch failure
let (playlist_title, entries) = ytdlp::get_playlist_info(ytdlp_path, url, &[]).await?;
if entries.is_empty() {
    return Err(anyhow!("Playlist '{}' is empty or its videos are private/unavailable", playlist_title));
}
Defensive patterns

Strategy: validation

Validate before calling

// pre-check the playlist yields entries before full fetch
let (title, entries) = ytdlp::get_playlist_info(&ytdlp_path, url, &[]).await?;
if entries.is_empty() {
    eprintln!("playlist '{}' has no public entries — ask user for a video URL instead", title);
}

Type guard

fn is_populated_playlist(entries: &[PlaylistEntry]) -> bool {
    !entries.is_empty()
}

Try / catch

match downloader.get_media_info(&url).await {
    Err(e) if e.to_string().contains("Playlist empty or unavailable") => {
        // prompt user: playlist is empty/private; try a direct video URL
        ask_for_direct_video_url();
    }
    other => other,
}

Prevention

When it happens

Trigger: Calling fetch_with_ytdlp (e.g. via get_media_info) on a playlist URL where get_playlist_info returns zero entries: empty playlists, private/unlisted-removed playlists, region-blocked entries, or yt-dlp failing to expand the playlist.

Common situations: Sharing a playlist URL whose videos have all been deleted or made private; region-restricted playlists; outdated yt-dlp failing against YouTube changes; passing a malformed URL that looks like a playlist but points to nothing.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


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

Appendix: source

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

                if key == "v" && !value.is_empty() {
                    has_video = true;
                }
            }

            return has_list && !has_video;
        }
        false
    }

    pub async fn fetch_with_ytdlp(
        url: &str,
        ytdlp_path: &std::path::Path,
    ) -> anyhow::Result<MediaInfo> {
        if Self::is_playlist_url(url) {
            let (playlist_title, entries) = ytdlp::get_playlist_info(ytdlp_path, url, &[]).await?;

            if entries.is_empty() {
                return Err(anyhow!("Playlist empty or unavailable"));
            }

            let qualities: Vec<MediaVideoQuality> = entries
                .into_iter()
                .enumerate()
                .map(|(i, entry)| MediaVideoQuality {
                    label: format!("{}. {}", i + 1, entry.title),
                    width: 0,
                    height: 0,
                    url: entry.url,
                    format: "ytdlp_playlist".to_string(),
                })
                .collect();

            return Ok(MediaInfo {
                title: sanitize_filename::sanitize(&playlist_title),
                author: playlist_title,
                platform: "youtube".to_string(),

View on GitHub (pinned to 8600b91f42)