NSFWDL Video Downloader (userscript)
Download adult videos as MP4 without leaving the page. Open the panel,
pick a real quality with its file size, watch the live progress, and the
file goes straight to your browser's downloads. Powered by
NSFWDL, the free downloader with no pop-ups.
Install
- Install Tampermonkey or
Violentmonkey. On Android, use them
in Firefox (or Tampermonkey in Microsoft Edge). On iPhone and iPad, use
Safari with the free Userscripts app or Stay.
- Install the script from Sleazy Fork
or a mirror:
What you get
- In-page downloads. A small Download button sits in the corner of a
video page. Choose a quality and the MP4 is saved without opening a tab.
- Real formats only. Every quality comes from the actual video, with
NSFWDL's file size (exact or estimated, marked with ~). Nothing invented.
- Live progress. Waiting, preparing (with a real percentage when the
size is known), handed to your browser, saved. You can close the panel
while it runs: the button shows the progress.
- Buttons on the player and on thumbnails (desktop). Point at the video
you're watching and press ⬇ Download right on the player; hover a video on
a listing, search or profile page and press ⬇ NSFWDL without opening it.
- RedGifs feeds too: scroll the home feed, a niche, a profile or the
clips under a video, and the button takes the clip on screen (the page
link doesn't change there, so the script reads which clip is playing).
- xHamster mirrors too: the button also appears on video pages of
xHamster's mirror domains (xhspot.com, xhaccess.com and the like).
- Preferred quality. Set Best, 1080p, 720p, 480p or Smallest in ⚙
Settings, and one click on Download starts it straight away.
- Several downloads at once, each with its own progress row. Start as
many as you like: three run at a time (four with Supporter) and the rest wait their turn in the
panel, then start on their own.
- Select videos (bulk download, desktop). On a listing, search or
profile page, press ☑ Select videos, click the thumbnails you want (or
Select all on this page) and download them in one go, in the quality you
choose. Videos you saved before are skipped. Free: 5 per batch, one at a
time; Supporter: up to 100 per batch, 3 at a time. When a site is busy on
NSFWDL the batch slows down by itself, so single downloads always go first.
Your browser may ask once to allow several downloads from the site.
- Already downloaded? Videos you saved get a green outline on their
thumbnails, "✓ Downloaded" on the button, and "✓ Again" on the hover
button. The list stays in your userscript manager; turn it off or clear it
in ⚙ Settings.
- Works in a background tab. The tab title shows the progress
("⬇ 45% · …"), and a notification tells you when a file is saved, or when
it is ready and needs one tap.
- Shortcut: Alt+Shift+D opens the downloader on a video page.
- Minimize to a small round button, left or right corner; both are
remembered.
- Falls back to opening the video in NSFWDL in a new tab when your
userscript manager doesn't provide
GM_xmlhttpRequest.
Supported sites
Each link opens that site's downloader on nsfwdl.com, which works without
the script too.
- PornHub (videos, Shorties, clips and GIFs)
- xHamster (videos and Shorts, and its mirror domains)
- XVideos
- XNXX
- RedGifs
- Eporner
- SpankBang
- Erome
- YouJizz
- PornTop
- RedTube
- YouPorn
- TNAFlix
- Porntrex
- NoodleMagazine
- The TXXX network (TXXX, Upornia, VJAV, HClips, HDZog, HotMovs, InPorn,
VoyeurHit, VXXX and more)
- Nuvid
- Rule34Video
Any other link: the universal downloader. Full
list: supported sites.
Free and Supporter
Downloads are free, up to 30 a day in each browser. 720p and lower are always
free, and 1080p is free for the first 10 downloads of the day. More a day (300),
more 1080p, qualities above 1440p and files over 500 MB need a paid
NSFWDL Supporter key (passes from $2); the panel
shows those qualities with a 🔒, says why, and never starts them for a free session. This is
declared as @antifeature payment. Have a key? Enter it once in the panel's
⚙ Settings → Supporter key, and the locked qualities unlock in the script.
Activated it on nsfwdl.com in the same browser? With most managers the
script picks it up by itself (since 2.7.1).
Privacy and permissions
@grant GM_xmlhttpRequest (+ GM.xmlHttpRequest) with
@connect nsfwdl.com and @connect dl.nsfwdl.com only: requests go to
NSFWDL and nowhere else.
- Nothing is sent until you click. Hovering the player or thumbnails, or browsing
sends nothing. When you open the panel, the video's public page link goes
to nsfwdl.com to list its formats; choosing one starts the job and
follows its status. The requests carry a fixed
/userscript marker so
NSFWDL can count downloads made from the script. Like any visit, they
reach NSFWDL from your IP address.
- Supporter key (optional): many userscript managers don't send nsfwdl.com
cookies, so a key entered in Settings is exchanged once on nsfwdl.com for
a session token. The script stores that token (never the key) in your
userscript manager and sends it only to nsfwdl.com, in an
X-NSFWDL-Supporter header. "Remove from this browser" ends the session.
- If your manager does send nsfwdl.com cookies and you activated a key on nsfwdl.com in that browser, the script
asks nsfwdl.com for a session of its own (
POST /api/supporter/link):
only while it has none, at most every 20 seconds when you open the panel
or come back to the tab. "Remove from this browser" also turns this off
until you enter a key in the script again.
- Free downloads per day count per browser, not per IP address, so people
sharing a VPN or mobile-network address don't use up each other's. For
that the script makes one random value, keeps it in your userscript
manager and sends it only to nsfwdl.com, in an
X-NSFWDL-Client header.
It is not derived from anything about you and not linked to an account or
your IP.
- Apart from that random value, the script stores only its settings, whether you minimized the button, how
many files it saved (for one rating reminder) and, unless you turn it off,
the IDs of the videos you saved (to mark them), with
GM_getValue/GM_setValue. None of it is ever sent anywhere.
@grant GM_notification shows a notification when a download finishes
while the tab is in the background. Nothing else.
- No analytics, ads or tracking code in the script. The interface is built
from text nodes only (no
innerHTML), inside a Shadow DOM.
- Links use
noopener, noreferrer and referrerPolicy="no-referrer".
The script doesn't bypass logins, private videos or paywalls. Download only
videos you are allowed to save.
Development (in the NSFWDL repository)
node --test tests/frontend/userscript.test.mjs # logic and header limits
NODE_PATH=/path/to/node_modules CHROME_BIN=/usr/bin/google-chrome \
node tools/userscript/browser.test.cjs # mocked browser checks
The browser suite answers every page and NSFWDL API call in-process; it
never contacts an adult site or NSFWDL. The site list is generated from
NSFWDL's source registry (app/sources/registry.py), and
tests/test_seo_master.py::test_userscript_covers_exactly_the_registry_sources_and_routes
fails when they drift apart. Bump @version on every change, then run
tools/userscript/publish.sh. It copies the script, README, listing text
and browser test to the public repository and pushes it to GitHub (which
Sleazy Fork syncs from) and GitLab.
License
MIT