mirror of
https://github.com/unshackle-dl/unshackle.git
synced 2026-05-17 06:09:29 +00:00
feat(remote): add server-CDM mode, manifest transfer, and region-aware proxy
Server-side: - Add server_cdm mode: server handles full CDM licensing using its own devices, returns KID:KEY pairs instead of raw license bytes - Support batch license resolution for multiple tracks in one request - Extract DRM from manifest ContentProtection when track.drm is empty - Serialize DASH/ISM manifest XML as base64 in /tracks response - Include session cookies/headers and server_cdm_type in /tracks response - Detect server CDM type from actual track DRM + configured devices - Check server region against client_region to skip unnecessary proxy - Support decrypt_labs and custom_api remote CDMs for both WV and PR Client-side: - Re-parse DASH/ISM manifests locally from base64 to populate track.data - Match remote tracks to re-parsed tracks by ID with attribute fallback - Copy DRM objects from re-parsed manifests to remote tracks - Pre-fetch keys via resolve_server_keys() before downloads start - Fallback per-track licensing via _proxy_license during download - Apply session cookies/headers from server for CDN access - Apply downloader/decryption config directly for remote services - Preserve pre-injected content_keys during DASH DRM override - Skip redundant CDM calls when all KIDs already have keys Docs: - Add comprehensive remote-services-flow.md with Mermaid diagrams covering proxy mode, server-CDM mode, manifest transfer, and config
This commit is contained in:
@@ -305,11 +305,24 @@ class DASH:
|
||||
or (existing_drm and not any(isinstance(drm, Widevine) for drm in existing_drm))
|
||||
)
|
||||
|
||||
pre_existing_keys = {}
|
||||
if existing_drm:
|
||||
for drm_obj in existing_drm:
|
||||
if hasattr(drm_obj, "content_keys") and drm_obj.content_keys:
|
||||
pre_existing_keys.update(drm_obj.content_keys)
|
||||
|
||||
if should_override_drm:
|
||||
track.drm = manifest_drm
|
||||
else:
|
||||
track.drm = existing_drm
|
||||
|
||||
if pre_existing_keys and track.drm:
|
||||
for drm_obj in track.drm:
|
||||
if hasattr(drm_obj, "content_keys"):
|
||||
for kid, key in pre_existing_keys.items():
|
||||
if kid not in drm_obj.content_keys:
|
||||
drm_obj.content_keys[kid] = key
|
||||
|
||||
manifest_base_url = manifest.findtext("BaseURL")
|
||||
if not manifest_base_url:
|
||||
manifest_base_url = track.url
|
||||
|
||||
Reference in New Issue
Block a user