tonhowtf/omniget · error

Playlist download finished without any files

Error message

Playlist download finished without any files

What it means

download_playlist counts per-item successes; if success_count == 0 after all tasks finish and no per-item error was captured in last_err, this fallback error is returned. It means every entry in the playlist failed (or zero entries were attempted/succeeded) yet no specific error survived to be reported.

Solutions

  1. Check the playlist directory and logs for per-item failures — this generic message masks the real cause of each item's failure.
  2. Verify the playlist URL is public and contains downloadable (non-live, non-private) videos.
  3. Ensure the output/playlist directory is writable and has free disk space.
  4. Improve error capture: store the first (not just last) per-item error so users see the real failure instead of this fallback.
  5. Retry with fewer concurrent items to rule out rate-limiting killing all downloads.

Example fix

// before
// generic error makes diagnosis impossible
return Err(last_err.unwrap_or_else(|| anyhow!("Playlist download finished without any files")));

// after
return Err(last_err.unwrap_or_else(|| anyhow!(
    "Playlist download finished without any files: 0/{} items succeeded",
    total_items
)));
Defensive patterns

Strategy: try-catch

Try / catch

if let Err(e) = platform.download(playlist_url, None, &out_dir).await {
    eprintln!("playlist failed: {e}; check per-item logs and playlist contents");
}

Prevention

When it happens

Trigger: Calling download() on a playlist URL where every item download fails and last_err was never set (e.g. all tasks were skipped/filtered, the playlist yielded zero downloadable items, or errors were swallowed), so the unwrap_or_else default fires.

Common situations: Private/deleted videos in a playlist combined with a parser that yields no downloadable entries; network outage killing all concurrent downloads with the last error lost; playlist containing only livestreams (each rejected) with errors dropped; output directory permission problems affecting every item.

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

Appendix: source

Thrown at src-tauri/omniget-core/src/platforms/youtube.rs:434

            .await
            {
                Ok(result) => {
                    success_count += 1;
                    total_bytes += result.file_size_bytes;
                    last_path = result.file_path;
                }
                Err(e) => {
                    tracing::warn!("Playlist video {} failed: {}", i + 1, e);
                    last_err = Some(e);
                }
            }

            let _ = forwarder.await;
        }

        if success_count == 0 {
            return Err(
                last_err.unwrap_or_else(|| anyhow!("Playlist download finished without any files"))
            );
        }

        if success_count > 1 {
            last_path = playlist_dir.clone();
        }

        let _ = progress.send(ProgressUpdate::percent(100.0)).await;

        Ok(DownloadResult {
            file_path: last_path,
            file_size_bytes: total_bytes,
            duration_seconds: 0.0,
            torrent_id: None,
        })
    }
}

View on GitHub (pinned to 8600b91f42)