Help us keep the list up to date and submit new video software here.
Try DVDFab and copy all Ultra HD Blu-rays and DVDs / remove Cinavia protection! Download free trial.
Tool
Complete Version history / Release notes / Changelog / What's New for dash-mpd-cli
v0.2.22
Improvements to the handling of subtitles: we make additional efforts to extract STPP subtitles from a sequence of fMP4 segments, as a .ttml file. ffmpeg does not currently seem to be able to extract this in the more commonly supported SRT format. When saving to a Matroska container (.mkv or .webm output files), we attempt to embed subtitle tracks with mkvmerge instead of with MP4Box (which fails).
Fix off-by-one bug in the calculation of the number of media fragments to download when using SegmentTemplate addressing with $Number$. The initialiation segment was being counted towards the number of segments, but should not be. Bug reported by @vidasi.
When the audio and video tracks are unsynchronized due to a difference in their startTime attribute, we attempt to fix this desynchronization during muxing. This is a rare problem in the wild and has not been heavily tested. The fix is currently only implemented when using ffmpeg as a muxer application (uses the -itsoffset commandline option).
v0.2.20
Add support for concatenating streams in multi-period manifests using mkvmerge, as an alternative to the existing support for concatenation using ffmpeg. The preference ordering for concatenation helpers is specified by commandline argument --concat-preference, which works similarly to the existing --muxer-preference commandline argument.
Concatenation using mkvmerge works at least with MP4 and with Matroska (.mkv) containers. It tends to be much faster than using ffmpeg but also less robust (less tolerant of the variety of media encoding specificities found in the wild). You can specify multiple concatenation helpers, in which case they will be called sequentially until one of them returns a success code.
Allow the user to specify a preference for streams based on the value of the Role element in an AdaptationSet. Streaming services sometimes publish various additional streams marked with roles such as alternate or supplementary or description, in addition to the main stream which is generally labelled with a role of main. The user can specify a preference order for these role annotations, which is applied after the language preference and before the width/height/quality preference.
Fix a bug in concatenation for multiperiod manifests that occured when one of the Periods does not contain any audio.
Accomodate manifests which declare that a Representation has mimeType="video/mp4" and codecs="mp4a" (or some other audio codec). These Representations are now detected as audio streams rather than as video streams.
v0.2.19
A new commandline argument --minimum_period_duration whose argument is a number of seconds. Periods in the manifest whose duration is less than this value will not be downloaded. This may be useful to avoid overloading the servers that deliver advertising segments that are sliced into the content of interest.
Fix a bug in the concatenation of multiperiod manifests. When per-Period files contained both audio and video content, the content was being included twice in the concatenated file.
MacOS release binaries are now universal binaries, rather than Aarch64 ("Apple Silicon") binaries.
Fixed release builds for Microsoft Windows. These builds are currently using a fork of the bench_scraper crate, pending integration of patches that fix builds on Windows and update dependent crates.
v0.2.18
Fix bug in filename handling when using the ffmpeg concatenation filter, which is used for multiperiod manifests when the technical characteristics of the different periods make it possible to concatenate them without reencoding. Filenames were not properly escaped when passed as arguments to the filter_complex commandline argument.
Add support for subtitles that use SegmentBase addressing.
Subtitles in STPP format (a data stream in MP4 fragments) are now converted to TTML format. The XML data stream is extracted using ffmpeg. If the conversion is successful it will be saved to a file with the same name as the output file, but with a .ttml extension.
v0.2.15
Fix the handling of the --referer commandline option, now used in all network
requests (bug reported by @yoyo890121).
v0.2.14
The referer header specified using the --referer commandline option is now used in all network
requests, including requests for media segments. Previously, the referer specified on the
commandline was only used to retrieve the MPD manifest, and the referer header used in network
requests for media segments was the URL of the MPD manifest, updated to account for any HTTP
redirects and for use of the DASH Location redirect functionality. The new behaviour allows the
user to mimic the behaviour of a web browser which is playing media embedded in a web page.
Cookies set while retrieving the MPD manifest will be included in requests for media segments.
In practice, media servers rarely check cookies, as doing so is expensive on CDN infrastructure,
but this should help to mimic the behaviour of a web browser which is playing media embedded in a
web page.
Fix handling of XLinked elements when remote XML fragment contains multiple elements.
v0.2.13
Fix the handling of XLinked elements. The Shaka heliocentrism test case now works correctly.
Widevine and PlayReady initialization data will now be decoded and pretty printed, alongside their Base64 representation (uses the new pssh-box crate).
Fix concatenation for multiperiod manifests in situations where one period has audio and another has no audio track.
We have changed the workflow used to produce release binaries, and these are currently generated for fewer platforms than previously. We will hopefully restore the missing platforms in future releases.
v0.2.12
The tracing crate is now used for all logging purposes. Logged messages can be controlled using
the RUST_LOG environment variable. As previously, warning and error messages are printed to
stderr, and other informative messages to stdout, but they will now be prefixed by a timestamp.
The Docker container at ghcr.io/emarsden/dash-mpd-cli is now also available for linux/arm/v7
(32-bit ARM) and linux/riscv64, in addition to linux/amd64 and linux/arm64.
Fix bug in the handling of toplevel Period.SegmentTemplate elements (rarely present in the wild,
but allowed by the DASH specification).
When deciding whether downloaded video files can be concatenated using the ffmpeg concat muxer, we
tolerate missing sar metainformation (not always present in MP4 containers in the wild).
v0.2.11
New commandline argument --drop-elements which takes an XPath expression as argument. XML
elements in the MPD manifest that match this XPath expression will be removed from the manifest
before downloading. This may be useful to help select an audio track based on attributes such as
its role or label, or to avoid overloading the servers that serve advertising content.
Include the query component of the MPD URL in requests for media segments, to support the
token-based authentication used by some streaming services. If the manifest URL is
https://example.com/manifest.mpd?token=foo, requests to segments will look like
/segment/42.m4v?token=foo, unless the manifest includes an explicit query component in the
segment URLs.
Muxing to a WebM container using the VLC external muxer should be fixed.
v0.2.10
A user manual is available on GitHub pages.
dash-mpd-cli can be run in a Podman/Docker container, packaged on the GitHub Container Registry at
ghcr.io/emarsden/dash-mpd-cli. The container conveniently includes most of the external helper
applications (ffmpeg, MP4Box, mkvmerge, shaka-packager, mp4decrypt, etc.). It’s a multiarch
container, currently packaged for linux/amd64 and linux/arm64. See the user manual for details on
running in a container.
The current download bandwidth is displayed in the progress bar, if it is activated.
Fix the calculation of audio segments to be downloaded for a live stream (dynamic manifest) for
which --force_duration has been specified.
v0.2.9
Add the possibility to use the Shaka packager application for decryption of media with Content Protection,
as an alternative to mp4decrypt. The shaka-packager application is able to handle more media
formats (e.g. WebM/Matroska containers) and is better maintained than mp4decrypt. See the
commandline arguments --decryption-application and --shaka-packager-location.
New commandline argument --enable-live-streams that makes it possible to attempt to download
from a live (dynamic) manifest. Downloading from a genuinely live stream won't work well, because
we don't implement the clock-related throttling needed to only download media segments when they
become available. However, some media sources publish pseudo-live streams where all media segments
are in fact available (they don't update the manifest once the live is complete), which we will be
able to download. You might also have some success in combination with the --sleep-requests
commandline argument.
New commandline argument --force-duration which makes it possible to specify the number of
seconds of content to download from the DASH stream. This may be necessary when using
--enable-live-streams, because live streams often don't specify a duration. It can also be used
to download only the first part of a normal (static) stream.
Fix the selection of the desired Representation (according to the user's quality/resolution
preferences) for DASH manifests that include multiple AdaptationSets. This is the case on some
manifests that offer media streams using different codecs. We were previously only examining
Representation elements in the first AdaptationSet present in the manifest.
v0.2.8
Add preliminary support for applying rewrite rules to the MPD manifest before downloading media
segments. Rewrite rules are expressed as XSLT stylesheets that are applied to the manifest using
the xsltproc commandline tool (which supports XSLT v1.0). This allows complex rewrite rules to
be expressed using a standard (if a little finicky) stylesheet language. See the --xslt-stylesheet
commandline option.
This functionality and API are experimental, and may evolve to use a different XSLT processor, such as
Saxon-HE (https://github.com/Saxonica/Saxon-HE/) which has support for XSLT v3.0, but is
implemented in Java. Alternatively, a more general filtering functionality based on WASM bytecode
might be implemented to allow the implementation of rewrite rules in a range of languages that can
compile to WebAssembly.
Change the default ordering of muxer applications when saving media to a .webm container to prefer
VLC over ffmpeg. With the commandline arguments that we use, ffmpeg does not automatically
reencode content to a codec that is allowed by the WebM specification, whereas VLC does do so.
Some limited DASH conformity checks will be run on manifests before downloading, which may
generate warnings written to stderr. A surprising number of manifests, including some
generated by the most widely used commercial streaming software, feature non-conformities such as
incorrect values of @MaxWidth / @maxHeight or inserted advertising segments that don't respect
@maxSegmentDuration).
v0.2.7
Allow the user to specify the order in which muxer applications are tried, instead of using a
hard-coded ordering per container type. The ordering is specified per container type ("mkv",
"mp4", "avi", "ts", etc.). The user specifies an ordering such as "ffmpeg,vlc,mp4box" which means
that ffmpeg is tried first, and if that fails vlc, and if that fails mp4box. The muxers currently
available are ffmpeg, vlc, mkvmerge and mp4box. See commandline arguemnt --muxer-preference.
Work around a bug in VLC, which does not correctly report failure to mux via a non-zero exit code.
v0.2.6
New commandline argument --auth-bearer to specify the token to be used for Bearer authentication
of network requests to retrieve the manifest and the media segments. This is the authentication
method specified in RFC 6750, originally designed for OAuth 2.0, but also used in other settings
such as JSON Web Tokens (JWT).
Enable support for MPEG-4 Part 17 (Timed Text) subtitles (tx3g codec). They will be converted to
SRT format if the MP4Box commandline application is installed.
When printing the available media streams, print Role and Label information if they are
specified on an AdaptationSet element.
Fix handling of MPD.Location field (thanks to @nissy34).
v0.2.5
New commandline arguments --prefer-video-width and --prefer-video-height which allow the user
to specify the video stream to be downloaded, when multiple video streams with different
resolutions are made available. The video stream with the horizontal (respectively vertical)
resolution closest to the specified width (respectively height) is chosen. This preference only
concerns the video stream; use the --quality commandline argument to specify the preferred audio
stream when multiple audio streams with different quality levels are available. If a preference
for both video width and video height is provided, the preferred width is used. A width or height
preference overrides (for the video stream) a specified quality preference.
New value intermediate recognized for the --quality commandline argument. If the DASH manifest
specifies several Adaptations with different bitrates or quality levels (specified by the
@qualityRanking attribute in the manifest -- quality ranking may different from bandwidth
ranking when different codecs are used), prefer the Adaptation with an intermediate bitrate
(closest to the median value).
New commandline arguments --auth-username and --auth-password to specify the username and
password to be used for authentication with the server. Currently only HTTP Basic authentication
is supported.
Improve support for selecting the output container format based on its filename extension.
Selecting an output file with an .mkv extension will now produce an output file in Matroska
container format, even in cases where the manifest only contains a video stream or only an audio
stream (shortcircuiting the muxing functionality). In these cases, the stream will be copied if
the output container requested is compatible with the downloaded stream format, and otherwise a
new media container with the requested format will be created and the audio or video stream will
be inserted (and reencoded if necessary) into the output file. This insertion and reencoding is
undertaken by the same commandline applications used for muxing: ffmpeg, mkvmerge, mp4box
(currently not vlc).
v0.2.4
New commandline argument --header (alias -H) which is compatible with cURL. This can be
convenient when using “Copy as cURL” functionality in Chromium DevTools. The syntax for the
argument is slightly different from the existing --add-header commandline argument.
On startup, check whether a newer version is available as a GitHub release, unless the
--no-version-check commandline option is enabled.
Improve support for multiperiod manifests. When the contents of the different periods
can be joined into a single output container (because they share the same resolution, frame rate
and aspect ratio), we concatenate them using ffmpeg (with reencoding in case the codecs in the
various periods are different). If they cannot be joined, we save the content in output files
named according to the requested output file (whose name is used for the first period). Names
ressemble "output-p2.mp4" for the second period, and so on.
New function concatenate_periods on DashDownloader to specify whether the concatenation using
ffmpeg (which is very CPU-intensive due to the reencoding) of multi-period manifests should be
attempted. The default behaviour is to concatenate when the media contents allow it.
Improved support for certain addressing types on subtitles (AdaptationSet>SegmentList,
Representation>SegmentList, SegmentTemplate+SegmentTimeline addressing modes).
Significantly improved support for XLink semantics on elements (remote elements). In particular, a
remote XLinked element may resolve to multiple elements (e.g. a Period with href pointing to a
remote MPD fragment may resolve to three final Period elements), and a remote XLinked element may
contain a remote XLinked element (the number of repeated resolutions is limited, to avoid DoS
attacks).
v0.2.3
New commandline argument --referer to specify the value of the Referer HTTP header. This is an
alternative to the use of the --add-header commandline argument.
Fix regression: restore printing of logged diagnostics.
Add support for EIA-608 aka CEA-608 subtitles/closed captions.
More diagnostics information is printed concerning the selected audio/video streams. In
particular, pssh information will be printed for streams with ContentProtection whose pssh is
embedded in the initialization segments rather than in the DASH manifest.
v0.2.2
New commandline argument --simulate to retrieve the MPD manifest but not download any audio,
video or subtitle content.
Improve support for retrieving subtitles that are distributed in fragmented MP4 streams (in
particular WebVTT/STPP formats).
More diagnostics information is printed concerning the selected audio/video streams.
v0.2.1
Support for decrypting encrypted media streams that use ContentProtection, via the Bento4
mp4decrypt commandline application. See the --key commandline argument to allow kid:key pairs to
be specified, and the --mp4decrypt-location commandline argument to specify a non-standard
location for the mp4decrypt binary.
Fix a bug in the handling of the --add-header commandline argument.
v0.2.0
Incompatible change to the --keep_audio and keep_video commandline arguments, to allow
the user to specify the path for the audio and video files. Instead of operating as flags, they
allow the user to specify the filename to which the corresponding stream will be saved (and not
deleted after muxing).
New commandline argument --client-identity-certificate to provide a file containing a private
key and certificate (both encoded in PEM format). These will be used to authenticate TLS network
connections.
Print information on the different media streams available (resolution, bitrate, codec) in a
manifest when requested verbosity is non-zero.
v0.1.14
New commandline argument --add-root-certificate to add an X.509 certificate to the list of root
certificates used to check TLS connections to servers. Certificates should be provided in PEM format.
New commandline argument --no-proxy to disable use of a proxy, even if related enviroment
variables (HTTP_PROXY etc.) are set.
Connection errors at the network level are handled as permanent, rather than transient, errors. In
particular, TLS certificate verification errors will no longer be treated as transient errors.
v0.1.13
New commandline argument --cookies-from-browser to load HTTP cookies from a web browser (support
for Firefox, Chromium, Chrome, ChromeBeta, Edge and Safari on Linux, Windows and MacOS, via the
bench_scraper crate). This support is gated by the cookies feature, which is enabled by default.
Disable it (with --no-default-features) to build on platforms which are not supported by the
bench_scraper crate, such as Android/Termux.
v0.1.12
Add commandline argument --save-fragments to save media fragments (individual DASH audio and
video segments) to the specified directory.
Add commandline argument --mp4box-location=<path> to allow a non-standard location for the
MP4Box binary (from the GPAC suite) to be specified.
Update to version 0.9.0 of the dash-mpd crate, which is more tolerant of unexpected extensions to
the DASH schema.
v0.1.11
New commandline argument --limit-rate to throttle the network bandwidth used to download media segments, expressed in octets per second. The limit can be expressed with a k, M or G suffix to indicate kB/s, MB/s or GB/s (fractional suffixed quantities are allowed, such as 1.5M). The default is not to throttle bandwidth.
v0.1.10
New commandline argument --max-error-count to specify the maximum number of non-transient network errors that should be ignored before a download is aborted. This is useful in particular on some manifests using Time-based or Number-based SegmentLists for which the packager calculates a number of segments which is different to our calculation (in which case the last segment can generate an HTTP 404 error).
Update to version 0.7.3 of the dash-mpd crate, which provides better handling of transient and non-transient network errors.
Fix bug in the handling the value of the --sleep-requests commandline argument.
v0.1.9
This release updates to version 0.7.2 of the dash-mpd crate. This provides support for downloading additional types of subtitles in DASH streams. This version also makes it possible to select between native-tls and rustls-tls TLS implementations.
Improvements to the handling of subtitles: we make additional efforts to extract STPP subtitles from a sequence of fMP4 segments, as a .ttml file. ffmpeg does not currently seem to be able to extract this in the more commonly supported SRT format. When saving to a Matroska container (.mkv or .webm output files), we attempt to embed subtitle tracks with mkvmerge instead of with MP4Box (which fails).
Fix off-by-one bug in the calculation of the number of media fragments to download when using SegmentTemplate addressing with $Number$. The initialiation segment was being counted towards the number of segments, but should not be. Bug reported by @vidasi.
When the audio and video tracks are unsynchronized due to a difference in their startTime attribute, we attempt to fix this desynchronization during muxing. This is a rare problem in the wild and has not been heavily tested. The fix is currently only implemented when using ffmpeg as a muxer application (uses the -itsoffset commandline option).
v0.2.20
Add support for concatenating streams in multi-period manifests using mkvmerge, as an alternative to the existing support for concatenation using ffmpeg. The preference ordering for concatenation helpers is specified by commandline argument --concat-preference, which works similarly to the existing --muxer-preference commandline argument.
Concatenation using mkvmerge works at least with MP4 and with Matroska (.mkv) containers. It tends to be much faster than using ffmpeg but also less robust (less tolerant of the variety of media encoding specificities found in the wild). You can specify multiple concatenation helpers, in which case they will be called sequentially until one of them returns a success code.
Allow the user to specify a preference for streams based on the value of the Role element in an AdaptationSet. Streaming services sometimes publish various additional streams marked with roles such as alternate or supplementary or description, in addition to the main stream which is generally labelled with a role of main. The user can specify a preference order for these role annotations, which is applied after the language preference and before the width/height/quality preference.
Fix a bug in concatenation for multiperiod manifests that occured when one of the Periods does not contain any audio.
Accomodate manifests which declare that a Representation has mimeType="video/mp4" and codecs="mp4a" (or some other audio codec). These Representations are now detected as audio streams rather than as video streams.
v0.2.19
A new commandline argument --minimum_period_duration whose argument is a number of seconds. Periods in the manifest whose duration is less than this value will not be downloaded. This may be useful to avoid overloading the servers that deliver advertising segments that are sliced into the content of interest.
Fix a bug in the concatenation of multiperiod manifests. When per-Period files contained both audio and video content, the content was being included twice in the concatenated file.
MacOS release binaries are now universal binaries, rather than Aarch64 ("Apple Silicon") binaries.
Fixed release builds for Microsoft Windows. These builds are currently using a fork of the bench_scraper crate, pending integration of patches that fix builds on Windows and update dependent crates.
v0.2.18
Fix bug in filename handling when using the ffmpeg concatenation filter, which is used for multiperiod manifests when the technical characteristics of the different periods make it possible to concatenate them without reencoding. Filenames were not properly escaped when passed as arguments to the filter_complex commandline argument.
Add support for subtitles that use SegmentBase addressing.
Subtitles in STPP format (a data stream in MP4 fragments) are now converted to TTML format. The XML data stream is extracted using ffmpeg. If the conversion is successful it will be saved to a file with the same name as the output file, but with a .ttml extension.
v0.2.15
Fix the handling of the --referer commandline option, now used in all network
requests (bug reported by @yoyo890121).
v0.2.14
The referer header specified using the --referer commandline option is now used in all network
requests, including requests for media segments. Previously, the referer specified on the
commandline was only used to retrieve the MPD manifest, and the referer header used in network
requests for media segments was the URL of the MPD manifest, updated to account for any HTTP
redirects and for use of the DASH Location redirect functionality. The new behaviour allows the
user to mimic the behaviour of a web browser which is playing media embedded in a web page.
Cookies set while retrieving the MPD manifest will be included in requests for media segments.
In practice, media servers rarely check cookies, as doing so is expensive on CDN infrastructure,
but this should help to mimic the behaviour of a web browser which is playing media embedded in a
web page.
Fix handling of XLinked elements when remote XML fragment contains multiple elements.
v0.2.13
Fix the handling of XLinked elements. The Shaka heliocentrism test case now works correctly.
Widevine and PlayReady initialization data will now be decoded and pretty printed, alongside their Base64 representation (uses the new pssh-box crate).
Fix concatenation for multiperiod manifests in situations where one period has audio and another has no audio track.
We have changed the workflow used to produce release binaries, and these are currently generated for fewer platforms than previously. We will hopefully restore the missing platforms in future releases.
v0.2.12
The tracing crate is now used for all logging purposes. Logged messages can be controlled using
the RUST_LOG environment variable. As previously, warning and error messages are printed to
stderr, and other informative messages to stdout, but they will now be prefixed by a timestamp.
The Docker container at ghcr.io/emarsden/dash-mpd-cli is now also available for linux/arm/v7
(32-bit ARM) and linux/riscv64, in addition to linux/amd64 and linux/arm64.
Fix bug in the handling of toplevel Period.SegmentTemplate elements (rarely present in the wild,
but allowed by the DASH specification).
When deciding whether downloaded video files can be concatenated using the ffmpeg concat muxer, we
tolerate missing sar metainformation (not always present in MP4 containers in the wild).
v0.2.11
New commandline argument --drop-elements which takes an XPath expression as argument. XML
elements in the MPD manifest that match this XPath expression will be removed from the manifest
before downloading. This may be useful to help select an audio track based on attributes such as
its role or label, or to avoid overloading the servers that serve advertising content.
Include the query component of the MPD URL in requests for media segments, to support the
token-based authentication used by some streaming services. If the manifest URL is
https://example.com/manifest.mpd?token=foo, requests to segments will look like
/segment/42.m4v?token=foo, unless the manifest includes an explicit query component in the
segment URLs.
Muxing to a WebM container using the VLC external muxer should be fixed.
v0.2.10
A user manual is available on GitHub pages.
dash-mpd-cli can be run in a Podman/Docker container, packaged on the GitHub Container Registry at
ghcr.io/emarsden/dash-mpd-cli. The container conveniently includes most of the external helper
applications (ffmpeg, MP4Box, mkvmerge, shaka-packager, mp4decrypt, etc.). It’s a multiarch
container, currently packaged for linux/amd64 and linux/arm64. See the user manual for details on
running in a container.
The current download bandwidth is displayed in the progress bar, if it is activated.
Fix the calculation of audio segments to be downloaded for a live stream (dynamic manifest) for
which --force_duration has been specified.
v0.2.9
Add the possibility to use the Shaka packager application for decryption of media with Content Protection,
as an alternative to mp4decrypt. The shaka-packager application is able to handle more media
formats (e.g. WebM/Matroska containers) and is better maintained than mp4decrypt. See the
commandline arguments --decryption-application and --shaka-packager-location.
New commandline argument --enable-live-streams that makes it possible to attempt to download
from a live (dynamic) manifest. Downloading from a genuinely live stream won't work well, because
we don't implement the clock-related throttling needed to only download media segments when they
become available. However, some media sources publish pseudo-live streams where all media segments
are in fact available (they don't update the manifest once the live is complete), which we will be
able to download. You might also have some success in combination with the --sleep-requests
commandline argument.
New commandline argument --force-duration which makes it possible to specify the number of
seconds of content to download from the DASH stream. This may be necessary when using
--enable-live-streams, because live streams often don't specify a duration. It can also be used
to download only the first part of a normal (static) stream.
Fix the selection of the desired Representation (according to the user's quality/resolution
preferences) for DASH manifests that include multiple AdaptationSets. This is the case on some
manifests that offer media streams using different codecs. We were previously only examining
Representation elements in the first AdaptationSet present in the manifest.
v0.2.8
Add preliminary support for applying rewrite rules to the MPD manifest before downloading media
segments. Rewrite rules are expressed as XSLT stylesheets that are applied to the manifest using
the xsltproc commandline tool (which supports XSLT v1.0). This allows complex rewrite rules to
be expressed using a standard (if a little finicky) stylesheet language. See the --xslt-stylesheet
commandline option.
This functionality and API are experimental, and may evolve to use a different XSLT processor, such as
Saxon-HE (https://github.com/Saxonica/Saxon-HE/) which has support for XSLT v3.0, but is
implemented in Java. Alternatively, a more general filtering functionality based on WASM bytecode
might be implemented to allow the implementation of rewrite rules in a range of languages that can
compile to WebAssembly.
Change the default ordering of muxer applications when saving media to a .webm container to prefer
VLC over ffmpeg. With the commandline arguments that we use, ffmpeg does not automatically
reencode content to a codec that is allowed by the WebM specification, whereas VLC does do so.
Some limited DASH conformity checks will be run on manifests before downloading, which may
generate warnings written to stderr. A surprising number of manifests, including some
generated by the most widely used commercial streaming software, feature non-conformities such as
incorrect values of @MaxWidth / @maxHeight or inserted advertising segments that don't respect
@maxSegmentDuration).
v0.2.7
Allow the user to specify the order in which muxer applications are tried, instead of using a
hard-coded ordering per container type. The ordering is specified per container type ("mkv",
"mp4", "avi", "ts", etc.). The user specifies an ordering such as "ffmpeg,vlc,mp4box" which means
that ffmpeg is tried first, and if that fails vlc, and if that fails mp4box. The muxers currently
available are ffmpeg, vlc, mkvmerge and mp4box. See commandline arguemnt --muxer-preference.
Work around a bug in VLC, which does not correctly report failure to mux via a non-zero exit code.
v0.2.6
New commandline argument --auth-bearer to specify the token to be used for Bearer authentication
of network requests to retrieve the manifest and the media segments. This is the authentication
method specified in RFC 6750, originally designed for OAuth 2.0, but also used in other settings
such as JSON Web Tokens (JWT).
Enable support for MPEG-4 Part 17 (Timed Text) subtitles (tx3g codec). They will be converted to
SRT format if the MP4Box commandline application is installed.
When printing the available media streams, print Role and Label information if they are
specified on an AdaptationSet element.
Fix handling of MPD.Location field (thanks to @nissy34).
v0.2.5
New commandline arguments --prefer-video-width and --prefer-video-height which allow the user
to specify the video stream to be downloaded, when multiple video streams with different
resolutions are made available. The video stream with the horizontal (respectively vertical)
resolution closest to the specified width (respectively height) is chosen. This preference only
concerns the video stream; use the --quality commandline argument to specify the preferred audio
stream when multiple audio streams with different quality levels are available. If a preference
for both video width and video height is provided, the preferred width is used. A width or height
preference overrides (for the video stream) a specified quality preference.
New value intermediate recognized for the --quality commandline argument. If the DASH manifest
specifies several Adaptations with different bitrates or quality levels (specified by the
@qualityRanking attribute in the manifest -- quality ranking may different from bandwidth
ranking when different codecs are used), prefer the Adaptation with an intermediate bitrate
(closest to the median value).
New commandline arguments --auth-username and --auth-password to specify the username and
password to be used for authentication with the server. Currently only HTTP Basic authentication
is supported.
Improve support for selecting the output container format based on its filename extension.
Selecting an output file with an .mkv extension will now produce an output file in Matroska
container format, even in cases where the manifest only contains a video stream or only an audio
stream (shortcircuiting the muxing functionality). In these cases, the stream will be copied if
the output container requested is compatible with the downloaded stream format, and otherwise a
new media container with the requested format will be created and the audio or video stream will
be inserted (and reencoded if necessary) into the output file. This insertion and reencoding is
undertaken by the same commandline applications used for muxing: ffmpeg, mkvmerge, mp4box
(currently not vlc).
v0.2.4
New commandline argument --header (alias -H) which is compatible with cURL. This can be
convenient when using “Copy as cURL” functionality in Chromium DevTools. The syntax for the
argument is slightly different from the existing --add-header commandline argument.
On startup, check whether a newer version is available as a GitHub release, unless the
--no-version-check commandline option is enabled.
Improve support for multiperiod manifests. When the contents of the different periods
can be joined into a single output container (because they share the same resolution, frame rate
and aspect ratio), we concatenate them using ffmpeg (with reencoding in case the codecs in the
various periods are different). If they cannot be joined, we save the content in output files
named according to the requested output file (whose name is used for the first period). Names
ressemble "output-p2.mp4" for the second period, and so on.
New function concatenate_periods on DashDownloader to specify whether the concatenation using
ffmpeg (which is very CPU-intensive due to the reencoding) of multi-period manifests should be
attempted. The default behaviour is to concatenate when the media contents allow it.
Improved support for certain addressing types on subtitles (AdaptationSet>SegmentList,
Representation>SegmentList, SegmentTemplate+SegmentTimeline addressing modes).
Significantly improved support for XLink semantics on elements (remote elements). In particular, a
remote XLinked element may resolve to multiple elements (e.g. a Period with href pointing to a
remote MPD fragment may resolve to three final Period elements), and a remote XLinked element may
contain a remote XLinked element (the number of repeated resolutions is limited, to avoid DoS
attacks).
v0.2.3
New commandline argument --referer to specify the value of the Referer HTTP header. This is an
alternative to the use of the --add-header commandline argument.
Fix regression: restore printing of logged diagnostics.
Add support for EIA-608 aka CEA-608 subtitles/closed captions.
More diagnostics information is printed concerning the selected audio/video streams. In
particular, pssh information will be printed for streams with ContentProtection whose pssh is
embedded in the initialization segments rather than in the DASH manifest.
v0.2.2
New commandline argument --simulate to retrieve the MPD manifest but not download any audio,
video or subtitle content.
Improve support for retrieving subtitles that are distributed in fragmented MP4 streams (in
particular WebVTT/STPP formats).
More diagnostics information is printed concerning the selected audio/video streams.
v0.2.1
Support for decrypting encrypted media streams that use ContentProtection, via the Bento4
mp4decrypt commandline application. See the --key commandline argument to allow kid:key pairs to
be specified, and the --mp4decrypt-location commandline argument to specify a non-standard
location for the mp4decrypt binary.
Fix a bug in the handling of the --add-header commandline argument.
v0.2.0
Incompatible change to the --keep_audio and keep_video commandline arguments, to allow
the user to specify the path for the audio and video files. Instead of operating as flags, they
allow the user to specify the filename to which the corresponding stream will be saved (and not
deleted after muxing).
New commandline argument --client-identity-certificate to provide a file containing a private
key and certificate (both encoded in PEM format). These will be used to authenticate TLS network
connections.
Print information on the different media streams available (resolution, bitrate, codec) in a
manifest when requested verbosity is non-zero.
v0.1.14
New commandline argument --add-root-certificate to add an X.509 certificate to the list of root
certificates used to check TLS connections to servers. Certificates should be provided in PEM format.
New commandline argument --no-proxy to disable use of a proxy, even if related enviroment
variables (HTTP_PROXY etc.) are set.
Connection errors at the network level are handled as permanent, rather than transient, errors. In
particular, TLS certificate verification errors will no longer be treated as transient errors.
v0.1.13
New commandline argument --cookies-from-browser to load HTTP cookies from a web browser (support
for Firefox, Chromium, Chrome, ChromeBeta, Edge and Safari on Linux, Windows and MacOS, via the
bench_scraper crate). This support is gated by the cookies feature, which is enabled by default.
Disable it (with --no-default-features) to build on platforms which are not supported by the
bench_scraper crate, such as Android/Termux.
v0.1.12
Add commandline argument --save-fragments to save media fragments (individual DASH audio and
video segments) to the specified directory.
Add commandline argument --mp4box-location=<path> to allow a non-standard location for the
MP4Box binary (from the GPAC suite) to be specified.
Update to version 0.9.0 of the dash-mpd crate, which is more tolerant of unexpected extensions to
the DASH schema.
v0.1.11
New commandline argument --limit-rate to throttle the network bandwidth used to download media segments, expressed in octets per second. The limit can be expressed with a k, M or G suffix to indicate kB/s, MB/s or GB/s (fractional suffixed quantities are allowed, such as 1.5M). The default is not to throttle bandwidth.
v0.1.10
New commandline argument --max-error-count to specify the maximum number of non-transient network errors that should be ignored before a download is aborted. This is useful in particular on some manifests using Time-based or Number-based SegmentLists for which the packager calculates a number of segments which is different to our calculation (in which case the last segment can generate an HTTP 404 error).
Update to version 0.7.3 of the dash-mpd crate, which provides better handling of transient and non-transient network errors.
Fix bug in the handling the value of the --sleep-requests commandline argument.
v0.1.9
This release updates to version 0.7.2 of the dash-mpd crate. This provides support for downloading additional types of subtitles in DASH streams. This version also makes it possible to select between native-tls and rustls-tls TLS implementations.