Pular para o conteúdo

Widevine / EME (DRM)

Reproduza vídeo protegido por DRM, e tenha a mesma superfície EME de um Chrome real, com o CDM do Widevine, baixado em tempo de execução exatamente como um Chrome padrão o recebe. Desde o SDK 0.48.0, ele vem ativado por padrão nas inicializações licenciadas.

Por que o SDK o baixa

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 ser incluído no build open source. Sem um CDM, navigator.requestMediaKeySystemAccess('com.widevine.alpha') é rejeitado, o que é ao mesmo tempo um problema de DRM quebrado e um indício de incoerência (um Chrome real resolve essa chamada). Por isso o SDK baixa o CDM na sua máquina, do próprio servidor de componentes do Google; o Clearcote nunca o distribui.

Ativado por padrão nas inicializações licenciadas

Quando uma chave de licença é encontrada (a opção license_key, CLEARCOTE_LICENSE_KEY ou ~/.clearcote/license.key) e o navegador é o licenciado 154 r32 ou mais recente, toda inicialização local ativa o Widevine: launch(), contextos persistentes, serve(), a API assíncrona do Python e as inicializações do .NET. Não é preciso passar nada. A primeira inicialização baixa o CDM; as seguintes usam a cópia em cache na hora.

  • Desative-o com widevine=False (Node { widevine: false }, .NET Widevine = false) ou CLEARCOTE_WIDEVINE=0.
  • Ative-o sem chave (o build aberto) com widevine=True ou CLEARCOTE_WIDEVINE=1. Uma inicialização sem chave continua sem Widevine, a menos que você peça, como antes.
  • Nunca impede uma inicialização. O padrão espera no máximo 15 segundos pelo CDM (CLEARCOTE_WIDEVINE_TIMEOUT_SECONDS); se ele não puder ser carregado, o navegador inicia sem ele e o SDK avisa uma vez.
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

Como funciona e limites

  • Baixado uma vez, em cache. O CDM é baixado do servidor de componentes do Google, verificado por SHA-256 (um hash ausente é recusado: é uma biblioteca nativa) e guardado em cache em ~/.clearcote/WidevineCdm (mude o local com CLEARCOTE_WIDEVINE_DIR). Inicializações que rodam ao mesmo tempo compartilham um único download. Baixe antecipadamente com fetch_widevine() / fetchWidevine().
  • Uma verificação de versão por dia. Um CDM em cache verificado nas últimas 24 horas é usado sem nenhum acesso à rede; depois disso, uma verificação de versão vai para o servidor de atualização do Google, diretamente desta máquina, e não pelo seu proxy. Sem conexão, o CDM em cache é usado.
  • Licenciado 154 r32 e mais recentes: o motor aceita --widevine-cdm-path, um diretório de CDM que ele registra na inicialização em todos os perfis, incluindo os anônimos e os descartáveis do Playwright. A partir do SDK 0.41.0, uma inicialização com widevine o passa para você, e a partir do 0.48.0 toda inicialização licenciada faz isso. Builds mais antigos precisam de um perfil: widevine=True com o launch() síncrono ou um contexto persistente coloca o CDM nele e deixa o atualizador de componentes registrá-lo. Um --widevine-cdm-path=<dir> seu em args sempre prevalece.
  • Python, Node e .NET (.NET desde o 0.48.0: LaunchOptions.Widevine e a classe Widevine). Funciona no Windows e no Linux.
  • Docker: a imagem oficial o ativa por padrão para uma persona Windows (CC_WIDEVINE=0 para desativar). Os navegadores hospedados trazem o seu próprio.
  • Reprodução com segurança por software (L3); a segurança por hardware (L1) está fora do escopo.
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.