I've been building my own HLS/DASH downloader and it's stable enough to put in front of people. Free, open source, and I'm the author - so weigh the benchmarks accordingly and please tell me where it falls over.
https://github.com/mohaanymo/m314dl
What it handles:
- HLS (.m3u8) and DASH (.mpd) - master/media playlists, rendition groups, byte ranges, multi-period manifests with discontinuity markers, fMP4 and TS.
- Decryption in-process and in-memory, overlapped with the download: CENC (AES-CTR), cbcs (AES-CBC pattern), cens, cbc1. No mp4decrypt or shaka-packager pass afterwards. You pass the key yourself with -key KID:KEY - m314dl does not obtain keys and has nothing to do with getting them.
- Byte-exact resume. It picks up on the exact byte mid-segment, so an interrupted download doesn't restart or come back with padding errors.
- Adaptive concurrency, AIMD between 4 and 64 in-flight requests. It backs off on its own when a server starts throwing 503s instead of you guessing a thread count.
- Live recording with -live-duration and clean Ctrl-C - you get a playable file, not a truncated one.
- Subtitles: WebVTT, TTML to SRT, stpp-in-fMP4 extraction.
- Ad-segment skipping by regex, stream selection by regex, custom headers, proxy, cookies.txt.
Speed on a 5-min 1080p HLS/TS test, same machine and connection: ~0.95s vs ~1.12s for N_m3u8DL-RE and ~1.60s for vsd. Decryption alone benchmarks ~1.4 GB/s (CTR) and ~1.05 GB/s (CBC). My box, my numbers - I'd like to see other people's.
Single static binary, no runtime deps except ffmpeg on PATH for muxing. Windows, Linux, macOS.
Code:go build -o m314dl .Bug reports, manifests that break it, and resume-corrupted-my-file reports all welcome - GitHub issues or reply here.Code:m314dl -list https://example.com/manifest.mpd m314dl -o out.mp4 https://example.com/master.m3u8 m314dl -key KID:KEY -o out.mp4 https://example.com/manifest.mpd m314dl -live-duration 1h -o show.mp4 https://example.com/live.m3u8
+ Reply to Thread
Results 1 to 20 of 20
-
-
Good work. Another one for the armoury along with N_m3u8DL_RE and dash_mpd_cli.
It appearance is a little basic but it works and is fast.
The only slight annoyance is the order it accepts arguments in the command. If this were to be a drop-in replacement it might be a good idea to use a 'don't-care' order for them or follow the daddy-of-them all N_M3u8DL_RE's ordering.Noob Starter Pack. Just download any Widevine media! Over 29,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
thanks for the feedback, I will consider taking the arguments command problem and fix it in the new versions,
about the appearance, actually it meant to be this way for this reason "Automation-friendly: plain-line progress on non-TTY (no ANSI garbage in logs), real exit codes, quiet machine-readable output" -
we are drowning in AI slop
Bypass HMACs, One-time-tokens and Lic.Wrapping: https://github.com/DevLARLEY/WidevineProxy2 -
Thanks. Neither N_m3u8DL_RE or dash_mpdcli work to download using an mpd from france.tv - the url fails in dns lookup.
The url (https://cloudingest.ftven.fr/ftv/b/70/b700192c68796/f46ded4d-5d1e-41a8-8825-78d54092f5...m/manifest.mpd) for an encrypted title works with this downloader.
So thank you for developing this.
One hiccup it picks up the subtitles but throws an error during conversion. it is a qsm stream with vtt codec.
I used a python downloader of my own, for the subs.Code:m314dl -key f46ded4d5d1e41a8882578d54092f512:e43d3149769ccd639ddb884fbbbae4c1 -o 'Astrid_S02E05' https://cloudingest.ftven.fr/ftv/b/70/b70 0192c68796/f46ded4d-5d1e-41a8-8825-78d54092f512-1784202207_france-domtom_DRM-SEC1.ism/manifest.mpd selected: video=2745000.3.3 video 1920x1080 2745kbps avc1.640029 (video=2745000) selected: audio_fre=192000.0.0 audio 192kbps mp4a.40.2 [fr] (audio_fre=192000) selected: textstream_qsm=1000.1.0 subtitles 1kbps wvtt [qsm] (textstream_qsm=1000) 100.0% | 3425/3425 segs | 1.07GiB | 1.6MiB/s | ETA ? warning: subtitle textstream_qsm=1000.1.0 conversion failed (ffmpeg subtitle extract failed: exit status 234 [out#0/srt @ 0xb2b85c0] Output file does not contain any stream Error opening output file Astrid_S02E05.m314dl-subtitles-textstream_qsm_1000.1.0.srt. Error opening output files: Invalid argument); keeping raw file Astrid_S02E05.m314dl-subtitles-textstream_qsm_1000.1.0.rawsub done: Astrid_S02E05.mp4
I want to emphasise to all those who sneer a someone for using AI, this worked when the other more respectable programs failed.Noob Starter Pack. Just download any Widevine media! Over 29,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Thanks angela, could you submit this issue in the repo and I will work on it as fast as I can,
about AI, I think some people confuse using AI without understanding what it's doing (vibe coding) with using AI while having a clear understanding of what you're doing. I don't vibe coding -
-
My personal feedback: your app works fine, but honestly i don't find any great vantages compared to using N_m3u8DL-RE.
for me they are both the same also the only issue that i find on your app is from download it reports a % of segments like 15/900 when in reality from the folder where the command is executed the downloaded segments are much more like 250/900, so what is reported in the command window of segments number is relative wrong % compared to the real segments already downloaded.
but it's just a not relevant issue. -
I use version 0.6.0 and cannot get it to work. I suppose it might be a vpn issue... but PEBCAK? It happens but I've been at this game too long not to spot it. I've checked several ways; from python script I can call the mpd with no hasssle:-
On some Nord VPN links I get a 403 using the mpd in a browser; widevineprox2's N_m3u8~ line fails from the command line; my own hellyes script's N_m3u8's line fails from the command line; my self generated line fails from the command line. So I count out PEBCAK this time.Code:response = httpx.get(mpd_url) if response.status_code != 200: print(f"Failed to fetch MPD. Status code: {response.status_code}") exit(1) pssh = parse_mpd_and_filter_pssh(response.content)[0]
[edit] N_m3u8DL_RE Version 6 gets detected and refused with a 403 error whilst V5 work for me too. Thanks for heads-up. It is a VPN issue [/edit]Last edited by A_n_g_e_l_a; 6th Sep 2026 at 05:56.
Noob Starter Pack. Just download any Widevine media! Over 29,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
thanks for your feedback, and yeah at the basic usage of just "downloading an hls or mpd video" you won't find big differences but if you are trying to do real downloading work from multiple different platforms you would start realizing the difference, I have been using N_m3u8dl-RE for over a year and that's why I decided to built my own tool because there are things N_m3u8dl-RE lacks.
-
mmm... maybe. yesterday i've tried to download a video from m3u8 link. about 1400 segments. your app download about 1000 then stop, freeze. so closed cmd window and run again same command. but nothing. i've repeat this operation 3 times, but nothing, freezed on about 1000 segments.
so i've run yt-dlp with same m3u8. done -
Here's how to download the content mentioned using dash-mpd-cli, run in a software container (which is the method I'd recommend for safety and for convenience in upgrading):
This fetches the fragmented WebVTT subtitles and converts them into a .srt file using MP4Box. (It works fine for me, with a French IP address.)podman run --rm --tty --pull=newer \
ghcr.io/emarsden/dash-mpd-cli:latest \
-o ftv.mp4 -v -v --write-subs \
--key f46ded4d5d1e41a8882578d54092f512:e43d3149769ccd639 ddb884fbbbae4c1 https://cloudingest.ftven.fr/ftv/b/70/b700192c68796/f46ded4d-5d1e-41a8-8825-78d54092f5...m/manifest.mpd
Unfortunately, the original subtitles contain inline style cues like "<c.white>Gagné.</c>" and MP4Box is not stripping them in the conversion to Subrip format. I'll have to check how to do this conversion in a more robust manner. -
17:49:51 ERROR Download failed: network error "requesting DASH manifest: reqwest::Error { kind: Status(403, None), url: \"https://cloudingest.ftven.fr/ftv/b/70/b700192c68796/f46ded4d-5d1e-41a8-8825-78d54092f5...m/manifest.mpd\" }"
My point was, on VPN, dash-mpd-cli fails, whereas m341dl did not.Noob Starter Pack. Just download any Widevine media! Over 29,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip -
Thanks, that's useful to know. The cloudingest.ftven.fr material is being served by Akamai, who don't run much nasty client fingerprinting code as far as I know, so the difference with m31dl is probably just due to HTTP headers (maybe even just the user-agent). I'll look into it.
-
Last edited by A_n_g_e_l_a; 11th Sep 2026 at 07:38.
Noob Starter Pack. Just download any Widevine media! Over 29,000 downloads for V6!.
https://files.videohelp.com/u/301890/hellyes6.zip
Similar Threads
-
[Release] - Ozivine - Australian & NZ FTA Downloader
By billybanana in forum Video Streaming DownloadingReplies: 353Last Post: 9th Sep 2026, 21:52 -
[Release] - Eurovine - European FTA Downloader
By billybanana in forum Video Streaming DownloadingReplies: 77Last Post: 9th Sep 2026, 10:43 -
YouTube live streams through HLS or DASH in 2026
By StreamBabyStream in forum Video Streaming DownloadingReplies: 2Last Post: 25th Apr 2026, 02:07 -
DASH mpd restream and Convert to m3u8 HLS
By thegeek in forum Video Streaming DownloadingReplies: 9Last Post: 18th May 2022, 22:38 -
How to auto select best HLS or DASH stream, and why one over the other ?
By abolibibelot in forum Video Streaming DownloadingReplies: 10Last Post: 8th Oct 2021, 23:11


Quote