Skip to content
Media · EME · Widevine L3

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 resolves

Highlights

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 plans

FAQ

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

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.