本文へスキップ

Widevine / EME(DRM)

Widevine CDM を使うと、DRM で保護された動画を再生でき、実際の Chrome の EME サーフェスとも一致します。CDM は、標準の Chrome が受け取るのとまったく同じ方法で、実行時に取得されます。SDK 0.48.0 以降、ライセンスビルドでの起動ではデフォルトで有効です。

SDK が CDM を取得する理由

Clearcote には EME/Widevine の基盤部分がコンパイル済みで組み込まれています(enable_widevine)が、Google のプロプライエタリな CDM は含まれていません。Clearcote はこの CDM を再配布しておらず、そもそもオープンソースのビルドに同梱することもできません。CDM がないと navigator.requestMediaKeySystemAccess('com.widevine.alpha') は reject されます。これは DRM が動かないという問題であると同時に、整合性の手がかりにもなります(実際の Chrome では resolve されます)。そのため、SDK がお使いのマシン上で、Google 自身のコンポーネントサーバーから CDM を取得します。Clearcote が CDM を配布することはありません。

ライセンスビルドでの起動ではデフォルトで有効

ライセンスキーが見つかり(license_key オプション、CLEARCOTE_LICENSE_KEY、または ~/.clearcote/license.key)、ブラウザがライセンスビルド 154 r32 以降であれば、ローカルでのすべての起動で Widevine が有効になります。対象は launch()、永続コンテキスト、serve()、Python の非同期 API、.NET の起動です。何も渡す必要はありません。最初の起動で CDM をダウンロードし、以降の起動ではキャッシュをすぐに使います。

  • 無効にするには、widevine=False(Node では { widevine: false }、.NET では Widevine = false)または CLEARCOTE_WIDEVINE=0 を使います。
  • キーなしで有効にする(オープンビルド)には、widevine=True または CLEARCOTE_WIDEVINE=1 を使います。キーなしの起動は、これまでどおり、指定しない限り Widevine なしのままです。
  • 起動を妨げません。デフォルトでは CDM を最大 15 秒待ちます(CLEARCOTE_WIDEVINE_TIMEOUT_SECONDS)。読み込めなかった場合、ブラウザは CDM なしで起動し、SDK が一度だけ警告します。
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

仕組みと制限

  • 一度だけ取得してキャッシュ。CDM は Google のコンポーネントサーバーからダウンロードされ、SHA-256 で検証され(ハッシュがない場合は拒否されます。ネイティブライブラリだからです)、~/.clearcote/WidevineCdm 以下にキャッシュされます(場所は CLEARCOTE_WIDEVINE_DIR で変更できます)。同時に実行される起動は 1 回のダウンロードを共有します。fetch_widevine() / fetchWidevine() で事前に取得しておくこともできます。
  • バージョン確認は 1 日 1 回。直近 24 時間以内に確認済みのキャッシュ済み CDM は、ネットワークを一切使わずに使われます。それを過ぎると、Google のアップデートサーバーへのバージョン確認が 1 回行われます。この通信はプロキシを経由せず、このマシンから直接行われます。オフラインのときは、キャッシュ済みの CDM が使われます。
  • ライセンスビルド 154 r32 以降:エンジンは --widevine-cdm-path を受け付けます。これは CDM のディレクトリで、エンジンは起動時に、シークレットモードや Playwright の使い捨てプロファイルも含むすべてのプロファイルにこれを登録します。SDK 0.41.0 以降は widevine を指定した起動で、0.48.0 以降はライセンスビルドでのすべての起動で、SDK がこれを自動で渡します。古いビルドではプロファイルが必要です。同期版の launch() または永続コンテキストで widevine=True を指定すると、CDM がプロファイルに配置され、コンポーネントアップデーターがそれを登録します。自分で args に指定した --widevine-cdm-path=<dir> が常に優先されます。
  • Python、Node、.NET(.NET は 0.48.0 以降:LaunchOptions.Widevine と Widevine クラス)。Windows と Linux で動作します。
  • Docker:公式イメージでは、Windows ペルソナの場合にデフォルトで有効になります(無効にするには CC_WIDEVINE=0)。ホスト型ブラウザは独自の CDM を備えています。
  • ソフトウェアセキュア(L3)での再生に対応します。ハードウェアセキュア(L1)は対象外です。
DRM への対応も、整合性のあるアイデンティティを構成する要素の 1 つです。実際の Chrome は Widevine の問い合わせに応答するため、応答できないペルソナはそれ自体が手がかりになります。しかもデフォルトのペルソナは Google Chrome として振る舞い、Google Chrome はすべてのデスクトッププラットフォームで CDM を同梱しています。検知の仕組みを参照してください。