mirror of
https://github.com/unshackle-dl/unshackle.git
synced 2026-03-10 16:39:01 +00:00
fix(drm): update PlayReady KID extraction for pyplayready 0.8.3 compatibility
Replace removed `WrmHeader.read_attributes()` with `key_ids` property and add missing WRMHEADER v4.1-v4.3 XML paths (`DATA/PROTECTINFO/...`) to the base64 PSSH parser fallback.
This commit is contained in:
@@ -44,16 +44,15 @@ class PlayReady:
|
|||||||
else:
|
else:
|
||||||
kids = []
|
kids = []
|
||||||
|
|
||||||
# Extract KIDs using pyplayready's method (may miss some KIDs)
|
# Extract KIDs using pyplayready's WrmHeader key_ids
|
||||||
if not kids:
|
if not kids:
|
||||||
for header in pssh.wrm_headers:
|
for header in pssh.wrm_headers:
|
||||||
|
for signed_key_id in getattr(header, "key_ids", []):
|
||||||
try:
|
try:
|
||||||
signed_ids, _, _, _ = header.read_attributes()
|
if isinstance(signed_key_id.value, UUID):
|
||||||
except Exception:
|
kids.append(signed_key_id.value)
|
||||||
continue
|
else:
|
||||||
for signed_id in signed_ids:
|
kids.append(UUID(bytes_le=base64.b64decode(signed_key_id.value)))
|
||||||
try:
|
|
||||||
kids.append(UUID(bytes_le=base64.b64decode(signed_id.value)))
|
|
||||||
except Exception:
|
except Exception:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -119,7 +118,33 @@ class PlayReady:
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Also get individual KID
|
# v4.2/v4.3: DATA/PROTECTINFO/KIDS/KID
|
||||||
|
protectinfo_kids = root.findall(".//pr:DATA/pr:PROTECTINFO/pr:KIDS/pr:KID", ns)
|
||||||
|
for kid_elem in protectinfo_kids:
|
||||||
|
value = kid_elem.get("VALUE")
|
||||||
|
if value:
|
||||||
|
try:
|
||||||
|
kid_bytes = base64.b64decode(value + "==")
|
||||||
|
kid_uuid = UUID(bytes_le=kid_bytes)
|
||||||
|
if kid_uuid not in kids:
|
||||||
|
kids.append(kid_uuid)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# v4.1: DATA/PROTECTINFO/KID
|
||||||
|
protectinfo_kid = root.findall(".//pr:DATA/pr:PROTECTINFO/pr:KID", ns)
|
||||||
|
for kid_elem in protectinfo_kid:
|
||||||
|
value = kid_elem.get("VALUE")
|
||||||
|
if value:
|
||||||
|
try:
|
||||||
|
kid_bytes = base64.b64decode(value + "==")
|
||||||
|
kid_uuid = UUID(bytes_le=kid_bytes)
|
||||||
|
if kid_uuid not in kids:
|
||||||
|
kids.append(kid_uuid)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# v4.0: DATA/KID
|
||||||
individual_kids = root.findall(".//pr:DATA/pr:KID", ns)
|
individual_kids = root.findall(".//pr:DATA/pr:KID", ns)
|
||||||
for kid_elem in individual_kids:
|
for kid_elem in individual_kids:
|
||||||
if kid_elem.text:
|
if kid_elem.text:
|
||||||
|
|||||||
Reference in New Issue
Block a user