# Why Video Downloader Extensions Fail on Protected HLS
Source: https://www.gumlet.com/learn/video-downloader-extensions-vs-hls-streams/
Published: 2026-10-24T10:53:28.000Z
Tags: Video Protection
Key Takeaways

 * Every mainstream HLS downloader extension can detect an .m3u8 playlist. That part is trivial. Completing a decrypted, playable file from it is the part that fails most of the time.
 * puemos/hls-downloader, the most-cited free browser extension for this job, has 2.7k GitHub stars and ships its own FFmpeg-based merging. Nowhere in its documentation does it claim DRM support, and its feature list stops at encrypted HLS segments, a silence that lines up with what the tool actually does. 
 * Signed and tokenized URLs break most "paste the link into a downloader" workflows, not by hiding the stream, but by expiring the request before a delayed or automated download can finish.
 * AES-128 encryption alone stops casual, extension-based downloading. It does not stop someone who can intercept the key request itself, which is a materially different threat model.
 * DRM (Widevine, FairPlay) is the only protection layer in this review where documented failure was total: no extension, no method, produced a playable file.
 * The gap between "my extension found the stream" and "my extension downloaded the stream" is decided almost entirely by what the video vendor configured on the server, not by which extension the viewer happened to install.

Open Chrome DevTools on almost any video page and you will see a request for a file ending in .m3u8. That file is the playlist for an HTTP Live Streaming (HLS) delivery, and finding it is the easy part of this whole exercise.

A downloader extension lighting up green because it spotted that request tells you almost nothing about whether the video behind it can actually be saved.

This is the gap that most roundups of HLS downloader extensions miss entirely. They test for detection and report it as a success. Detection and completion are two different technical events, and conflating them is why a course creator, a media company, or a SaaS product team can walk away from a comparison table believing their video is either completely safe or completely exposed when the real answer sits somewhere in between.

This article works through what the documented evidence, extension changelogs, GitHub issue trackers, and public failure reports actually show about six categories of tools against four levels of stream protection: no encryption, AES-128 encryption, AES-128 layered with signed or tokenized URLs, and full DRM. The goal is not to rank extensions. It is to show exactly where detection stops and completion starts, so you can check which side of that line your own video content sits on.

If you manage video for a product, a course platform, or a media brand, this matters because the fix is not a better lock on the front door. It is a decision about the encryption and access-control layer your video vendor runs by default, which is usually invisible until someone tests it.

Most vendor security pages describe that layer in feature-checklist terms; this article checks it against what actually happened when extensions were pointed at it.

That distinction between a checklist and a tested outcome matters most for platforms whose protection stack spans all four layers this article covers. Gumlet, for instance, is a video hosting and protection platform that bundles AES-128 encryption, tokenized and session-bound signed URLs, multi-DRM (Widevine and FairPlay), and dynamic watermarking into one configuration surface rather than requiring separate vendor integrations for each layer. 


How HLS Actually Works, and Why Detection is the Easy Part

HTTP Live Streaming (HLS) is Apple's adaptive bitrate streaming protocol, and it splits a video into a manifest file plus dozens or hundreds of small media segments, so "downloading the video" actually means reconstructing many pieces into one file, not saving a single URL.

The manifest, the .m3u8 playlist, lists every segment along with its resolution and bitrate. A media player reads it, requests the segments in order, and stitches them into continuous playback in the browser's memory.

Nothing about that process requires a single downloadable file to exist anywhere. You can download an .m3u8 file directly, but what you get is a text playlist, not a video. An .m3u8 file is a set of instructions, not the content itself.

A downloader extension's first job is trivial by comparison: watch the network requests a page makes, flag anything that looks like a playlist, and show it to the user. Every extension reviewed here does this correctly, nearly every time, on unencrypted or lightly protected streams.

Segment reconstruction is the second, much harder job: fetch every listed segment, in the right order, with whatever authentication each request needs, then merge them into one playable file. This is where the six tools below actually separate from each other, and where "I found the playlist" and "I have a video I can watch" stop meaning the same thing.


6 HLS Downloader Tools, Compared on What They Can Actually Finish

The table below compares detection against completion, the two outcomes every existing roundup collapses into one column.




Tool
Platform
Detects .m3u8
Auto-merges segments
Handles AES-128
Documented result against signed/tokenized URLs
Documented result against DRM




HLS Downloader (puemos)
Firefox, Chrome (MV3, unofficial build), Edge, Brave, Arc
Yes
Yes, via ffmpeg.wasm locally in-browser
Partial, depends on key accessibility
Not designed for this; fails when tokens expire mid-fetch
No. Project documentation states DRM-protected content cannot be decrypted


Video DownloadHelper
Firefox, Chrome
Yes, for direct-file and some HLS variants
Inconsistent; often leaves raw segments
Limited
Frequently fails; multiple user reports of corrupted or unplayable output on authenticated streams
No


Stream Recorder
Chrome
Yes
Varies by build; some require external merge step
Limited
Undocumented at scale; anecdotal reports of partial captures
No


yt-dlp (command-line)
Cross-platform, not a browser extension
Yes, given a direct manifest URL
Yes, via bundled FFmpeg
Yes, when the key is fetchable without additional auth
Fails once a token or signed segment URL expires before the fetch completes
No


sniff-hls
Chrome, Firefox
Yes, detection-only by design
No, explicitly out of scope
N/A
N/A, tool does not attempt segment retrieval
No. Project FAQ states encrypted DRM content cannot be decrypted


Generic browser "video downloader" extensions (bulk category)
Chrome, Firefox, Edge
Yes, for exposed manifests
Rare
Rare
Fails on any session-bound request
No





A tool that detects a playlist and a tool that reconstructs a working video from it are answering two different questions, and every extension in this table answers the first one far more reliably than the second.

Two tools in that table are worth a specific callout because their own project documentation states the DRM limitation outright rather than leaving it implied.

The puemos/hls-downloader project (2.7k stars, MIT licensed, verified working on Firefox, Chrome, Edge, Brave, and Arc as of its current release) ships a real FFmpeg-based merge pipeline and quality selection down to individual audio and video renditions.

It is genuinely the most capable free option reviewed here for unencrypted or simply encrypted content. Its documentation is also notable for what it does not claim: DRM support appears nowhere in the feature list, the installation guide, or the usage instructions.

The sniff-hls project takes the narrower and more honest position of not even attempting segment retrieval. Its own public FAQ states plainly that it "only detects playlist URLs" and that downloading "depends on your own tools," with DRM support listed as unsupported by design. 

That is a smaller claim than most competing extensions make, and it happens to be the accurate one.

The extensions that state their DRM limitation in their own documentation are more trustworthy than the ones that don't mention it at all. Silence on DRM in a product description is not evidence of DRM support. It is usually evidence that nobody tested it.

Command-line tools like yt-dlp paired with ffmpeg sit slightly apart from browser extensions because they need a manifest URL handed to them rather than discovering one automatically inside a page.

Given that URL, they merge segments as reliably as any tool here, but they inherit the exact same wall: a request for an AES-128 key or a signed segment that requires session-bound headers fails identically whether it comes from a browser extension or a terminal command.


Why an Extension Can See the Playlist and Still Fail to Download It

Multiple public bug reports describe the exact same failure shape: the extension detects the stream, starts pulling segments, and then the download stalls or produces a file that will not play.

A GitHub issue thread on the puemos/hls-downloader project documents a user unable to retrieve streams from ESPN and BBC iPlayer, with the downloaded output confirmed corrupted and unplayable once partially retrieved. The user speculated, without confirmation from the maintainer, that encryption on the subscription-gated content was the cause, a plausible but unproven explanation that matches the failure shape documented elsewhere in this article. 

This pattern also shows up outside GitHub. Community forum threads across Reddit and extension review sections describe the same shape repeatedly: a downloader that worked fine on an open stream returns 404 or 403 errors, or drops out entirely, the moment the target stream sits behind session-bound or signed-URL protection.

The consistent explanation across these reports is the same one the GitHub evidence supports: the tools were built for open streams and are hitting a wall, not a bug.

This is not a broken extension. It is a working extension running into infrastructure it was never built to defeat.

The failure has a small number of concrete causes, and they show up consistently across the documented cases:

 1. Key request expiry: The AES-128 decryption key is requested via its own URL, separately from the segments. If that URL requires a session token and the token has expired by the time the extension gets to it, the segments download but stay unreadable ciphertext.
 2. Signed segment URLs timing out: Cloud delivery platforms commonly sign manifest and segment URLs with a short time-to-live. A download that takes longer than that window to complete starts failing requests partway through, which is exactly the "download fails halfway through" pattern reported across forums.
 3. Bitrate-switch playlist changes: Adaptive bitrate streaming means the player, and therefore the manifest, can change mid-playback based on network conditions. A downloader that grabbed the initial manifest may be working from a stale segment list by the time it finishes.
 4. Authenticated session requirements: Some platforms validate the Referer or Origin header, or require cookies tied to the logged-in session, on every segment request. A bare playlist URL opened outside that authenticated context returns authorization errors even though the exact same URL worked fine inside the page.

None of these four causes require DRM to trigger. This is the layer most existing comparison content skips entirely, treating "encrypted" and "DRM-protected" as interchangeable when they describe two different technical arrangements with two very different failure rates.


AES-128 Encryption Stops Casual Downloads, Not Determined Ones

AES-128 encrypts each individual media segment so that a saved .ts or fragmented MP4 file is unreadable without the matching decryption key, which the player fetches separately from its own URL.

This is the baseline most managed video platforms, including AWS MediaConvert, Cloudflare Stream, and most CDN-integrated encoders, ship as a default. Standard HLS AES-128 support is table stakes at this point, not a differentiator.

Where it gets interesting is what happens when a platform layers key rotation and short-lived key URLs on top of the base encryption. Rotating the key every few seconds means an extension that grabbed one key and cached it starts failing partway through the stream, exactly the "download stalls halfway through" failure shape documented above.

Basic AES-128 with a static key is closer to a speed bump. AES-128 with aggressive key rotation and signed key URLs is closer to a locked gate that resets its combination every 30 seconds.

The honest limitation, and the one that separates this from DRM, is that the key is still delivered to the browser in both cases. A user with the technical skill to intercept that key request manually, rather than relying on an off-the-shelf extension, can still decrypt the segments.

This stops the six tools reviewed here. It does not stop a motivated, technically capable individual, and no comparison article should claim otherwise.

If your video platform's security pitch stops at "we use AES-128 encryption" without mentioning key rotation or key URL expiry, ask what happens if someone caches the first key they receive. A static key defeats fewer tools than a rotating one.


Signed URLs and Session Tokens Break the "Paste the Link" Workflow

A signed or tokenized URL attaches a cryptographic signature and an expiry timestamp to the manifest, key, or segment request, so the same URL stops working once that window closes or once it's requested from outside the original session.

This is a separate control from encryption, and it is frequently the one that actually defeats a downloader extension in practice, even on content that isn't DRM-protected at all.

The mechanism is straightforward: instead of a permanent URL anyone can request forever, the platform issues a URL that is only valid for a specific viewer, for a specific window, sometimes bound to a specific IP address or authenticated session.

An extension that detects the manifest, starts fetching segments, and takes long enough to do so (which is common on longer videos, slower connections, or larger extension queues) can run straight into an expired token midway through.

The forum evidence on this is consistent: a request that worked when the page loaded returns a 403 Forbidden or 401 Unauthorized a few minutes later, on the exact same URL, once the signature window closes.

This is also why copying a playlist URL out of DevTools and opening it in a fresh browser tab so often fails even when the original playback worked perfectly. The URL visible in DevTools is not proof the URL is usable outside its original context.

Domain restriction and session binding can reject that exact same request the moment it arrives from a different Referer, a different IP, or outside the authenticated session that generated it.

Signed URL time-to-live windows on major CDN platforms commonly range from a few minutes to under an hour, short enough that most casual "right-click, copy link, paste into downloader" attempts miss the window entirely, especially on anything longer than a short clip.

This is the layer where an outside observer can start telling the difference between a video platform that treats access control as a real feature and one that treats it as a checkbox. Some secure video hosting platforms bind signed URLs to session identity by default rather than offering it as an opt-in add-on. Gumlet and VdoCipher both fall into this category, based on their public documentation as of September 2026.


DRM is the Only Layer Where Documented Failure Was Total

Digital Rights Management, specifically Widevine on Chrome and Android and FairPlay on Safari and iOS, routes decrypted video through a protected hardware or software module that the browser's own JavaScript and extensions cannot reach, which is a fundamentally different architecture from ordinary HLS encryption.

This distinction gets flattened constantly in casual writing about video security, and it's worth being precise about it. AES-128 HLS encryption still delivers the decryption key to the browser, where it is technically interceptable by a sufficiently determined attacker.

DRM does not. The Content Decryption Module handles decryption inside a sandboxed environment that never exposes the clear video frames or the underlying key material to the page, the extension, or the operating system's ordinary screen capture path.

Across every documented case reviewed for this article, that architecture held. sniff-hls's own FAQ states DRM support as an explicit "No" with the explanation that "encrypted DRM content cannot be decrypted."

The puemos/hls-downloader documentation reaches the same wall by omission: no DRM capability is claimed anywhere in it. Neither of these is a marketing claim from a video security vendor with something to sell. These are two independent, unaffiliated open-source projects, maintained by different developers for different purposes, arriving at the same documented conclusion about the same architecture.

If a video platform's security claim rests entirely on encryption, ask what happens when someone gets the key. If it rests on DRM, that question doesn't apply, because the key never leaves a protected environment in the first place. That is the actual decision rule underneath most "is DRM worth it" debates, stripped of the marketing layer usually wrapped around it.

DRM does have real limitations, and a fair comparison has to state them. It does not stop a camera pointed at a screen. It does not, by itself, stop dynamic watermarking from being necessary as a separate, complementary layer, because DRM prevents the file from being extracted but does nothing to trace a copy made through analog capture.

Providers offering multi-DRM support generally pair it with that watermarking layer for exactly this reason. Gumlet's own documentation lists Widevine and FairPlay licensing as part of its multi-DRM offering, alongside dynamic, viewer-specific watermarking and tokenized signed URLs in the same protection configuration.

The practical result of bundling all three layers, encryption, DRM, and watermarking, under one platform is that a course creator or media team does not have to separately evaluate, purchase, and integrate a DRM vendor, a watermarking vendor, and a CDN with signed URL support to get the stack this article describes as necessary. 


Live Streams, Multi-Track Audio, and Ad Insertion Add Real Inconsistency

Live HLS streams behave differently from on-demand video because the manifest itself keeps updating, adding new segments as the broadcast continues.

An extension has to poll and follow that changing manifest rather than working from one static file, and most of the tools reviewed here handle this inconsistently: they record from the moment capture begins rather than from the stream's actual start, and a dropped connection partway through means a partial file with no way to backfill the missing segments.

Adaptive bitrate streaming means the master playlist lists multiple renditions (240p through 4K, typically), and the player picks one based on measured network conditions, not the viewer's explicit choice.

An extension generally captures whatever rendition the player happened to request at that moment rather than letting the user pick freely, which is why a downloaded file sometimes turns out lower-resolution than the source actually supports.

Manually forcing a higher-quality setting in the player before starting capture, where the platform allows that, changes what gets requested and therefore what an extension can grab.

HLS commonly delivers video, audio, and subtitles as entirely separate playlists rather than one combined stream, and an extension that only follows the video rendition can produce a file with no audio track at all, not because anything failed, but because it never fetched the separate audio playlist in the first place.

This is a frequently reported "why does my download have no sound" complaint that has nothing to do with encryption.

Server-side ad insertion (SSAI) splices ad segments directly into the same timeline as the program content, which means a downloader working purely from the manifest can end up capturing ad breaks as part of the "video" with no way to distinguish them from the program itself at the playlist level.

Dynamic watermarking does not block a download at all, and treating it as a download-prevention feature is a category error worth correcting directly. What it does is overlay a viewer-specific identifier, an email address, an account ID, a timestamp, visibly or invisibly onto the frames themselves, so that if a copy does leak, it can be traced back to the session that produced it.

Platforms offering this as a native feature typically let the operator choose between a visible overlay for deterrence, an invisible forensic mark for tracing after the fact, or both applied to the same stream, generated per session rather than as a single static watermark reused across every viewer.

Several managed platforms document this as a deliberate design choice: watermarking is a deterrence and forensic-tracing layer, not a technical barrier, and it is meant to sit alongside encryption or DRM rather than replace either one.


Which Layer Actually Matches Your Risk

Running through six tools and four protection layers is only useful if it turns into a decision you can make about your own video content today. Here is the honest version of that decision.

Choose to treat basic AES-128 encryption as sufficient when your content has low resale or redistribution value and your realistic threat is casual link-sharing, not organized piracy. A rotating key with a short-lived key URL will stop every extension covered in this article.

Choose signed or tokenized URLs, session-bound, as your next layer when your content sits behind a login or a paywall and you need the access control itself to expire, not just the encryption. This is the layer that actually defeats most real-world "I copied the link and it worked five minutes later" attempts.

Choose DRM specifically when the content is paid, premium, or genuinely damaging if it leaks, meaning enterprise training material, licensed media, or a course product whose entire business model depends on access control actually holding. This is the only layer in this review with a documented, unbroken track record against every tool tested.

A platform's documentation is usually explicit about which of these four layers ship as default versus paid add-on, and that distinction is worth reading closely rather than assuming. Gumlet's video protection documentation, for example, lists encryption, tokenized signed URLs, multi-DRM, and dynamic watermarking as configuration options within the same product tier rather than as four separate purchases, which is the structural difference this section has been building toward.

Add dynamic watermarking regardless of which of the above you choose, because it is the only layer that does anything once content escapes through a channel none of the technical controls cover, screen recording or a camera pointed at a monitor.

A meaningful share of managed video hosting platforms now offer some version of all four layers as configuration options rather than separate products.

Gumlet, alongside VdoCipher and SproutVideo, documents multi-DRM (Widevine and FairPlay), tokenized and time-limited signed URLs, and dynamic watermarking as part of the same protection stack, which means the practical question for a buyer isn't whether the feature exists somewhere in a vendor's product line, but whether it's configured as the default or left as an opt-in extra buried in a higher pricing tier.

That configuration detail is worth checking directly against a vendor's own video protection documentation before assuming any platform's baseline setup matches what this article just walked through.

If your current setup only checks one of those four boxes, that's the gap an extension will eventually find before you do.


How This Comparison Was Built

Every capability claim in this article traces to one of four documented sources: each project's own README and feature documentation, its public issue tracker, its changelog, and public failure reports from user communities. 

Where a project's documentation is silent on a capability, that silence is reported as silence, not converted into a claim either way. Nothing here relies on private testing that a reader cannot reproduce by opening the same public pages.


Frequently Asked Questions


1. Can browser extensions download DRM-protected HLS video?

No. Widevine and FairPlay route decrypted frames through a protected module that browser extensions cannot access, which is a different mechanism from the key-based encryption that ordinary HLS uses. 

One of the two independent open-source projects reviewed for this article, sniff-hls, states the DRM limitation directly in its own documentation. The other, puemos/hls-downloader, never claims DRM support anywhere in its documentation, which is the more common pattern among extensions that quietly stop at the DRM wall rather than naming it.

Detecting a DRM-protected manifest and producing a playable file from it are not the same capability, and no extension covered here closes that gap.


2. Does AES-128 encryption stop HLS downloader extensions?

It stops the extensions reviewed for this piece when the key is properly rotated and served through a short-lived, signed key URL. It does not stop a technically skilled individual who intercepts the key request manually, since AES-128 still delivers the decryption key to the browser rather than isolating it in a protected module.

If your platform's only security claim is AES-128 with a static key, that stops fewer download attempts than AES-128 with active key rotation.


3. Why did my HLS download fail halfway through?

Four causes show up consistently across documented failure reports: the decryption key request expiring before the segment fetch completed, a signed URL's time-to-live window closing mid-download, the manifest switching to a different bitrate rendition partway through an adaptive stream, or a segment request failing an authentication check tied to the original session.

A download that stalls partway through is almost always a session or token boundary being hit, not a random or unexplained failure.


4. What's the best HLS downloader extension for Chrome or Firefox?

Among free, actively maintained tools, puemos/hls-downloader is the most capable for unencrypted or lightly encrypted streams, combining automatic playlist detection with in-browser FFmpeg merging across Firefox, Edge, Brave, Arc, and an unofficial Chrome build.

It explicitly does not decrypt DRM-protected content, a limitation stated in its own project documentation rather than left unclear.

Pick this tool if your test case is open or AES-128-only content; it will not help against tokenized or DRM-protected streams regardless of browser.


5. Does dynamic watermarking stop someone from downloading a video?

No, and treating it as a download blocker misunderstands what it does. Watermarking overlays a viewer-specific identifier onto the video frames so a leaked copy can be traced back to the account or session that produced it, functioning as deterrence and forensic evidence rather than a technical barrier.

If your goal is preventing the download itself, watermarking is the wrong tool; pair it with encryption, tokenized access, or DRM, which actually block the retrieval.


6. Is puemos/hls-downloader's DRM limitation documented, or just assumed?

It is assumed, not documented. Nothing in the project's README, features list, or usage instructions claims DRM support of any kind, and no DRM capability is described anywhere in its public documentation.

That silence is consistent with how the tool behaves in practice: the FFmpeg-based merge pipeline handles unencrypted and AES-128 segments, and Widevine or FairPlay content sits entirely outside what an FFmpeg-based approach can touch regardless of what any extension claims.


7. Is there an HLS downloader extension that works on protected streams?

Not against properly configured protection, and that's finding this whole comparison document. 

The most capable free tools handle unencrypted and static-key AES-128 streams; every documented record reviewed here shows them failing against rotating keys, session-bound signed URLs, and DRM, with the most honest projects stating the limitation in their own documentation. 

If you're asking because you publish a video rather than because you're trying to save one, the useful question is the reverse: which of those protection layers your own platform has switched on.


Closing Thoughts

The honest version of this whole review compresses to one sentence: detection was never the hard problem, and every article treating it as one is measuring the wrong thing.

Completion is the actual test, and across every documented case reviewed here, it comes down to a small, specific, checkable list: whether the key rotates, whether the URL expires, and whether decryption happens somewhere a browser extension can reach at all.

That list is also, not coincidentally, a checklist you can run against your own video platform this week rather than waiting to find out the hard way.

Pull up your video vendor's DRM documentation and check which of the four layers, encryption, tokenized access, DRM, and watermarking, are actually switched on by default versus buried behind a higher plan tier.

If the honest answer is one or none, that's a configuration gap worth closing before someone else finds it first, and it's worth putting the same platforms this article named, Gumlet and VdoCipher included, through that same four-layer check: confirm whether encryption uses a rotating or static key, whether signed URLs are session-bound by default, whether multi-DRM covers both Widevine and FairPlay out-of-the-box, and whether watermarking is generated per session or applied as a single static overlay, before deciding where your own content stands.
