#video-stream #download #m3u8 #hls #dash #downloader #playlists

app vsd

Download video streams served over HTTP from websites, DASH (.mpd) and HLS (.m3u8) playlists

8 releases

Uses new Rust 2024

new 0.3.3 Mar 14, 2025
0.3.2 Jun 23, 2024
0.3.0 Aug 18, 2023
0.2.5 Jan 9, 2023
0.1.0 Jun 22, 2022

#207 in Command line utilities

Download history 11/week @ 2024-11-15 11/week @ 2024-11-22 9/week @ 2024-11-29 17/week @ 2024-12-06 8/week @ 2024-12-13 1/week @ 2024-12-20 10/week @ 2024-12-27 12/week @ 2025-01-03 20/week @ 2025-01-10 5/week @ 2025-01-17 13/week @ 2025-01-24 18/week @ 2025-01-31 30/week @ 2025-02-07 33/week @ 2025-02-14 86/week @ 2025-02-21 17/week @ 2025-02-28

174 downloads per month

MIT/Apache

280KB
5.5K SLoC

vsd

Installation    |    Usage    |    Try Without Install

video stream downloader is a command line program to download video streams served over HTTP from websites, HLS and DASH playlists.

Features

  • Capturing network requests and collecting .m3u8, .mpd and subtitles from websites and save them locally.
  • Muxing streams to single video container using ffmpeg.
  • Singular progress bar for complete download process like an normal file download with realtime file size estimations.
  • Supports AES-128 and CENC playlists decryption.
  • Supports HLS and DASH
  • Supports downloading in multiple threads.
  • GUI (maybe in future)
  • Supports SAMPLE-AES playlist decryption.
  • Live stream download (wip)

See More

Installation

Dependencies

  • ffmpeg (optional, recommended) only required for transmuxing and transcoding streams.
  • chrome / chromium (optional) only required for capture and collect subcommands.

Visit releases for prebuilt binaries. Download and extract archive and then copy vsd binary to any path. Now add that path to your PATH environment variable.

Host Architecture Download
Android 7+ (Termux) aarch64 .tar.xz
Linux aarch64 .tar.xz
MacOS 11.7+ aarch64 .tar.xz
Windows aarch64 .zip
Linux x86_64 .tar.xz
MacOS 11.7+ x86_64 .tar.xz
Windows x86_64 .zip

You can also install vsd through cargo by using this command.

cargo install vsd

Build instructions can be found here and changelog here.

Additionally, you can also install third party gui frontend created by theRealCataclysm.

Usage

  • Downloading and saving HLS and DASH playlists to disk.
$ vsd save <url> -o video.mp4

For testing purposes you can use streams from https://test-streams.mux.dev.

  • Collecting .m3u8 (HLS), .mpd (Dash) and subtitles from a website and saving them locally.
$ vsd capture <url> --save
  • Downloading encrypted streams.
$ vsd save https://media.axprod.net/TestVectors/Dash/protected_dash_1080p_h264_singlekey/manifest.mpd \
    --key "kid=4060a865887842679cbf91ae5bae1e72:base64=/DU0CDcxDMD7U96X4ipp4A==" \
    --key "kid=4060a865887842679cbf91ae5bae1e72:hex=fc35340837310cc0fb53de97e22a69e0"

Help

$ vsd --help
Download video streams served over HTTP from websites, DASH (.mpd) and HLS (.m3u8) playlists.

Usage: vsd.exe [OPTIONS] <COMMAND>

Commands:
  capture  Capture playlists and subtitles from a website
  extract  Extract subtitles from mp4 boxes
  merge    Merge multiple segments to a single file
  save     Download DASH and HLS playlists
  help     Print this message or the help of the given subcommand(s)

Options:
      --color <COLOR>  When to output colored text [default: auto] [possible values: auto, always, never]
  -h, --help           Print help
  -V, --version        Print version
$ vsd save --help
Download DASH and HLS playlists

Usage: vsd.exe save [OPTIONS] <INPUT>

Arguments:
  <INPUT>  http(s):// | .mpd | .xml | .m3u8

Options:
      --base-url <BASE_URL>    Base url to be used for building absolute url to segment. This flag is usually needed for
                               local input files. By default redirected playlist url is used
  -d, --directory <DIRECTORY>  Change directory path for temporarily downloaded files. By default current working
                               directory is used
  -o, --output <OUTPUT>        Mux all downloaded streams to a video container (.mp4, .mkv, etc.) using ffmpeg. Note
                               that existing files will be overwritten and downloaded streams will be deleted
      --parse                  Parse playlist and returns it in json format. Note that `--output` flag is ignored when
                               this flag is used
      --color <COLOR>          When to output colored text [default: auto] [possible values: auto, always, never]
      --raw-prompts            Raw style input prompts for old and unsupported terminals
  -h, --help                   Print help

Automation Options:
      --prefer-audio-lang <PREFER_AUDIO_LANG>  Preferred language when multiple audio streams with different languages
                                               are available. Must be in RFC 5646 format (eg. fr or en-AU). If a
                                               preference is not specified and multiple audio streams are present, the
                                               first one listed in the manifest will be downloaded
      --prefer-subs-lang <PREFER_SUBS_LANG>    Preferred language when multiple subtitles streams with different
                                               languages are available. Must be in RFC 5646 format (eg. fr or en-AU). If
                                               a preference is not specified and multiple subtitles streams are present,
                                               the first one listed in the manifest will be downloaded
  -q, --quality <WIDTHxHEIGHT|HEIGHTp>         Automatic selection of some standard resolution streams with highest
                                               bandwidth stream variant from playlist. If matching resolution of
                                               WIDTHxHEIGHT is not found then only resolution HEIGHT would be considered
                                               for selection. comman values: [lowest, min, 144p, 240p, 360p, 480p, 720p,
                                               hd, 1080p, fhd, 2k, 1440p, qhd, 4k, 8k, highest, max] [default: highest]
      --skip-prompts                           Skip user input prompts and proceed with defaults

Client Options:
      --cookies <COOKIES>              Fill request client with some existing cookies value. Cookies value can be same
                                       as document.cookie or in json format same as puppeteer
      --header <KEY> <VALUE>           Custom headers for requests. This option can be used multiple times
      --no-certificate-checks          Skip checking and validation of site certificates
      --no-query-pass                  Skip passing query parameters where not needed
      --proxy <PROXY>                  Set http(s) / socks proxy address for requests
      --query <QUERY>                  Set query parameters for requests
      --set-cookie <SET_COOKIE> <URL>  Fill request client with some existing cookies per domain. First value for this
                                       option is set-cookie header and second value is url which was requested to send
                                       this set-cookie header. Example `--set-cookie "foo=bar; Domain=yolo.local"
                                       https://yolo.local`. This option can be used multiple times
      --user-agent <USER_AGENT>        Update and set user agent header for requests [default: "Mozilla/5.0 (Windows NT
                                       10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0
                                       Safari/537.36"]

Decrypt Options:
      --all-keys
          Use all supplied keys for decryption instead of using keys which matches with default kid only
  -k, --key <(base64=|file=|hex=)KEY | [kid=]KID:(base64=|file=|hex=)KEY>
          Keys for decrypting encrypted cenc streams. If streams are encrypted with a single key then there is no need
          to specify key id else specify decryption key in format KID:KEY. KID should be specified in hex format. KEY
          value can be specified in base64, file or hex format. This option can be used multiple times
      --no-decrypt
          Download encrypted streams without decrypting them. Note that --output flag is ignored if this flag is used

Download Options:
      --retry-count <RETRY_COUNT>  Maximum number of retries to download an individual segment [default: 15]
      --no-merge                   Download streams without merging them. Note that --output flag is ignored if this
                                   flag is used
  -t, --threads <THREADS>          Maximum number of threads for parllel downloading of segments. Number of threads
                                   should be in range 1-16 (inclusive) [default: 5]

Alternatives

List of alternatives to vsd:

  1. N_m3u8DL-RE is the best alternative to vsd. It also supports live playlist which vsd doesn't. It doesn't come with features like capture.
  2. N_m3u8DL-CLI is also good but it is not cross platform.
  3. m3u8-downloader is also good but it has very few customizable options.
  4. webvideo-downloader opens up the website using chrome and then captures m3u8 requests. vsd's capture command is closest to this functionality.
  5. dash-mpd-cli is very good for downloading DASH playlists. Also, most of the vsd internals for parsing and downloading DASH playlists is taken for it's main project.

License

Dual Licensed

Dependencies

~20–38MB
~613K SLoC