Deployed 9a1abd2 with MkDocs version: 1.6.1

This commit is contained in:
2026-10-01 19:24:01 +00:00
parent 6f00e6a114
commit bf4c099765
10 changed files with 697 additions and 626 deletions
+9 -1
View File
@@ -2639,6 +2639,14 @@ the raw license bytes come back for your local CDM to parse.</p>
<ul>
<li>Keeps your CDM local. The server only relays the license request.</li>
<li>Used when <code>server_cdm</code> is <code>false</code> (the default).</li>
<li>Also used for a run with <code>dl --cdm &lt;name&gt;</code>, and for a service whose own entry in
your <code>cdm</code> config named the loaded device. In each case the client sends
<code>server_cdm: false</code> when it creates the remote session, and the server builds the
service on your device even when the API key has the server CDM.</li>
<li>A service option that the service lists in <code>SERVER_DEVICE_OPTIONS</code> keeps the server
CDM. The server reads the option from <code>service_params</code>, then from the top level of
the request. The create response gives the result in <code>server_cdm</code>, and the client
shows a warning when the server did not apply its choice.</li>
<li>The service on the server sees your device, not the server's: its DRM system,
security level, system ID and device type. A CDM call that the service makes
(for example a session-key exchange at login) goes to your client as a <code>cdm_call</code>,
@@ -2879,7 +2887,7 @@ from a browser origin, not when you want only the local HTTP API.</p>
<p><code>POST /api/session/create</code> requires <code>service</code> and <code>title_id</code>. It also accepts
<code>credentials</code>, <code>cookies</code> (base64 of zlib-compressed Netscape cookie file), <code>proxy</code>,
<code>no_proxy</code>, <code>profile</code>, <code>cache</code> (a map of <code>filename → base64(zlib(bytes))</code>),
<code>client_region</code>, <code>cdm_type</code>, <code>cdm_security_level</code>, <code>cdm_relay</code> (<code>true</code> when the client
<code>client_region</code>, <code>server_cdm</code> (<code>false</code> when the user picked the local CDM), <code>cdm_type</code>, <code>cdm_security_level</code>, <code>cdm_relay</code> (<code>true</code> when the client
answers CDM calls), <code>cdm_system_id</code> and <code>cdm_device_type</code> (Widevine only), <code>service_config</code>
(the identity config keys the service lists in <code>client_config</code>), <code>client</code> (a freeform identity
object the dashboard shows as sent), and the track-selection hints <code>range_</code>, <code>vcodec</code>,
+1 -1
View File
@@ -3361,7 +3361,7 @@ and keeps the service's numbering unchanged. Pick an order that covers the whole
</tr>
<tr>
<td><code>--cdm &lt;name&gt;</code></td>
<td>Use the named CDM device from the <code>cdm</code> config mapping for this run, ignoring the service/default mapping.</td>
<td>Use the named CDM device from the <code>cdm</code> config mapping for this run, ignoring the service/default mapping. Over <code>--remote</code>, that device licenses the remote session, not the server CDM.</td>
</tr>
<tr>
<td><code>--skip-dl</code></td>
+1 -1
View File
@@ -3977,7 +3977,7 @@ configured proxy providers), or a <code>provider:region</code> form. See
a content key when the vault misses. You can force one side or the other:</p>
<ul>
<li><code>--cdm-only</code>: only use the CDM (skip vaults). Over a <code>server_cdm</code> remote session the flag does not reach the server, whose vault shortcut still runs; it only skips the client's decode check on a server key.</li>
<li><code>--cdm &lt;name&gt;</code>: use the named CDM device for this run, ignoring the <code>cdm</code> config mapping (including its quality and Widevine/PlayReady sub-entries).</li>
<li><code>--cdm &lt;name&gt;</code>: use the named CDM device for this run, ignoring the <code>cdm</code> config mapping (including its quality and Widevine/PlayReady sub-entries). Over <code>--remote</code>, that device licenses the remote session, not the server CDM.</li>
<li><code>--vaults-only</code>: only use key vaults and never license through the CDM. A missing
content key fails.</li>
</ul>
+1 -1
View File
@@ -3030,7 +3030,7 @@ control this trade-off on the <code>dl</code> command:</p>
</tr>
<tr>
<td><code>--cdm &lt;name&gt;</code></td>
<td>Use the named CDM device for this run instead of the one the <code>cdm</code> config maps for the service.</td>
<td>Use the named CDM device for this run instead of the one the <code>cdm</code> config maps for the service. Over <code>--remote</code>, that device licenses the remote session, not the server CDM.</td>
</tr>
</tbody>
</table>
BIN
View File
Binary file not shown.
+43
View File
@@ -1928,6 +1928,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.config.cdm_entry_names_device" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;cdm_entry_names_device
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2159,6 +2170,17 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.config.cdm_entry_names_device" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;cdm_entry_names_device
</span>
</a>
</li>
<li class="md-nav__item">
@@ -2428,6 +2450,27 @@ between variables. Falls back to dot separator (scene-style) by default.</p>
<div class="doc doc-object doc-function">
<h2 id="unshackle.core.config.cdm_entry_names_device" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">cdm_entry_names_device</span>
<a href="#unshackle.core.config.cdm_entry_names_device" class="headerlink" title="Permanent link">&para;</a></h2>
<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">cdm_entry_names_device</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">profile</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether a per-service <code>cdm</code> entry names a device when no quality is known.</p>
<p>An entry that selects only by quality, or by a different profile, names none.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h2 id="unshackle.core.config.get_config_path" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_config_path</span>
File diff suppressed because it is too large Load Diff
+7
View File
@@ -2138,6 +2138,13 @@ the <a href="../../../guide/drm-and-cdm/">DRM &amp; CDM guide</a>. Device files
Resolution is case-insensitive: an override (<code>dl --cdm &lt;name&gt;</code>, or the <code>cdm</code> field of an API
job) wins, then the per-service entry, then <code>default</code>. An override pins one device for the whole
run and skips any quality or Widevine/PlayReady sub-entries.</p>
<p>Over <code>--remote</code>, an override also makes your device license the remote session, not the server
CDM. A per-service entry does the same when it names a device without a quality: a device name,
a <code>widevine</code> or <code>playready</code> sub-entry, or a profile or <code>default</code> sub-entry. A per-service entry
that selects only by quality, or only for a different profile, loads no device when the run
starts. unshackle then shows a warning, and the server decides who licenses the remote session.
With only the top-level <code>default</code> entry, the server CDM licenses when the API key has it. See
<a href="../services/#remote_services"><code>remote_services</code></a>.</p>
<div class="language-yaml 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="nt">cdm</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="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">chromecdm_l3</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">EXAMPLE2</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">android_l1</span>
+14 -1
View File
@@ -2175,7 +2175,15 @@ optional <code>server_cdm</code> boolean, an optional <code>timeout</code> in se
overrides such as <code>title_map</code>.</p>
<p>Leave <code>server_cdm</code> unset and the client follows the server: it uses the server CDM for each
service the API key has it on, and the local CDM for the others. <code>true</code> asks for the server CDM
and falls back to the local CDM when the server refuses; <code>false</code> always uses the local CDM.</p>
and falls back to the local CDM when the server refuses; <code>false</code> always uses the local CDM.
<code>dl --cdm &lt;name&gt;</code> on a remote run has the same effect as <code>false</code> for that run: the device you
name licenses the remote session. A <a href="../drm/#cdm"><code>cdm</code></a> entry for the service has the same
effect for that service when it names the device that unshackle loaded. Both take priority over
<code>server_cdm: true</code>. Remove the entry to use the server CDM for that service. The <code>default</code>
entry does not count.</p>
<p>The server has the last word. When it keeps the server CDM for a remote session that your
device was to license, unshackle shows a warning. This occurs with a server that does not read
your choice, and with a service option that runs the remote session on the server's device.</p>
<p><code>auth_headers</code> lists extra header names to send the API key in, tried before the defaults
<code>X-Secret-Key</code> and <code>X-Api-Key</code>, which unshackle always appends as fallbacks. It sends the
first name. If the server answers <code>401</code>, it retries the same request with the next name, and
@@ -2333,6 +2341,11 @@ client configured with <code>server_cdm: true</code> to license with its own loc
client that asks anyway gets a <code>FORBIDDEN</code> error. Because a download job always licenses with the server's CDM,
an API key without <code>server_cdm</code> for that service also cannot submit or retry <code>/api/download</code>
jobs. Keys that have no <code>users</code> entry, such as <code>api_secret</code>, keep server CDM access.</p>
<p>A remote client that picks its own device licenses the remote session with that device. It picks
with <code>dl --cdm</code>, with a <code>cdm</code> entry for the service, or with <code>server_cdm: false</code> in its
<code>remote_services</code> entry. The server CDM makes no licence for that remote session, with or without
a limit. A service option that runs the remote session on the server's device, such as a
server-identity flag, keeps the server CDM.</p>
<p><code>server_cdm_max_height</code> limits the live licences the server's device makes for that API key.
Set it to a height in pixels for every service, or to a map of service tag to height with an
optional <code>default</code> entry. A service the map does not name or sets to <code>null</code> gets the <code>default</code>, and
File diff suppressed because one or more lines are too long