Widevine / EME(DRM)
借助 Widevine CDM 播放受 DRM 保护的视频,并与真实 Chrome 的 EME 表面保持一致;CDM 在运行时获取,获取方式与原版 Chrome 完全相同。自 SDK 0.48.0 起,授权版启动默认开启它。
为什么由 SDK 获取
Clearcote 编译时已内置 EME/Widevine 的底层管线(enable_widevine),但不包含 Google 的专有 CDM——Clearcote 不会再分发它,开源构建也不可能附带它。没有 CDM 时,navigator.requestMediaKeySystemAccess('com.widevine.alpha') 会被拒绝(reject),这既是 DRM 无法使用的问题,也是一致性上的破绽(真实 Chrome 会正常 resolve)。所以由 SDK 在你的机器上从 Google 自己的组件服务器获取 CDM;Clearcote 从不分发它。
授权版启动默认开启
当找到许可证密钥(license_key 选项、CLEARCOTE_LICENSE_KEY 或 ~/.clearcote/license.key)且浏览器为授权版 154 r32 或更新版本时,每次本地启动都会开启 Widevine:launch()、持久化上下文、serve()、Python 异步 API 以及 .NET 的启动方式。无需传入任何参数。首次启动会下载 CDM;之后的启动立即使用缓存的副本。
- 关闭它:使用
widevine=False(Node 为{ widevine: false },.NET 为Widevine = false)或CLEARCOTE_WIDEVINE=0。 - 没有密钥时开启它(开源版构建):使用
widevine=True或CLEARCOTE_WIDEVINE=1。与之前一样,没有密钥的启动除非你主动要求,否则不带 Widevine。 - 不会阻塞启动。默认最多等待 CDM 15 秒(
CLEARCOTE_WIDEVINE_TIMEOUT_SECONDS);如果无法加载,浏览器会在没有它的情况下启动,SDK 只警告一次。
python
from clearcote import launch
browser = launch() # licence key found: Widevine is on
page = browser.new_page()
page.goto("https://your-drm-site.example")
# navigator.requestMediaKeySystemAccess('com.widevine.alpha') resolves
plain = launch(widevine=False) # or CLEARCOTE_WIDEVINE=0javascript
import { launch, fetchWidevine } from "clearcote";
// optional: pre-fetch the CDM ahead of time (cached under ~/.clearcote/WidevineCdm)
await fetchWidevine();
const browser = await launch(); // licence key found: Widevine is on
const plain = await launch({ widevine: false }); // or CLEARCOTE_WIDEVINE=0工作原理与限制
- 只获取一次,然后缓存。CDM 从 Google 的组件服务器下载,经过 SHA-256 校验(缺少哈希值时会拒绝使用:它是一个原生库),并缓存在
~/.clearcote/WidevineCdm下(可用CLEARCOTE_WIDEVINE_DIR更改位置)。同时运行的多个启动共用一次下载。可通过fetch_widevine()/fetchWidevine()预先获取。 - 每天一次版本检查。过去 24 小时内检查过的缓存 CDM 会直接使用,完全不联网;超过这个时间后,会向 Google 的更新服务器发起一次版本检查,该请求直接从本机发出,不经过你的代理。离线时使用缓存的 CDM。
- 授权版 154 r32 及更新版本:引擎支持
--widevine-cdm-path,这是一个 CDM 目录,引擎会在启动时把它注册到每个 profile 中,包括无痕 profile 和 Playwright 的一次性 profile。 从 SDK 0.41.0 起,带widevine的启动会替你传入该开关;从 0.48.0 起,每次授权版启动都会这样做。 较旧的构建需要 profile:在同步版launch()或持久化上下文中使用widevine=True,会把 CDM 写入 profile,并让组件更新器注册它。你自己在args中传入的--widevine-cdm-path=<dir>始终优先。 - Python、Node 和 .NET(.NET 自 0.48.0 起:
LaunchOptions.Widevine和Widevine类)。支持 Windows 和 Linux。 - Docker:官方镜像在 Windows 身份画像(persona)下默认开启此功能(设置
CC_WIDEVINE=0可关闭)。托管浏览器自带 Widevine。 - 支持软件级安全(L3)播放;硬件级安全(L1)不在支持范围内。
DRM 支持也是一致身份的组成部分:真实的 Chrome 能响应 Widevine 查询,所以无法响应的身份画像就是一个破绽——而默认身份画像呈现为 Google Chrome,它在所有桌面平台上都自带 CDM。参见检测原理。