Widevine / EME (DRM)
Phát video được bảo vệ bằng DRM (và khớp với bề mặt EME của một Chrome thật) bằng cách tự bật Widevine CDM — CDM được tải về lúc chạy, đúng theo cách một Chrome gốc nhận nó.
Vì sao phải tự bật
Clearcote được build sẵn phần hạ tầng EME/Widevine (enable_widevine) nhưng không kèm CDM độc quyền của Google — thứ mà Clearcote không phân phối lại, và cũng không thể đưa vào bản build mã nguồn mở. Không có CDM, navigator.requestMediaKeySystemAccess('com.widevine.alpha') sẽ bị reject, vừa là lỗi DRM không chạy được vừa là một dấu hiệu lộ về tính nhất quán (Chrome thật sẽ resolve lời gọi này). Vì vậy chính bạn là người kích hoạt việc tải về — Clearcote không bao giờ phân phối CDM.
Bật Widevine
Truyền widevine. SDK tải CDM một lần từ component server của chính Google, kiểm tra SHA-256, nạp nó vào profile rồi bật lên — sau đó các trang DRM sẽ phát được. Tùy chọn này dùng được với launch_persistent_context và, từ SDK 0.23, với launch() của Python, vốn nay chạy trên một profile dùng một lần thay vì incognito. Trên Node, hãy dùng launchPersistentContext (kiểu TypeScript của launch() chưa khai báo widevine). Hỗ trợ Python & Node; SDK .NET hiện chưa có tùy chọn Widevine.
from clearcote import launch_persistent_context
ctx = launch_persistent_context("./profile-drm", widevine=True) # fetch + seed + enable the CDM
page = ctx.pages[0] if ctx.pages else ctx.new_page()
page.goto("https://your-drm-site.example")
# navigator.requestMediaKeySystemAccess('com.widevine.alpha') now resolvesimport { launchPersistentContext, fetchWidevine } from "clearcote";
// optional: pre-fetch the CDM ahead of time (cached under ~/.clearcote/WidevineCdm)
await fetchWidevine();
const ctx = await launchPersistentContext("./profile-drm", { widevine: true });Cách hoạt động & giới hạn
- Tự bật, do người dùng kích hoạt — CDM được tải một lần từ component server của Google, kiểm tra SHA-256 (thiếu hash là bị từ chối — vì đây là một DLL native), và được cache tại
~/.clearcote/WidevineCdm(đổi vị trí bằngCLEARCOTE_WIDEVINE_DIR). Tải trước bằngfetch_widevine()/fetchWidevine(). Mỗi lần khởi chạy vớiwidevinecũng thực hiện một lần kiểm tra phiên bản tới update server của Google, trực tiếp từ máy này chứ không qua proxy của bạn. - Bắt buộc phải có profile — CDM nằm trong profile, nên tính năng này hoạt động với
launch()bản sync vàlaunch_persistent_context, nhưng không hoạt động với các kiểu khởi chạy incognito (ephemeral_profile=False,launch()bản async). SDK bỏ chặn component updater (và trên Windows thì ép chạy một lượt quét cập nhật nhanh) để engine đăng ký CDM. Hoạt động trên Windows và Linux. - Docker — image chính thức bật sẵn tính năng này cho persona Windows (đặt
CC_WIDEVINE=0để tắt). - Phát lại ở mức bảo mật phần mềm (L3); bảo mật phần cứng (L1) nằm ngoài phạm vi hỗ trợ.
- Best-effort — nếu không tải được CDM hoặc việc kiểm tra phiên bản thất bại (chẳng hạn khi offline), trình duyệt vẫn khởi chạy nhưng không có DRM, thay vì báo lỗi.
Hỗ trợ DRM là thêm một mảnh ghép của một danh tính nhất quán: Chrome thật trả lời truy vấn Widevine, nên một persona không trả lời được chính là một dấu hiệu lộ — và persona mặc định tự nhận là Google Chrome, bản vốn có sẵn CDM trên mọi nền tảng desktop. Xem Cơ chế phát hiện hoạt động ra sao.