mirror of
https://github.com/unshackle-dl/unshackle.git
synced 2026-11-14 13:05:09 +00:00
feat(remote): cap server CDM licensing by height per API key and service
A session above the cap licenses with the client's own device, and a track above it in an uncapped -q run is handed back to the client. Also names the fallback in the ccextractor crash warning.
This commit is contained in:
@@ -154,6 +154,32 @@ client that asks anyway gets a `FORBIDDEN` error. Because a download job always
|
||||
an API key without `server_cdm` for that service also cannot submit or retry `/api/download`
|
||||
jobs. Keys that have no `users` entry, such as `api_secret`, keep server CDM access.
|
||||
|
||||
`server_cdm_max_height` 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 `default` entry. A service the map does not name or sets to `null` gets the `default`, and
|
||||
with no `default` it has no limit. The server compares the limit with the lowest `-q` that selects
|
||||
the track: the track height, or the 16:9 height from the width when that is lower. The server reads
|
||||
the remote client's `-q` when the remote session starts:
|
||||
|
||||
- With no `-q`, or a `-q` at or below the limit, the server CDM licenses the remote session. The server
|
||||
refuses a live licence for a video track taller than the limit, and the client licenses that
|
||||
track with its own local CDM.
|
||||
- With a `-q` above the limit, the client's own local CDM licenses every track of the remote session.
|
||||
The service sees the DRM system and security level of the client's device. A client with no
|
||||
local CDM gets a `SERVER_CDM_CAPPED` error.
|
||||
- A download job must pass a `quality` at or below the limit, and must not set `best_available` or
|
||||
a `HYBRID` range. `HYBRID` always keeps the lowest Dolby Vision track, at any quality. A job with
|
||||
no `quality`, with a higher one, with `best_available`, or with `HYBRID` gets a `SERVER_CDM_CAPPED`
|
||||
error. The server checks the values the job runs with, after it applies the service defaults
|
||||
and the `serve:` download defaults.
|
||||
|
||||
The limit protects the server's device, not the content keys. For a Widevine track, a server vault
|
||||
still supplies a content key at every height. A PlayReady track never reads the vault, so above
|
||||
the limit it always goes to the client's device. A licence for a lower track can carry the
|
||||
content key of a higher track when the service shares one content key between them. With server
|
||||
accounts enabled, a client that reports a stronger device than it holds makes the server's
|
||||
account request those manifests; the licence server still refuses its challenge.
|
||||
|
||||
`admin` is a boolean that lets the API key run the maintenance endpoints (clear-cache, clear-temp, refresh-services). It is `false` unless the entry sets it. Keys that have no `users` entry, such as `api_secret`, keep that access.
|
||||
|
||||
A `tier` names an entry under `serve.tiers`, which holds the settings that several API keys
|
||||
@@ -242,6 +268,7 @@ serve:
|
||||
tier: bot # 600 requests/hour; 429 with Retry-After once over
|
||||
e5f6a7b8:
|
||||
server_cdm: true # this key may have the server do the licensing
|
||||
server_cdm_max_height: 1080 # above 1080p the client licenses with its own device
|
||||
c9d0e1f2:
|
||||
services: [EXAMPLE1, EXAMPLE2]
|
||||
server_cdm: [EXAMPLE1] # the server licenses only EXAMPLE1; EXAMPLE2 needs a local CDM
|
||||
|
||||
Reference in New Issue
Block a user