Skip to main content

Widevine CDM (Content Decryption Module) implementation in Python.

Project description

pywidevine

Features

  • 🚀 Seamless Installation via pip
  • 🛡️ Robust Security with message signature verification
  • 🙈 Privacy Mode with Service Certificates
  • 🌐 Servable CDM API Server and Client with Authentication
  • 📦 Custom provision serialization format (WVD v2)
  • 🧰 Create, parse, or convert PSSH headers with ease
  • 🗃️ User-friendly YAML configuration
  • ❤️ Forever FOSS!

Installation

$ pip install pywidevine

Note If pip gives you a warning about a path not being in your PATH environment variable then promptly add that path then close all open command prompt/terminal windows, or pywidevine CLI won't work as it will not be found.

Voilà 🎉 — You now have the pywidevine package installed!
You can now import pywidevine in scripts (see below).
A command-line interface is also available, try pywidevine --help.

Usage

The following is a minimal example of using pywidevine in a script to get a License for Bitmovin's Art of Motion Demo.

from pywidevine.cdm import Cdm
from pywidevine.device import Device
from pywidevine.pssh import PSSH

import requests

# prepare pssh
pssh = PSSH("AAAAW3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADsIARIQ62dqu8s0Xpa7z2FmMPGj2hoNd2lkZXZpbmVfdGVzdCIQZmtqM2xqYVNkZmFsa3IzaioCSEQyAA==")

# load device
device = Device.load("C:/Path/To/A/Provision.wvd")

# load cdm
cdm = Cdm.from_device(device)

# open cdm session
session_id = cdm.open()

# get license challenge
challenge = cdm.get_license_challenge(session_id, pssh)

# send license challenge (assuming a generic license server SDK with no API front)
licence = requests.post("https://...", data=challenge)
licence.raise_for_status()

# parse license challenge
cdm.parse_license(session_id, licence.content)

# print keys
for key in cdm.get_keys(session_id):
    print(f"[{key.type}] {key.kid.hex}:{key.key.hex()}")

# close session, disposes of session data
cdm.close(session_id)

Note There are various features not shown in this specific example like:

  • Privacy Mode
  • Setting Service Certificates
  • Remote CDMs and Serving
  • Choosing a License Type to request
  • Creating WVD files
  • and much more!

Take a look at the methods available in the Cdm class and their doc-strings for further information. For more examples see the CLI functions which uses a lot of previously mentioned features.

Disclaimer

  1. This project requires a valid Google-provisioned Private Key and Client Identification blob which are not provided by this project.
  2. Public test provisions are available and provided by Google to use for testing projects such as this one.
  3. License Servers have the ability to block requests from any provision, and are likely already blocking test provisions on production endpoints.
  4. This project does not condone piracy or any action against the terms of the DRM systems.
  5. All efforts in this project have been the result of Reverse-Engineering, Publicly available research, and Trial & Error.

Licensing

This software is licensed under the terms of GNU General Public License, Version 3.0.
You can find a copy of the license in the LICENSE file in the root folder.

  • Widevine Icon © Google.
  • Props to the awesome community for their shared research and insight into the Widevine Protocol and Key Derivation.

© rlaphoenix 2022-2023 DevLARLEY 2025-2025

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pywidevinex-1.8.3.tar.gz (63.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pywidevinex-1.8.3-py3-none-any.whl (70.2 kB view details)

Uploaded Python 3

File details

Details for the file pywidevinex-1.8.3.tar.gz.

File metadata

  • Download URL: pywidevinex-1.8.3.tar.gz
  • Upload date:
  • Size: 63.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for pywidevinex-1.8.3.tar.gz
Algorithm Hash digest
SHA256 7e299873b2197c6ffb6c65ea35cd3087e7c3d71d65bbf14040ec2e2166d4bcda
MD5 6d0df470e9da459732f3d128c34bdb4b
BLAKE2b-256 d867a23bf01770f0d392e4dbe8624543234cebef6c794042085f92e9ef5a56c4

See more details on using hashes here.

File details

Details for the file pywidevinex-1.8.3-py3-none-any.whl.

File metadata

  • Download URL: pywidevinex-1.8.3-py3-none-any.whl
  • Upload date:
  • Size: 70.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for pywidevinex-1.8.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ed559a24ce6ed92bb0d8be7c64354ad7cc031240ed4007710cbd324a4a5e9a91
MD5 d2e58ad1e2daef564900dd9a2b4961e1
BLAKE2b-256 162dc3b1867e173a7464498168058d3530d584858d91e1b21c887bbb0f5c4d5d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page