Widevine DRM for automated Chromium
Open-source Chromium builds ship without the Widevine CDM, so DRM video fails and requestMediaKeySystemAccess('com.widevine.alpha') rejects, which a real Chrome never does. Pass widevine on a persistent context and the SDK fetches the CDM from Google's component server, checks it and switches it on.
In every tier, opt-in.
One option on a persistent context
from clearcote import launch_persistent_context
ctx = launch_persistent_context("./profile-drm", widevine=True) # fetch, verify, enable
page = ctx.pages[0] if ctx.pages else ctx.new_page()
page.goto("https://your-drm-site.example")
# navigator.requestMediaKeySystemAccess('com.widevine.alpha') now resolvesHighlights
Fetched the way Chrome gets it
The CDM comes from Google's own component server, once, the way stock Chrome receives it. Clearcote never distributes it.
Verified before use
The download is SHA-256 checked, and a missing hash is refused outright, because the CDM is a native library.
Cached and reusable
Stored under ~/.clearcote/WidevineCdm. Fetch it ahead of time with fetchWidevine() so launches never wait.
A coherent EME answer
A real Chrome resolves the Widevine key-system query. With the CDM in place, so does Clearcote.
Fails soft
If the CDM can't be fetched, the launch carries on without DRM instead of failing.
L3 playback
Software-secure (L3) playback. Hardware-secure L1 is out of scope.
Why it's opt-in
Clearcote is open source, and Google's CDM is a closed binary that can't be part of an open-source package. So the browser ships with the EME plumbing compiled in, but not the CDM, and you trigger the download yourself.
The CDM lives in the profile, so use launch_persistent_context rather than launch(). The SDK re-enables the component updater and forces a quick update scan, so the engine registers the CDM before your first page.
It matters beyond video, too. Whether the Widevine key system resolves is one more thing a page can read, and a Chrome that can't answer it doesn't look like Chrome.
What people use it for
Streaming QA
Test playback, entitlements and player UI on your own DRM-protected catalogue.
Media monitoring
Automated checks on pages that play protected video.
A complete Chrome persona
Keep the EME answer consistent with a real Chrome, even when you never play a video.
Clearcote is built for privacy, testing, research and lawful automation. You're responsible for how you use it and for following the terms of the sites you visit.
Which plan includes it
In every tier, opt-in, with software-secure (L3) playback.
Compare plansFAQ
How do I enable Widevine in Playwright?
Use the Clearcote SDK's persistent context with widevine: true (Python: widevine=True). It downloads the CDM once, verifies it, seeds it into the profile and enables it.
Why doesn't open-source Chromium play DRM video?
The Widevine CDM is proprietary and can't be shipped in an open-source build, so without it, DRM playback and the EME key-system query both fail.
Does Clearcote include the CDM?
No. The CDM is fetched from Google's component server when you opt in, the same way stock Chrome receives it. Clearcote never distributes it.
Which security level is supported?
Software-secure L3. Hardware-secure L1, which some services require for high resolutions, is out of scope.
Do I need a persistent profile?
Yes. The CDM is installed into the profile, so it needs launch_persistent_context / launchPersistentContext, not the incognito launch().
Go deeper in the docs
Related features
Load unpacked Manifest V2 and V3 extensions at launch, headed or headless, on Windows and Linux.
A drop-in Chromium for Playwright and Puppeteer: one import change in Python, Node or .NET, with the browser downloaded and SHA-256 verified for you.
Canvas, WebGL, WebGPU, audio, fonts, screen, hardware and locale set in the C++ engine from one seed, so every surface agrees with every other.
One seed per account: the same device every session, a different one for the next account, with cookies and storage that persist between runs.
Related reading
Try Clearcote
Open source, a drop-in for Playwright & Puppeteer, and coherent down to the TLS handshake.
Free for one browser with GitHub. No card.