Deployed 84b0a92 with MkDocs version: 1.6.1

This commit is contained in:
2026-09-07 23:04:35 +00:00
parent ad65788183
commit 79e96079ae
6 changed files with 239 additions and 4 deletions
+234
View File
@@ -2332,6 +2332,50 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.header_kids" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;header_kids
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.absorb" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;absorb
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.distinct_headers" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;distinct_headers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.pro_b64_for" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;pro_b64_for
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2343,6 +2387,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.get_content_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_content_keys
</span>
</a>
</li>
<li class="md-nav__item">
@@ -3071,6 +3126,50 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.header_kids" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;header_kids
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.absorb" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;absorb
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.distinct_headers" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;distinct_headers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.pro_b64_for" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;pro_b64_for
</span>
</a>
</li>
<li class="md-nav__item">
@@ -3082,6 +3181,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.get_content_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_content_keys
</span>
</a>
</li>
<li class="md-nav__item">
@@ -4780,6 +4890,102 @@ duplicate them here.</p>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.header_kids" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">header_kids</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.drm.PlayReady.header_kids" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">header_kids</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the KIDs one WRM header names, in header order.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.absorb" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">absorb</span>
<a href="#unshackle.core.drm.PlayReady.absorb" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">absorb</span><span class="p">(</span><span class="o">*</span><span class="n">others</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Fold sibling PlayReady objects into this one so their headers and KIDs get licensed too.</p>
<p>A manifest can attach one PlayReady object per WRM header to the same track
(ISM shares its Protection list across tracks; HLS emits one per EXT-X-KEY). The
caller keeps this object's identity, which the decrypt path and drm_lock depend on.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.distinct_headers" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">distinct_headers</span>
<a href="#unshackle.core.drm.PlayReady.distinct_headers" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">distinct_headers</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the WRM headers to license, deduplicated by the KID set each one names.</p>
<p>Two headers naming the same KIDs (a v4.0 header beside its v4.3 twin, or one PRH per
rendition for one content key) cost one challenge. A header with no readable KID is kept: it
may still be the only route to a content key nothing else names.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.pro_b64_for" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">pro_b64_for</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.drm.PlayReady.pro_b64_for" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">pro_b64_for</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Build a base64 one-record PlayReady Object holding only this header.</p>
<p>Remote CDMs send the value given to set_pssh_b64 rather than the header passed
to get_license_challenge, so a per-header challenge needs a per-header PRO.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.extract_keys_from_cdm" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">extract_keys_from_cdm</span>
@@ -4870,6 +5076,34 @@ duplicate them here.</p>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.get_content_keys" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get_content_keys</span>
<a href="#unshackle.core.drm.PlayReady.get_content_keys" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">get_content_keys</span><span class="p">(</span><span class="n">cdm</span><span class="p">,</span> <span class="n">certificate</span><span class="p">,</span> <span class="n">licence</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>License every distinct WRM header whose KIDs still lack a content key.</p>
<p>A v4.2+ header may list several KIDs and one response may stack several licences,
so one challenge often covers everything. Content that ships several headers (ISM
with one ProtectionHeader per track type, HLS with one PRH per playlist) gets one
challenge per header that is not yet covered. Headers are sent as-is: Microsoft lets
the server ignore the header, so a merged header could ask for keys it never grants.</p>
<p>A header that a round refused, or that yielded nothing, is not sent again by this
object: every track of a title runs this method, and a repeat would only repeat the
refusal.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.detect_revocation" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">detect_revocation</span>