34 lines
977 B
Python
34 lines
977 B
Python
import logging
|
|
|
|
from pywidevine.cdm import Cdm
|
|
from pywidevine.device import Device
|
|
from pywidevine.pssh import PSSH
|
|
|
|
|
|
class LocalCDM:
|
|
def __init__(self, wvd=None) -> None:
|
|
self.device = Device.load(wvd)
|
|
self.cdm = Cdm.from_device(self.device)
|
|
self.session_id = self.cdm.open()
|
|
self.log = logging.getLogger()
|
|
|
|
def challenge(self, pssh: str) -> bytes:
|
|
return self.cdm.get_license_challenge(self.session_id, PSSH(pssh))
|
|
|
|
def parse(self, response) -> list:
|
|
try:
|
|
self.cdm.parse_license(self.session_id, response)
|
|
keys = []
|
|
for key in self.cdm.get_keys(self.session_id):
|
|
if key.type == "CONTENT":
|
|
keys.append(f"{key.kid.hex}:{key.key.hex()}")
|
|
|
|
return keys
|
|
|
|
except Exception as e:
|
|
self.log.error(f"Unable to parse license response {e}")
|
|
exit(1)
|
|
|
|
finally:
|
|
self.cdm.close(self.session_id)
|