Widevine / EME (DRM)
Lisez des vidéos protégées par DRM, et reproduisez la surface EME d’un vrai Chrome, avec le CDM Widevine, récupéré à l’exécution exactement de la même façon qu’un Chrome standard le reçoit. Depuis le SDK 0.48.0, il est activé par défaut pour les lancements sous licence.
Pourquoi le SDK le récupère
Clearcote embarque la plomberie EME/Widevine, compilée dans le binaire (enable_widevine), mais pas le CDM propriétaire de Google, que Clearcote ne redistribue pas — et qui ne pourrait pas être livré dans le build open source. Sans CDM, navigator.requestMediaKeySystemAccess('com.widevine.alpha') est rejeté : c’est à la fois un problème de DRM cassé et un indice d’incohérence (un vrai Chrome le résout). Le SDK récupère donc le CDM sur votre machine, depuis le serveur de composants de Google lui-même ; Clearcote ne le distribue jamais.
Activé par défaut pour les lancements sous licence
Quand une clé de licence est trouvée (l’option license_key, CLEARCOTE_LICENSE_KEY ou ~/.clearcote/license.key) et que le navigateur est un build sous licence 154 r32 ou plus récent, chaque lancement local active Widevine : launch(), les contextes persistants, serve(), l’API asynchrone Python et les lancements .NET. Rien à passer. Le premier lancement télécharge le CDM ; les suivants utilisent immédiatement la copie en cache.
- Désactivez-le avec
widevine=False(Node{ widevine: false }, .NETWidevine = false) ouCLEARCOTE_WIDEVINE=0. - Activez-le sans clé (le build ouvert) avec
widevine=TrueouCLEARCOTE_WIDEVINE=1. Un lancement sans clé reste sans Widevine sauf si vous le demandez, comme avant. - Ne bloque jamais un lancement. Par défaut, le SDK attend le CDM au plus 15 secondes (
CLEARCOTE_WIDEVINE_TIMEOUT_SECONDS) ; s’il ne peut pas être chargé, le navigateur démarre sans lui et le SDK affiche un avertissement une fois.
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=0import { 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=0Fonctionnement & limites
- Récupéré une fois, mis en cache. Le CDM est téléchargé depuis le serveur de composants de Google, vérifié par SHA-256 (un hash manquant est refusé : il s’agit d’une bibliothèque native), puis mis en cache sous
~/.clearcote/WidevineCdm(déplacez-le avecCLEARCOTE_WIDEVINE_DIR). Les lancements exécutés en même temps partagent un seul téléchargement. Pré-téléchargez-le avecfetch_widevine()/fetchWidevine(). - Une vérification de version par jour. Un CDM en cache vérifié au cours des dernières 24 heures est utilisé sans aucun accès réseau ; au-delà, une vérification de version part vers le serveur de mises à jour de Google, directement depuis cette machine et non via votre proxy. Hors ligne, le CDM en cache est utilisé.
- Build sous licence 154 r32 et plus récent : le moteur accepte
--widevine-cdm-path, un répertoire de CDM qu’il enregistre au démarrage dans chaque profil, y compris les profils incognito et les profils jetables de Playwright. Depuis le SDK 0.41.0, un lancementwidevinele passe pour vous, et depuis la 0.48.0, chaque lancement sous licence le fait. Les builds plus anciens ont besoin d’un profil :widevine=Trueavec lelaunch()synchrone ou un contexte persistant installe le CDM dans ce profil et laisse le component updater l’enregistrer. Un--widevine-cdm-path=<dir>que vous passez vous-même dansargsa toujours la priorité. - Python, Node et .NET (.NET depuis la 0.48.0 :
LaunchOptions.Widevineet la classeWidevine). Fonctionne sous Windows et Linux. - Docker : l’image officielle l’active par défaut pour une persona Windows (
CC_WIDEVINE=0pour le désactiver). Les navigateurs hébergés ont le leur. - Lecture en sécurité logicielle (L3) ; la sécurité matérielle (L1) est hors périmètre.
La prise en charge des DRM est une pièce de plus d’une identité cohérente : un vrai Chrome répond à la requête Widevine, donc une persona qui en est incapable se trahit — et la persona par défaut se présente comme Google Chrome, qui livre le CDM sur toutes les plateformes desktop. Voir Comment fonctionne la détection.