#!/usr/bin/env python3 """Odido Widevine helper. Requires: pip install pywidevine requests""" import json import sys import requests from pywidevine.cdm import Cdm from pywidevine.device import Device from pywidevine.pssh import PSSH def main(): data = json.load(sys.stdin) device = Device.load(data["wvdPath"]) cdm = Cdm.from_device(device) session_id = cdm.open() try: challenge = cdm.get_license_challenge(session_id, PSSH(data["pssh"])) headers = { "Accept": "*/*", "AcquireLicense.CustomData": data["licToken"], "CADeviceType": "Widevine OTT client", "Origin": "https://tv.odido.nl", "Referer": "https://tv.odido.nl/inloggen/index.html", "User-Agent": data["userAgent"], "Content-Type": "application/octet-stream", } response = requests.post( data["licUrl"], headers=headers, cookies=data.get("cookies") or {}, data=challenge, timeout=30, ) response.raise_for_status() cdm.parse_license(session_id, response.content) keys = [ f"{key.kid.hex}:{key.key.hex()}" for key in cdm.get_keys(session_id) if key.type != "SIGNING" ] print(json.dumps({"keys": keys}, separators=(",", ":"))) finally: cdm.close(session_id) if __name__ == "__main__": try: main() except Exception as exc: print(str(exc), file=sys.stderr) sys.exit(1)