docs: correct DRM, muxing, and proxy references (+ case-insensitive proxy prefix fix)

This commit is contained in:
imSp4rky
2026-07-13 09:09:46 -06:00
parent 2e14e30f2f
commit 1cf9e5b487
4 changed files with 20 additions and 20 deletions

View File

@@ -71,8 +71,8 @@ The differences that matter to you are:
[Widevine and PlayReady on the same title](#widevine-and-playready-on-the-same-title)).
To download a Widevine-protected title you need a `.wvd` device; for PlayReady you
need a `.prd` device. You can hold both and let unshackle choose, or force one with
the `--drm` flag.
need a `.prd` device. You can hold both, and unshackle automatically selects the
appropriate one for each track.
!!! info "Obtaining device files"
A `.wvd` or `.prd` encodes the private keys of a real client device. unshackle
@@ -205,12 +205,7 @@ cdm:
EXAMPLE2: sm_g935f_l1
```
Lookups are case-insensitive. On the command line you can override the configured
device for a single run:
```console
$ unshackle dl -w chromecdm_l3 EXAMPLE1 B0ABCDEF
```
Lookups are case-insensitive.
!!! tip "The device name is the file name"
A device named `chromecdm_l3` in the config resolves to `chromecdm_l3.wvd` in the
@@ -238,8 +233,9 @@ profile.
=== "By DRM system"
Keys `widevine` and `playready` select a device per system. This pairs with the
`--drm` flag, which accepts `wv`/`widevine` or `pr`/`playready`.
Keys `widevine` and `playready` select a device per system. unshackle applies
these automatically, using the `widevine` device for Widevine tracks and the
`playready` device for PlayReady tracks.
```yaml
cdm:
@@ -471,8 +467,8 @@ Title needs a Widevine CDM but SOMESERVICE is configured with PlayReady.
```
Use the `cdm` mapping's [DRM-based selection](#advanced-selection-by-quality-drm-or-profile)
to configure a device for each system, or force one system with `--drm` on the
command line.
to configure a device for each system; unshackle selects the right one per track
automatically.
## Keys, vaults, and caching

View File

@@ -13,7 +13,7 @@ When a download finishes muxing, unshackle builds the final path from three piec
```
- **Output directory**: `directories.downloads` from your config, or whatever you pass to `-o/--output` on the command line for a single run.
- **Folder template**: an optional per-title subfolder. TV episodes and music tracks are **always** placed in a folder; movies only get one if you define a `movies` folder template (see [Folder templates](#folder-templates)).
- **Folder template**: an optional per-title subfolder. TV episodes and music tracks are **always** placed in a folder; movies only get one if you define a `movies` folder template, or a single-string `folder` template that applies to all title kinds (see [Folder templates](#folder-templates)).
- **Filename template**: the `output_template` for the title kind (movie, series, or song).
- **Extension**: chosen by the muxer: `.mkv` for video, `.mka` for audio-only, `.mks` for subtitle-only.
@@ -188,10 +188,10 @@ The per-kind folder keys are `movies`, `series`, `songs`, and `albums`. Any othe
**Fallback behavior:**
- A per-kind folder template wins if present; otherwise the single `folder` string is used; otherwise unshackle falls back to a built-in default.
- Built-in defaults when no folder template is set: movies get no folder at all unless a `movies` folder template exists; series fall back to a folder *derived* from the `series` output template (stripping `{episode}`, `{episode_name}`, and collapsing `{season_episode}` down to `{season}`); music albums fall back to `{artist} - {album} ({year})`.
- Built-in defaults when no folder template is set: movies get no folder at all unless a `movies` folder template (or a single-string `folder` template) exists; series fall back to a folder *derived* from the `series` output template (stripping `{episode}`, `{episode_name}`, and collapsing `{season_episode}` down to `{season}`); music albums fall back to `{artist} - {album} ({year})`.
!!! note "Movies are flat by default"
Episodes and songs are always foldered. Movies are written directly into the output directory *unless* you define a `movies` folder template. Set one if you want each movie in its own directory.
Episodes and songs are always foldered. Movies are written directly into the output directory *unless* you define a `movies` folder template (or a single-string `folder` template, which folders every kind). Set one if you want each movie in its own directory.
## Muxing options
@@ -200,7 +200,7 @@ Muxing (combining video, audio, subtitle, chapter and attachment tracks into a s
```yaml title="unshackle.yaml"
muxing:
set_title: true
merge_video: true
merge_video: false
merge_audio: true
default_language:
audio: en
@@ -210,7 +210,7 @@ muxing:
| Key | Type | Default | Effect |
|---|---|---|---|
| `set_title` | bool | `true` | Write the title name into the MKV container title with `--title`. Set to `false` to omit it. |
| `merge_video` | bool | `true` | Group video tracks that share the same resolution, range, and codec into one file so only language varies inside it. |
| `merge_video` | bool | `false` | Group video tracks that share the same resolution, range, and codec into one file so only language varies inside it. |
| `merge_audio` | bool | `true` | Merge audio tracks of the same kind so multiple languages sit in one file. |
| `default_language` | map | *(unset)* | Preferred language per track type (`video` / `audio` / `subtitle`). A track in the preferred language is flagged as the default track. |

View File

@@ -418,7 +418,7 @@ proxy_providers:
```
**Required keys:** `username`, `password`. unshackle validates them up front: the
combined username and password must be exactly 48 lowercase alphanumeric characters, and
combined username and password must be exactly 48 alphanumeric characters (case-insensitive), and
the username must not contain an `@`. If validation fails, you have almost certainly used
your login credentials instead of your service credentials.
@@ -555,7 +555,7 @@ proxy_providers:
```
**Required keys:** `username`, `password`, validated with the same 48-character rule as
NordVPN (combined username+password must be 48 lowercase alphanumeric characters, no `@`).
NordVPN (combined username+password must be 48 alphanumeric characters, case-insensitive, no `@`).
`server_map` optionally pins server IDs per region.
**Query forms:**

View File

@@ -1104,7 +1104,11 @@ class dl:
with console.status(status_msg, spinner="dots"):
if requested_provider:
proxy_provider = next(
(x for x in self.proxy_providers if x.__class__.__name__.lower() == requested_provider),
(
x
for x in self.proxy_providers
if x.__class__.__name__.lower() == requested_provider.lower()
),
None,
)
if not proxy_provider: