feat(cdm): add remote PlayReady CDM support via pyplayready RemoteCdm

This commit is contained in:
Andy
2026-01-26 01:08:54 -07:00
parent 98d579dc9b
commit 4b1d938b49
2 changed files with 27 additions and 8 deletions

View File

@@ -27,6 +27,7 @@ from construct import ConstError
from pymediainfo import MediaInfo from pymediainfo import MediaInfo
from pyplayready.cdm import Cdm as PlayReadyCdm from pyplayready.cdm import Cdm as PlayReadyCdm
from pyplayready.device import Device as PlayReadyDevice from pyplayready.device import Device as PlayReadyDevice
from pyplayready.remote.remotecdm import RemoteCdm as PlayReadyRemoteCdm
from pywidevine.cdm import Cdm as WidevineCdm from pywidevine.cdm import Cdm as WidevineCdm
from pywidevine.device import Device from pywidevine.device import Device
from pywidevine.remotecdm import RemoteCdm from pywidevine.remotecdm import RemoteCdm
@@ -2426,14 +2427,23 @@ class dl:
return CustomRemoteCDM(service_name=service, vaults=self.vaults, **cdm_api) return CustomRemoteCDM(service_name=service, vaults=self.vaults, **cdm_api)
else: else:
return RemoteCdm( device_type = cdm_api.get("Device Type", cdm_api.get("device_type", ""))
device_type=cdm_api["Device Type"], if str(device_type).upper() == "PLAYREADY":
system_id=cdm_api["System ID"], return PlayReadyRemoteCdm(
security_level=cdm_api["Security Level"], security_level=cdm_api.get("Security Level", cdm_api.get("security_level", 3000)),
host=cdm_api["Host"], host=cdm_api.get("Host", cdm_api.get("host")),
secret=cdm_api["Secret"], secret=cdm_api.get("Secret", cdm_api.get("secret")),
device_name=cdm_api["Device Name"], device_name=cdm_api.get("Device Name", cdm_api.get("device_name")),
) )
else:
return RemoteCdm(
device_type=cdm_api["Device Type"],
system_id=cdm_api["System ID"],
security_level=cdm_api["Security Level"],
host=cdm_api["Host"],
secret=cdm_api["Secret"],
device_name=cdm_api["Device Name"],
)
prd_path = config.directories.prds / f"{cdm_name}.prd" prd_path = config.directories.prds / f"{cdm_name}.prd"
if not prd_path.is_file(): if not prd_path.is_file():

View File

@@ -264,6 +264,15 @@ remote_cdm:
host: "https://keyxtractor.decryptlabs.com" host: "https://keyxtractor.decryptlabs.com"
secret: "your_decrypt_labs_api_key_here" secret: "your_decrypt_labs_api_key_here"
# PyPlayReady RemoteCdm - connects to an unshackle serve instance
- name: "playready_remote"
Device Type: PLAYREADY
System ID: 0
Security Level: 3000 # 2000 for SL2000, 3000 for SL3000
Host: "http://127.0.0.1:8786/playready" # Include /playready path
Secret: "your-api-secret-key"
Device Name: "my_prd_device" # Device name on the serve instance
# Key Vaults store your obtained Content Encryption Keys (CEKs) # Key Vaults store your obtained Content Encryption Keys (CEKs)
# Use 'no_push: true' to prevent a vault from receiving pushed keys # Use 'no_push: true' to prevent a vault from receiving pushed keys
# while still allowing it to provide keys when requested # while still allowing it to provide keys when requested