scrapelist downloads YouTube videos or playlists, transcodes them with FFmpeg, and writes ready-to-play .m3u playlists.
Two interfaces are available:
- CLI: Terminal UI with live status panels (recommended for automation and servers)
- Desktop: MAUI-based graphical application for Windows/Android
Both share the same core download and transcoding engine. Features include:
- audio-only downloads (
.m4a) - video-only downloads (
.m4v) - both audio and video in one run
- live status panels for pending, downloading, transcoding, completed/skipped, and failed items
- .NET SDK that can build
net10.0 - Internet access (YouTube + FFmpeg download source)
No manual FFmpeg install is required in most cases:
- If
ffmpegis onPATH, it is used. - Otherwise the app downloads FFmpeg into a local
.toolsfolder at runtime.
From the project root:
dotnet run --project src/scrapelist.cli -- "https://www.youtube.com/playlist?list=YOUR_PLAYLIST_ID"Single video:
dotnet run --project src/scrapelist.cli -- "https://www.youtube.com/watch?v=VIDEO_ID"Audio-only to a specific folder:
dotnet run --project src/scrapelist.cli -- "https://www.youtube.com/playlist?list=YOUR_PLAYLIST_ID" --type audio --output "D:\Music"dotnet run --project src/scrapelistThe desktop app provides a graphical interface for URL input and progress monitoring.
(CLI version only)
scrapelist <uri> [options]
uri(required): YouTube video or playlist URL
-
--type <audio|video|both>- What to produce
- Default:
both
-
--retries <int>- Max retries per item (download/transcode failures)
- Default:
3
-
--parallel <int>- Max parallel download workers
- Default:
3
-
--indexed- Prefix filenames with playlist index (
[N] - ...) - Default:
false
- Prefix filenames with playlist index (
-
--timeout <seconds>- Per-item inactivity timeout while downloading
- Default:
60
-
--output <path>- Output directory
- Default:
.
-
--codec <none|x264|x265>- Video encoder used during mux/transcode
- Default:
x265
-
--debug- Write a debug log file in the output folder (
!debug-YYYYMMDD-HHMMSS.log) - Default:
false
- Write a debug log file in the output folder (
Depending on --type, each item outputs:
audio:Channel - Title.m4avideo:Channel - Title.m4vboth: both files above
If the input is a playlist, the app also creates:
# Playlist Title.m3u
The .m3u contains #EXTINF metadata and references completed/skipped files in playlist order.
- Existing final files are detected up front and marked
Skipped. - Downloads support resume via
.partfiles. - Downloaded media is transcoded/muxed by FFmpeg before final rename.
- Transcoding runs in a background worker (up to 2 parallel transcodes).
- Playlist file is updated during progress and written again at completion.
- Output names are built as
ChannelName - Title. - Invalid filename characters are replaced with Unicode-safe alternatives.
- Very long names are truncated to a safe length.
- With
--indexed, names become[PlaylistIndex] - ChannelName - Title.
Video with H.264:
dotnet run --project src/scrapelist.cli -- "https://www.youtube.com/playlist?list=YOUR_PLAYLIST_ID" --type video --codec x264Higher download parallelism and indexed filenames:
dotnet run --project src/scrapelist.cli -- "https://www.youtube.com/playlist?list=YOUR_PLAYLIST_ID" --parallel 5 --indexedDebug run:
dotnet run --project src/scrapelist.cli -- "https://www.youtube.com/watch?v=VIDEO_ID" --debug --output "D:\Downloads\scrapelist"The solution contains three projects:
scrapelist.common– Shared models, services, and logic (downloads, transcoding, playlist generation)scrapelist.cli– Command-line console UI using RazorConsole, supports all CLI optionsscrapelist– MAUI desktop application (Windows/Android) with graphical interface
Both CLI and Desktop versions use the same shared engine, so features and behavior are consistent across platforms.
-
Invalid URL
- Ensure
uriis a full absolute YouTube URL.
- Ensure
-
Timeouts
- Increase
--timeoutfor slower connections.
- Increase
-
FFmpeg issues
- Re-run with
--debugand inspect the generated debug log in the output directory. - If auto-download fails, install FFmpeg manually and ensure it is on
PATH.
- Re-run with
-
Some items fail repeatedly
- Retry with a higher
--retriesvalue.
- Retry with a higher
Build all projects:
dotnet buildRun CLI version:
dotnet run --project src/scrapelist.cli -- "https://www.youtube.com/watch?v=VIDEO_ID"Run desktop version:
dotnet run --project src/scrapelistTest projects build correctly:
dotnet build src/scrapelist.common
dotnet build src/scrapelist.cli
dotnet build src/scrapelist