Widevine / EME (DRM)
Reproduce video protegido con DRM (y haz que la superficie EME coincida con la de un Chrome real) activando el CDM de Widevine, que se descarga en tiempo de ejecución exactamente como lo recibe un Chrome estándar.
Por qué es opcional
Clearcote trae compilada la infraestructura de EME/Widevine (enable_widevine), pero no el CDM propietario de Google, que Clearcote no redistribuye y que tampoco podría incluirse en el build open source. Sin un CDM, navigator.requestMediaKeySystemAccess('com.widevine.alpha') se rechaza, lo que es a la vez un problema de DRM roto y una señal delatora de coherencia (en un Chrome real se resuelve). Por eso eres tú quien inicia la descarga: Clearcote nunca distribuye el CDM.
Actívalo
Pasa widevine. El SDK descarga el CDM una vez desde el servidor de componentes de Google, verifica su SHA-256, lo instala en el perfil y lo activa; a partir de ahí, las páginas con DRM se reproducen. Funciona con launch_persistent_context y, desde el SDK 0.23, con launch() de Python, que ahora se ejecuta sobre un perfil desechable en lugar de en modo incógnito. En Node, usa launchPersistentContext (el tipo de TypeScript de launch() todavía no declara widevine). Disponible para Python & Node; el SDK de .NET todavía no tiene opción de 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 });Funcionamiento & límites
- Opcional y activado por el usuario: el CDM se descarga una vez desde el servidor de componentes de Google, se verifica con SHA-256 (si falta el hash, se rechaza: es una DLL nativa) y se guarda en caché en
~/.clearcote/WidevineCdm(puedes moverlo conCLEARCOTE_WIDEVINE_DIR). Descárgalo por adelantado confetch_widevine()/fetchWidevine(). Cada lanzamiento conwidevinetambién hace una comprobación de versión contra el servidor de actualizaciones de Google, directamente desde esta máquina y no a través de tu proxy. - Se necesita un perfil: el CDM vive en el perfil, así que funciona con el
launch()síncrono y conlaunch_persistent_context, pero no con los lanzamientos en incógnito (ephemeral_profile=False, ellaunch()asíncrono). El SDK vuelve a habilitar el component updater (y, en Windows, fuerza un escaneo de actualización rápida) para que el motor registre el CDM. Funciona en Windows y Linux. - Docker: la imagen oficial lo activa por defecto para una persona de Windows (
CC_WIDEVINE=0para desactivarlo). - Reproducción Software-secure (L3); Hardware-secure (L1) queda fuera del alcance.
- Best-effort: si no se puede descargar el CDM o falla la comprobación de versión (por ejemplo, sin conexión), el lanzamiento continúa sin DRM en lugar de fallar.
El soporte de DRM es una pieza más de una identidad coherente: un Chrome real responde a la consulta de Widevine, así que una persona que no puede hacerlo se delata; y la persona por defecto se presenta como Google Chrome, que incluye el CDM en todas las plataformas de escritorio. Consulta Cómo funciona la detección.