Widevine / EME (DRM)
Reproduza vídeo protegido por DRM (e tenha a mesma superfície EME de um Chrome real) ativando o CDM do Widevine, baixado em tempo de execução exatamente do jeito que um Chrome padrão o recebe.
Por que é opt-in
O Clearcote vem com a infraestrutura de EME/Widevine compilada (enable_widevine), mas não com o CDM proprietário do Google, que o Clearcote não redistribui — e que não poderia fazer parte do build de código aberto. Sem um CDM, a chamada navigator.requestMediaKeySystemAccess('com.widevine.alpha') é rejeitada, o que é ao mesmo tempo um problema de DRM quebrado e um indício de incoerência (um Chrome real a resolve). Por isso é você quem dispara o download — o Clearcote nunca distribui o CDM.
Como ativar
Passe widevine. O SDK baixa o CDM uma única vez do próprio servidor de componentes do Google, verifica o SHA-256, instala-o no perfil e o ativa — e as páginas com DRM passam a tocar. Funciona com launch_persistent_context e, desde o SDK 0.23, com o launch() do Python, que agora roda num perfil descartável em vez do modo anônimo. No Node, use launchPersistentContext (o tipo TypeScript de launch() ainda não declara widevine). Python & Node; o SDK .NET ainda não tem opção 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 });Como funciona & limites
- Opt-in, disparado pelo usuário — o CDM é baixado uma única vez do servidor de componentes do Google, tem o SHA-256 verificado (um hash ausente é recusado — é uma DLL nativa) e fica em cache em
~/.clearcote/WidevineCdm(mude o local comCLEARCOTE_WIDEVINE_DIR). Faça o download antecipado comfetch_widevine()/fetchWidevine(). Cada inicialização comwidevinetambém faz uma verificação de versão no servidor de atualização do Google, direto desta máquina, e não pelo seu proxy. - É preciso um perfil — o CDM fica no perfil, então funciona com o
launch()síncrono e comlaunch_persistent_context, mas não com as inicializações em modo anônimo (ephemeral_profile=False, olaunch()assíncrono). O SDK reativa o atualizador de componentes (e, no Windows, força uma varredura de atualização rápida) para que o motor registre o CDM. Funciona no Windows e no Linux. - Docker — a imagem oficial o ativa por padrão para uma persona Windows (
CC_WIDEVINE=0para desativar). - Reprodução com segurança por software (L3); a segurança por hardware (L1) está fora do escopo.
- Melhor esforço — se não for possível baixar o CDM ou se a verificação de versão falhar (sem conexão, por exemplo), a inicialização segue sem DRM em vez de falhar.
O suporte a DRM é mais uma peça de uma identidade coerente: um Chrome real responde à consulta do Widevine, então uma persona que não consegue responder é um indício — e a persona padrão se apresenta como Google Chrome, que traz o CDM em todas as plataformas desktop. Veja Como a detecção funciona.