Deployed 21d5f1c with MkDocs version: 1.6.1

This commit is contained in:
2026-08-16 04:09:18 +00:00
parent 674e0df2be
commit 0f3e6556aa
9 changed files with 1510 additions and 363 deletions
+5 -5
View File
@@ -2761,19 +2761,19 @@ It's also what lets the parser flag <code>is_original_lang</code> on each track
token.</p>
</div>
<p>Some services deliver a <strong>separate manifest per codec/range</strong>. The base class
provides <code>_get_tracks_for_variants(title, fetch_fn)</code> to fan out over every
provides <code>get_tracks_for_variants(title, fetch_fn)</code> to fan out over every
codec×range in the <code>TrackRequest</code>, including <code>HYBRID</code> (fetch HDR10 + DV and
merge) and <code>--best-available</code> skip-on-error handling:</p>
<div class="language-python highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="k">def</span><span class="w"> </span><span class="nf">get_tracks</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">title</span><span class="p">:</span> <span class="n">Title_T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tracks</span><span class="p">:</span>
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a> <span class="k">def</span><span class="w"> </span><span class="nf">_fetch_variant</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">codec</span><span class="p">,</span> <span class="n">range_</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tracks</span><span class="p">:</span>
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a> <span class="k">def</span><span class="w"> </span><span class="nf">fetch_variant</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">codec</span><span class="p">,</span> <span class="n">range_</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tracks</span><span class="p">:</span>
</span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a> <span class="n">vcodec</span> <span class="o">=</span> <span class="s2">&quot;H265&quot;</span> <span class="k">if</span> <span class="n">codec</span> <span class="o">==</span> <span class="n">Video</span><span class="o">.</span><span class="n">Codec</span><span class="o">.</span><span class="n">HEVC</span> <span class="k">else</span> <span class="s2">&quot;H264&quot;</span>
</span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fetch_dash_manifest</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">vcodec</span><span class="o">=</span><span class="n">vcodec</span><span class="p">,</span> <span class="n">range_</span><span class="o">=</span><span class="n">range_</span><span class="p">)</span>
</span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_tracks_for_variants</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">_fetch_variant</span><span class="p">)</span>
</span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fetch_dash_manifest</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">vcodec</span><span class="o">=</span><span class="n">vcodec</span><span class="p">,</span> <span class="n">range_</span><span class="o">=</span><span class="n">range_</span><span class="p">)</span>
</span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_tracks_for_variants</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">fetch_variant</span><span class="p">)</span>
</span></code></pre></div>
<p>After parsing, you may <strong>correct</strong> track metadata the manifest gets wrong:
stamp the real <code>video.range</code>, fix odd audio channel counts, mark descriptive
audio, add hand-built subtitles or an <code>Attachment</code> (e.g. cover art). Do <em>not</em>
filter for resolution/bitrate. See <code>_fetch_dash_manifest</code> in the EXAMPLE service
filter for resolution/bitrate. See <code>fetch_dash_manifest</code> in the EXAMPLE service
for a thorough demonstration.</p>
<div class="admonition note">
<p class="admonition-title">Flip HDR10 → HDR10+ by hand when you know the platform embeds it</p>
+1 -1
View File
@@ -2771,7 +2771,7 @@ seconds left before this specific session expires.</p>
<p>Source: <code>unshackle/core/remote_service.py</code>. This is the canonical consumer of the
session API and a good template for any client.</p>
<ul>
<li><strong><code>RemoteClient._request</code></strong> sets <code>X-Secret-Key</code> and <code>User-Agent: unshackle/&lt;version&gt;</code>,
<li><strong><code>RemoteClient.request</code></strong> sets <code>X-Secret-Key</code> and <code>User-Agent: unshackle/&lt;version&gt;</code>,
uses a 120s timeout for <code>POST</code> and 30s for <code>GET</code>/<code>DELETE</code>, and treats any
<code>status_code &gt;= 400</code> as fatal: it logs <code>Server error [&lt;error_code&gt;]: &lt;message&gt;</code>
and raises <code>SystemExit(1)</code>.</li>
BIN
View File
Binary file not shown.
+42
View File
@@ -1799,6 +1799,17 @@
<nav class="md-nav" aria-label=" Config">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.config.Config.validate_output_templates" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;validate_output_templates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.config.Config.get_folder_template" class="md-nav__link">
<span class="md-ellipsis">
@@ -2008,6 +2019,17 @@
<nav class="md-nav" aria-label=" Config">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.config.Config.validate_output_templates" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;validate_output_templates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.config.Config.get_folder_template" class="md-nav__link">
<span class="md-ellipsis">
@@ -2157,6 +2179,26 @@
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.config.Config.validate_output_templates" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">validate_output_templates</span>
<a href="#unshackle.core.config.Config.validate_output_templates" 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">validate_output_templates</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Validate output template configurations and warn about potential issues.</p>
</div>
</div>
<div class="doc doc-object doc-function">
+454
View File
@@ -1881,6 +1881,17 @@
<nav class="md-nav" aria-label=" ClearKey">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.warn_clear" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;warn_clear
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.decrypt" class="md-nav__link">
<span class="md-ellipsis">
@@ -2178,6 +2189,17 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.extract_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_keys
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2230,6 +2252,17 @@
<nav class="md-nav" aria-label=" PlayReady">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.extract_kids_from_pssh_b64" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_kids_from_pssh_b64
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.to_dict" class="md-nav__link">
<span class="md-ellipsis">
@@ -2239,6 +2272,28 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.extract_keys_from_cdm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_keys_from_cdm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.detect_revocation" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;detect_revocation
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2250,6 +2305,28 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
@@ -2427,6 +2504,28 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
@@ -2510,6 +2609,17 @@
<nav class="md-nav" aria-label=" ClearKey">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.warn_clear" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;warn_clear
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.decrypt" class="md-nav__link">
<span class="md-ellipsis">
@@ -2807,6 +2917,17 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.extract_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_keys
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2859,6 +2980,17 @@
<nav class="md-nav" aria-label=" PlayReady">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.extract_kids_from_pssh_b64" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_kids_from_pssh_b64
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.to_dict" class="md-nav__link">
<span class="md-ellipsis">
@@ -2868,6 +3000,28 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.extract_keys_from_cdm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_keys_from_cdm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.detect_revocation" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;detect_revocation
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2879,6 +3033,28 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
@@ -3056,6 +3232,28 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
@@ -3167,6 +3365,26 @@ set to of the same bit-size of the key.</p>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKey.warn_clear" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">warn_clear</span>
<a href="#unshackle.core.drm.ClearKey.warn_clear" 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">warn_clear</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Warn once per track that a segment was passed through undecrypted.</p>
</div>
</div>
<div class="doc doc-object doc-function">
@@ -4131,6 +4349,26 @@ H5DCID-V3-P1-YYYYMMDD-HHMMSS-MEDIAID-TIMESTAMP-SUFFIX</p>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.MonaLisa.extract_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">extract_keys</span>
<a href="#unshackle.core.drm.MonaLisa.extract_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">extract_keys</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract keys from the ticket using the MonaLisa CDM.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.MonaLisa.from_ticket" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">from_ticket</span>
@@ -4424,6 +4662,26 @@ the content has already been decrypted and muxed into a container.</p>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.extract_kids_from_pssh_b64" 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_kids_from_pssh_b64</span>
<a href="#unshackle.core.drm.PlayReady.extract_kids_from_pssh_b64" 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">extract_kids_from_pssh_b64</span><span class="p">(</span><span class="n">pssh_b64</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract all KIDs from base64-encoded PSSH data.</p>
</div>
</div>
<div class="doc doc-object doc-function">
@@ -4448,6 +4706,122 @@ the content has already been decrypted and muxed into a container.</p>
<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>
<a href="#unshackle.core.drm.PlayReady.extract_keys_from_cdm" 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">extract_keys_from_cdm</span><span class="p">(</span><span class="n">cdm</span><span class="p">,</span> <span class="n">session_id</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract keys from CDM session with cross-library compatibility.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>cdm</code>
</td>
<td>
<code><span title="pyplayready.cdm.Cdm">Cdm</span></code>
</td>
<td>
<div class="doc-md-description">
<p>CDM instance</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>session_id</code>
</td>
<td>
<code><span title="bytes">bytes</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Session identifier</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="dict">dict</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping KID UUIDs to hex keys</p>
</div>
</td>
</tr>
</tbody>
</table>
</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>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.drm.PlayReady.detect_revocation" 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">detect_revocation</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the decoded error string if a revocation HRESULT is present, else None.</p>
<p>Reads the code from the raw SOAP body (<StatusCode>0x8004C065</StatusCode>)
or from an exception message that carries it, so any service is covered.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt</span>
@@ -4471,6 +4845,46 @@ Raises:
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.decrypt_with_mp4decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_mp4decrypt</span>
<a href="#unshackle.core.drm.PlayReady.decrypt_with_mp4decrypt" 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">decrypt_with_mp4decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt using mp4decrypt</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.decrypt_with_shaka_packager" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_shaka_packager</span>
<a href="#unshackle.core.drm.PlayReady.decrypt_with_shaka_packager" 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">decrypt_with_shaka_packager</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt using Shaka Packager (original method)</p>
</div>
</div>
</div>
@@ -4972,6 +5386,46 @@ Raises:
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.decrypt_with_mp4decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_mp4decrypt</span>
<a href="#unshackle.core.drm.Widevine.decrypt_with_mp4decrypt" 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">decrypt_with_mp4decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt using mp4decrypt</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.decrypt_with_shaka_packager" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_shaka_packager</span>
<a href="#unshackle.core.drm.Widevine.decrypt_with_shaka_packager" 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">decrypt_with_shaka_packager</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt using Shaka Packager (original method)</p>
</div>
</div>
</div>
File diff suppressed because it is too large Load Diff
+320
View File
@@ -1864,6 +1864,61 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.part_suffix" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;part_suffix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.build_template_context" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;build_template_context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.air_date_display" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;air_date_display
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.folder_season" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;folder_season
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.part_label" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;part_label
</span>
</a>
</li>
</ul>
@@ -1880,6 +1935,23 @@
</span>
</a>
<nav class="md-nav" aria-label=" Movie">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.titles.Movie.build_template_context" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;build_template_context
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
@@ -1913,6 +1985,23 @@
</span>
</a>
<nav class="md-nav" aria-label=" Song">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.titles.Song.build_template_context" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;build_template_context
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
@@ -2028,6 +2117,61 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.part_suffix" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;part_suffix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.build_template_context" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;build_template_context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.air_date_display" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;air_date_display
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.folder_season" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;folder_season
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.titles.Episode.part_label" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;part_label
</span>
</a>
</li>
</ul>
@@ -2044,6 +2188,23 @@
</span>
</a>
<nav class="md-nav" aria-label=" Movie">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.titles.Movie.build_template_context" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;build_template_context
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
@@ -2077,6 +2238,23 @@
</span>
</a>
<nav class="md-nav" aria-label=" Song">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.titles.Song.build_template_context" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;build_template_context
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
@@ -2218,6 +2396,108 @@ takes every part. A dated episode also answers to its ISO air date.
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.titles.Episode.part_suffix" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">part_suffix</span>
<a href="#unshackle.core.titles.Episode.part_suffix" 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">part_suffix</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p><code>.Part.2</code> / <code>Part 2</code> in the series template's own separator style.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.titles.Episode.build_template_context" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">build_template_context</span>
<a href="#unshackle.core.titles.Episode.build_template_context" 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">build_template_context</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">media_info</span><span class="p">,</span> <span class="n">show_service</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">include_part</span><span class="o">=</span><span class="kc">True</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Build template context dictionary from MediaInfo.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.titles.Episode.air_date_display" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">air_date_display</span>
<a href="#unshackle.core.titles.Episode.air_date_display" 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">air_date_display</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Render air_date using the series template's own separator (dots or spaces).</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.titles.Episode.folder_season" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">folder_season</span>
<a href="#unshackle.core.titles.Episode.folder_season" 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">folder_season</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Season folder label: air year for dated content, else SxxExx-style season.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.titles.Episode.part_label" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">part_label</span>
<a href="#unshackle.core.titles.Episode.part_label" 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">part_label</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p><code>.2</code> selection-syntax suffix for console output, empty when part-less.</p>
</div>
</div>
</div>
@@ -2273,6 +2553,26 @@ takes every part. A dated episode also answers to its ISO air date.
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.titles.Movie.build_template_context" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">build_template_context</span>
<a href="#unshackle.core.titles.Movie.build_template_context" 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">build_template_context</span><span class="p">(</span><span class="n">media_info</span><span class="p">,</span> <span class="n">show_service</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Build template context dictionary from MediaInfo.</p>
</div>
</div>
</div>
@@ -2465,6 +2765,26 @@ takes every part. A dated episode also answers to its ISO air date.
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.titles.Song.build_template_context" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">build_template_context</span>
<a href="#unshackle.core.titles.Song.build_template_context" 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">build_template_context</span><span class="p">(</span><span class="n">media_info</span><span class="p">,</span> <span class="n">show_service</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Build template context dictionary from MediaInfo.</p>
</div>
</div>
</div>
+93 -1
View File
@@ -2102,6 +2102,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.probe_hdr_metadata" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;probe_hdr_metadata
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2185,6 +2196,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.parse_vtt_time" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;parse_vtt_time
</span>
</a>
</li>
<li class="md-nav__item">
@@ -3146,6 +3168,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.probe_hdr_metadata" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;probe_hdr_metadata
</span>
</a>
</li>
<li class="md-nav__item">
@@ -3229,6 +3262,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.parse_vtt_time" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;parse_vtt_time
</span>
</a>
</li>
<li class="md-nav__item">
@@ -4936,7 +4980,7 @@ MaxCLL. A value of 0 means "unknown" and is preserved as-is.</p>
<a href="#unshackle.core.tracks.Hybrid.extract_hdr10plus" 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">extract_hdr10plus</span><span class="p">(</span><span class="n">_video</span><span class="p">)</span>
<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">extract_hdr10plus</span><span class="p">(</span><span class="n">video</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
@@ -4951,6 +4995,30 @@ MaxCLL. A value of 0 means "unknown" and is preserved as-is.</p>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.probe_hdr_metadata" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">probe_hdr_metadata</span>
<a href="#unshackle.core.tracks.Hybrid.probe_hdr_metadata" 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">probe_hdr_metadata</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract mastering display and content light level metadata from the HDR10 stream via ffprobe.</p>
<p>Returns (max_mdl, min_mdl, max_cll, max_fall) in dovi_tool level6 units:
- max_mdl: nits (integer)
- min_mdl: 0.0001 nit units (integer)
- max_cll / max_fall: nits (integer)</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.convert_hdr10plus_to_dv" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">convert_hdr10plus_to_dv</span>
@@ -5438,6 +5506,30 @@ some parsers (like pysubs2).</p>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.parse_vtt_time" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">parse_vtt_time</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.parse_vtt_time" 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">parse_vtt_time</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Parse WebVTT timestamp to milliseconds. Returns 0 for malformed input.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.has_overlapping_webvtt_cues" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">has_overlapping_webvtt_cues</span>
File diff suppressed because one or more lines are too long