I Built a Chrome Extension That Downloads Videos from Any Website
There's a specific kind of frustration that comes from watching a video you want to save and knowing there's no way to do it.
Not YouTube — YouTube has plenty of tools, legal or otherwise, that everyone knows about. I mean the sports highlights that disappear from a broadcaster's site after 48 hours. The conference talk someone posted on their company blog that will get taken down when they rebrand. The short tutorial buried inside a marketing page with no embed option. The livestream clip that plays perfectly in your browser but has no download button in sight.
I've hit this wall dozens of times. The usual fixes — right-click, inspect element, hunt for the .mp4 URL, paste it into curl — work sometimes. But it's tedious, it breaks on streams, and it requires knowing exactly what you're looking for in a wall of network requests.
So I built Video Grabber, a Chrome extension that handles this automatically.
What it actually does
Video Grabber sits in your browser and watches for video content as pages load. The moment it detects something downloadable, it shows a badge on the extension icon. Click the popup, and you get a list of everything it found on the current page — direct links, streams, embedded players.
From there you can:
- Download the full video in whatever resolution is available
- Create a clip by setting a custom start and end time, so you're not downloading a two-hour broadcast to get a 90-second highlight
- Rename the file before it saves, so your downloads folder doesn't fill up with
video_1920x1080_abc123.mp4filenames - Pause and resume downloads without losing progress
- Set a default folder so you don't get asked every single time
It works on news sites, sports broadcasters, educational platforms, social media, and most other sites that embed video. The one major exception is YouTube, for reasons I'll get into.
How the detection works
The core of the extension is a content script that runs in the context of every page you visit. It does two things simultaneously.
First, it monitors the page's media elements directly. Any <video> tag that appears in the DOM gets tracked. This catches the obvious case — a site that embeds a plain MP4 or WebM file in a video tag. The src attribute (or the src of its <source> children) gives you the URL directly.
Second, it hooks into the browser's network request layer using the webRequest API. This catches streams. HLS (HTTP Live Streaming) and DASH streams don't work like normal files — they're broken into small segments, and the browser fetches each one individually as you watch. What the extension actually captures is the .m3u8 manifest URL, which is the index file that tells the player where to find all the segments. With that URL, you can reconstruct and download the full stream.
The tricky part is noise. A typical news site might make 200+ network requests just loading the page. Most of those are tracking pixels, analytics calls, CDN assets, and ad requests. The extension filters by MIME type and URL pattern to surface only the requests that actually look like video.
Why YouTube doesn't work
YouTube uses a system called googlevideo.com for its actual video delivery, but the URLs are signed and tied to your session. They expire quickly and can't be easily shared or re-fetched outside the browser. More importantly, YouTube actively detects and blocks the interception patterns that video downloaders use.
I could have tried to work around this, but I decided not to. There are already plenty of tools for YouTube specifically, and fighting an arms race with Google's anti-scraping infrastructure wasn't the point of this project. Video Grabber is for all the other video on the internet — the stuff with no dedicated tool.
The clip feature took longer than everything else
The detection logic and download manager together took maybe a week. The clip trimmer took another two.
The problem is that video files aren't designed for random-access editing. To cut a video from 1:23 to 2:47 without re-encoding the whole thing, you need to find the keyframe closest to your start point, because video compression works by storing full frames at intervals and encoding everything in between as diffs from the previous frame. If you cut at a non-keyframe position, you either get a corrupt file or you have to decode and re-encode from the nearest keyframe, which is slow and lossy.
For a browser extension, full re-encoding isn't practical — you'd need either a native binary (which requires extra permissions) or a WebAssembly port of something like FFmpeg (which adds several MB to the extension size and is slow in practice). I ended up using a keyframe-aware approach that seeks to the nearest keyframe before the requested start point. This means the actual clip might start a second or two earlier than you specified, but it's fast and lossless.
It's a real limitation. If you need frame-perfect cuts, you need a proper video editor. But for "give me this 90-second segment, roughly," it works well.
What I got wrong on the first version
The first build had a different architecture. Instead of monitoring network requests from the content script, I was trying to detect videos entirely from the DOM and from URL patterns in the page's HTML. This worked for basic cases but missed streams completely, because HLS manifests get fetched dynamically by the player library, not linked in the HTML.
I also initially stored all detected video URLs in a content script variable, which meant they got wiped every time the page navigated or the extension popup closed. Switching to a persistent background service worker with a proper message-passing architecture between the content script and the popup fixed this.
The third mistake was making the download start immediately when you clicked an item in the popup. People want to rename the file first, pick a resolution, decide whether to clip. The current version shows a modal with options before the download starts.
Privacy
The extension doesn't make any network requests except to download the videos you explicitly select. No telemetry, no analytics, no calls to any external server. All processing happens locally in the browser. The Chrome Web Store listing confirms this — you can check the privacy disclosure in the store.
I'm aware that video downloaders are a category that sometimes attracts privacy concerns (some tools phone home with lists of URLs you've visited). Video Grabber doesn't do this and never will.
It's free
Video Grabber is free on the Chrome Web Store. There's an optional pay-what-you-want license if you want to support the project, but there's no paywall, no feature restriction, no nagging.
If you're interested in the product listing with the full feature breakdown, that's on my products page.
What's next
A few things I'm thinking about:
- Firefox support. The WebExtensions API is largely compatible between Chrome and Firefox, but the manifest format and some of the permission declarations differ. The port isn't a huge lift but I haven't prioritized it yet.
- Better stream support. HLS detection is solid, but DASH streams (used by some broadcasters and video platforms) are handled more inconsistently. I want to improve this.
- Batch downloads. If a page has multiple videos (think: a gallery, a playlist page), currently you have to download them one at a time. A queue with batch-download support would make this much less tedious.
If you try it and run into something broken or a site it doesn't handle, let me know via the support tab on the Chrome Web Store or through the contact form on my site. Real-world feedback is genuinely how this kind of tool improves.
Work with me
Need a senior web developer?
151 projects delivered. 5★ rating. UK & EU businesses. I build custom tools, AI automation, and business systems — one-time payment, you own the code.