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
- Verify the playlist is non-empty and public in a browser.
- Update yt-dlp to the latest version.
- Check the playlist ID in the URL is correct (list=... parameter).
- Handle the error upstream by prompting the user to supply a direct video URL instead.
- 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
- Verify the playlist is public and non-empty in a browser before processing.
- Keep yt-dlp updated so playlist expansion doesn't silently fail.
- Check the list= parameter is a valid playlist ID.
- Handle region-restricted entries by supplying cookies where supported.
- Cache playlist lookups to avoid repeated failures on stale links.
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
- Download cancelled
- Timeout fetching playlist (120s)
- yt-dlp playlist failed
- Video extraction failed. Update yt-dlp or try again.
- Playlist empty or unavailable
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)