跳到正文

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=0
javascript
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。参见检测原理。