はじめに
最近、yt-dlpのGUI版を作りました。https://github.com/R-Git-BOT/yt-dlp-gui/releases/
理由としてはコマンドが多すぎて覚えられない、重い、1画面でシンプルにしたいというのがあります。
実際にyt-dlpを使い、有料で配信されている動画を保存しようとすると、以下の様になります。
[DRM] Extracting URL: https://www.amazon.co.jp/gp/video/detail/*********
ERROR: [DRM] The requested site is known to use DRM protection. It will NOT be supported.
Please DO NOT open an issue, unless you have evidence that the video is not DRM protected
「DRM保護されているからダウンロードできないよ。DRM保護されてないのにこのエラーが出る場合じゃない限りIssue立てるなよ。」と表示されます。
著作権保護されている動画を守る技術ですが、これはどのように実現されているのでしょうか。気になったので調査してまとめてみます。
DRMとは
DRMはDigital Rights Managementの略。デジタルコンテンツにおいてコンテンツホルダーが持つ著作権などの権利が不当に侵害されることを防ぐため、コンテンツの利用や複製を制限する仕組みの総称です
https://www.tdk.com/ja/tech-mag/knowledge/070
から引用
デジタルコンテンツの複製・不正利用・再利用を防ぐための技術として、暗号化・コピーガード機能・保存させない機能・閲覧期間制限などの仕組みが用いられます。
現在の動画配信に使われている技術というのではなく、ビデオ・DVDの時代から続いていた技術であることが分かります。
本記事では、保存させない機能について掘り下げていきます。
通常の動画配信の流れ
かなり簡略化してますが、こんな感じでしょうか。
もう少し詳細化すると、動画ストレージとブラウザの間にCDNが入ったり、動画ストレージだけでなく動画を管理するシステムやエンコーディングするシステムが入ったりしますが、本題とは離れるので割愛しています。
DRM保護された動画配信の流れ
こちらも簡略化したものですが、大方この流れになっています。実際には、ブラウザからライセンスサーバーへ直接通信するとは限らず、サービス側のサーバーを経由する場合もあります。
ここで重要なのは、DRMが動画データ自体の取得を完全に防いでいるわけではないという点です。
動画データはブラウザへ送られなければ再生できないため、通信経路上ではブラウザが動画を受信しています。ただし、受信する動画は暗号化されており、そのまま保存しても通常の動画プレイヤーでは再生できません。
つまり、DRMによる「保存させない仕組み」とは、厳密には以下のような仕組みです。
- 配信する動画を暗号化しておく
- 復号に必要な鍵を動画と一緒に配布しない
- 再生を許可された環境にだけライセンスを発行する
- CDM内部で動画を復号し、平文の動画や復号鍵を外部から扱いにくくする
まとめ
DRM保護された動画も、再生する以上は端末へ動画データを送る必要があります。しかし、送られてくるのは暗号化された動画です。
再生を許可されたユーザーだけがライセンスを取得でき、CDMがライセンスと暗号化動画を処理することで、初めて映像として表示できます。
yt-dlpがDRM保護された動画を保存できないのは、単に動画の場所が分からないから、動画を取得できないからではありません。動画を取得できても暗号化されており、再生可能な状態にするにはDRMのライセンス処理と復号が必要になるためです。