Files
unshackle/reference/api/drm/index.html
T
2026-09-07 02:17:11 +00:00

5649 lines
137 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Movie, TV, and Music archival software. User guide and REST API reference">
<link rel="canonical" href="https://docs.unshackle.dev/reference/api/drm/">
<link rel="prev" href="../titles/">
<link rel="icon" href="../../../assets/favicon.svg">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>DRM - unshackle</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.ec1eaa64.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../assets/_mkdocstrings.css">
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#drm-api" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="unshackle" class="md-header__button md-logo" aria-label="unshackle" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m800-274-80-80v-206H514l-80-80h166v-80q0-50-34.5-85T481-840q-50 0-84 34.5T363-720v9l-73-73q22-61 75-98.5T481-920q83 0 141 58.5T680-720v80h40q33 0 56.5 23.5T800-560v286Zm20 246-62-62q-11 5-20 7.5T720-80H240q-33 0-56.5-23.5T160-160v-400q0-25 14.5-46t37.5-30L28-820l56-56L876-84l-56 56ZM686-160 539-309q-11 11-25.5 17t-31.5 6q-33 0-56.5-23.5T402-366q0-17 6-31.5t17-25.5L286-560h-46v400h446ZM486-360Zm131-97Z"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
unshackle
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
DRM
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="indigo" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/unshackle-dl/unshackle" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
unshackle-dl/unshackle
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../../getting-started/installation/" class="md-tabs__link">
Getting Started
</a>
</li>
<li class="md-tabs__item">
<a href="../../../guide/downloading/" class="md-tabs__link">
User Guide
</a>
</li>
<li class="md-tabs__item">
<a href="../../configuration/" class="md-tabs__link">
Configuration
</a>
</li>
<li class="md-tabs__item">
<a href="../../../dev/creating-a-service/" class="md-tabs__link">
Developer
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../service/" class="md-tabs__link">
API Reference
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="unshackle" class="md-nav__button md-logo" aria-label="unshackle" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m800-274-80-80v-206H514l-80-80h166v-80q0-50-34.5-85T481-840q-50 0-84 34.5T363-720v9l-73-73q22-61 75-98.5T481-920q83 0 141 58.5T680-720v80h40q33 0 56.5 23.5T800-560v286Zm20 246-62-62q-11 5-20 7.5T720-80H240q-33 0-56.5-23.5T160-160v-400q0-25 14.5-46t37.5-30L28-820l56-56L876-84l-56 56ZM686-160 539-309q-11 11-25.5 17t-31.5 6q-33 0-56.5-23.5T402-366q0-17 6-31.5t17-25.5L286-560h-46v400h446ZM486-360Zm131-97Z"/></svg>
</a>
unshackle
</label>
<div class="md-nav__source">
<a href="https://github.com/unshackle-dl/unshackle" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
unshackle-dl/unshackle
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Getting Started
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../getting-started/installation/" class="md-nav__link">
<span class="md-ellipsis">
Installation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting-started/quickstart/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting-started/configuration-file/" class="md-nav__link">
<span class="md-ellipsis">
The Configuration File
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
User Guide
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
User Guide
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../guide/downloading/" class="md-nav__link">
<span class="md-ellipsis">
Downloading
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../guide/cli-reference/" class="md-nav__link">
<span class="md-ellipsis">
CLI Reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../guide/drm-and-cdm/" class="md-nav__link">
<span class="md-ellipsis">
DRM & CDM Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../guide/proxies-and-vpn/" class="md-nav__link">
<span class="md-ellipsis">
Proxies & VPN
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../guide/vaults/" class="md-nav__link">
<span class="md-ellipsis">
Key Vaults
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../guide/output-and-naming/" class="md-nav__link">
<span class="md-ellipsis">
Output & Naming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../guide/subtitles/" class="md-nav__link">
<span class="md-ellipsis">
Subtitles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../guide/troubleshooting/" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<div class="md-nav__link md-nav__container">
<a href="../../configuration/" class="md-nav__link ">
<span class="md-ellipsis">
Configuration
</span>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../configuration/directories/" class="md-nav__link">
<span class="md-ellipsis">
Directories
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/services/" class="md-nav__link">
<span class="md-ellipsis">
Services & Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/download/" class="md-nav__link">
<span class="md-ellipsis">
Download & Processing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/output/" class="md-nav__link">
<span class="md-ellipsis">
Output & Naming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/drm/" class="md-nav__link">
<span class="md-ellipsis">
DRM & CDM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/network/" class="md-nav__link">
<span class="md-ellipsis">
Network & Proxy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/vaults/" class="md-nav__link">
<span class="md-ellipsis">
Key Vaults
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/post-scripts/" class="md-nav__link">
<span class="md-ellipsis">
Post-Scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/misc/" class="md-nav__link">
<span class="md-ellipsis">
Other Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../configuration/example/" class="md-nav__link">
<span class="md-ellipsis">
Annotated Example
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Developer
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../dev/creating-a-service/" class="md-nav__link">
<span class="md-ellipsis">
Creating a Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../dev/service-architecture/" class="md-nav__link">
<span class="md-ellipsis">
Service Architecture
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_3" >
<div class="md-nav__link md-nav__container">
<a href="../../../dev/rest-api/" class="md-nav__link ">
<span class="md-ellipsis">
REST API
</span>
</a>
<label class="md-nav__link " for="__nav_5_3" id="__nav_5_3_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_3">
<span class="md-nav__icon md-icon"></span>
REST API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../dev/rest-api/quickstart/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../dev/rest-api/authentication/" class="md-nav__link">
<span class="md-ellipsis">
Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../dev/rest-api/endpoints/" class="md-nav__link">
<span class="md-ellipsis">
Endpoints
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../dev/rest-api/job-lifecycle/" class="md-nav__link">
<span class="md-ellipsis">
Job Lifecycle
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../dev/rest-api/dashboard/" class="md-nav__link">
<span class="md-ellipsis">
Dashboard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../dev/rest-api/remote-sessions/" class="md-nav__link">
<span class="md-ellipsis">
Remote Sessions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../dev/rest-api/errors/" class="md-nav__link">
<span class="md-ellipsis">
Error Responses
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-ellipsis">
API Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../service/" class="md-nav__link">
<span class="md-ellipsis">
Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../config/" class="md-nav__link">
<span class="md-ellipsis">
Config
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tracks/" class="md-nav__link">
<span class="md-ellipsis">
Tracks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../titles/" class="md-nav__link">
<span class="md-ellipsis">
Titles
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
DRM
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
DRM
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#unshackle.core.drm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;drm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ClearKey
</span>
</a>
<nav class="md-nav" aria-label=" ClearKey">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.warn_clear" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;warn_clear
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.from_m3u_key" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_m3u_key
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ClearKeyCENC
</span>
</a>
<nav class="md-nav" aria-label=" ClearKeyCENC">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.kid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;kid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Exceptions
</span>
</a>
<nav class="md-nav" aria-label=" Exceptions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.KIDNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;KIDNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.CEKNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CEKNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.EmptyLicense" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;EmptyLicense
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.to_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;to_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.get_license_challenge" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_license_challenge
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.get_content_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_content_keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.mp4decrypt_key_args" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mp4decrypt_key_args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;MonaLisa
</span>
</a>
<nav class="md-nav" aria-label=" MonaLisa">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.kid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;kid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.key" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;key
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.pssh" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;pssh
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.content_id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;content_id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.content_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;content_keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.key_pair" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;key_pair
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.Exceptions" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Exceptions
</span>
</a>
<nav class="md-nav" aria-label=" Exceptions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.Exceptions.TicketNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;TicketNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.Exceptions.KeyExtractionFailed" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;KeyExtractionFailed
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.extract_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.from_ticket" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_ticket
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.decrypt_segment" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_segment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;PlayReady
</span>
</a>
<nav class="md-nav" aria-label=" PlayReady">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.extract_kids_from_pssh_b64" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_kids_from_pssh_b64
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.to_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;to_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.extract_keys_from_cdm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_keys_from_cdm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.detect_revocation" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;detect_revocation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.mp4decrypt_key_args" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mp4decrypt_key_args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Widevine
</span>
</a>
<nav class="md-nav" aria-label=" Widevine">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.pssh" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;pssh
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.kid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;kid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.kids" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;kids
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Exceptions
</span>
</a>
<nav class="md-nav" aria-label=" Exceptions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions.PSSHNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;PSSHNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions.KIDNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;KIDNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions.CEKNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CEKNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions.EmptyLicense" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;EmptyLicense
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.from_track" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_track
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.from_init_data" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_init_data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.to_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;to_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.get_content_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_content_keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.mp4decrypt_key_args" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mp4decrypt_key_args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.drm_from_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;drm_from_dict
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#unshackle.core.drm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;drm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ClearKey
</span>
</a>
<nav class="md-nav" aria-label=" ClearKey">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.warn_clear" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;warn_clear
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKey.from_m3u_key" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_m3u_key
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ClearKeyCENC
</span>
</a>
<nav class="md-nav" aria-label=" ClearKeyCENC">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.kid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;kid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Exceptions
</span>
</a>
<nav class="md-nav" aria-label=" Exceptions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.KIDNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;KIDNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.CEKNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CEKNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.EmptyLicense" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;EmptyLicense
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.to_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;to_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.get_license_challenge" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_license_challenge
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.get_content_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_content_keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.mp4decrypt_key_args" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mp4decrypt_key_args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;MonaLisa
</span>
</a>
<nav class="md-nav" aria-label=" MonaLisa">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.kid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;kid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.key" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;key
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.pssh" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;pssh
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.content_id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;content_id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.content_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;content_keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.key_pair" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;key_pair
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.Exceptions" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Exceptions
</span>
</a>
<nav class="md-nav" aria-label=" Exceptions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.Exceptions.TicketNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;TicketNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.Exceptions.KeyExtractionFailed" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;KeyExtractionFailed
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.extract_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.from_ticket" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_ticket
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.decrypt_segment" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_segment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.MonaLisa.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;PlayReady
</span>
</a>
<nav class="md-nav" aria-label=" PlayReady">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.extract_kids_from_pssh_b64" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_kids_from_pssh_b64
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.to_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;to_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.extract_keys_from_cdm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_keys_from_cdm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.detect_revocation" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;detect_revocation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.mp4decrypt_key_args" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mp4decrypt_key_args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.PlayReady.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Widevine
</span>
</a>
<nav class="md-nav" aria-label=" Widevine">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.pssh" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;pssh
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.kid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;kid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.kids" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;kids
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Exceptions
</span>
</a>
<nav class="md-nav" aria-label=" Exceptions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions.PSSHNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;PSSHNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions.KIDNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;KIDNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions.CEKNotFound" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CEKNotFound
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.Exceptions.EmptyLicense" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;EmptyLicense
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.from_track" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_track
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.from_init_data" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_init_data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.to_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;to_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.get_content_keys" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_content_keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.mp4decrypt_key_args" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mp4decrypt_key_args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt_with_mp4decrypt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_mp4decrypt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.Widevine.decrypt_with_shaka_packager" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;decrypt_with_shaka_packager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.drm.drm_from_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;drm_from_dict
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="drm-api">DRM API<a class="headerlink" href="#drm-api" title="Permanent link">&para;</a></h1>
<p>Auto-generated reference for the DRM systems: Widevine, PlayReady, ClearKey, and related helpers.
For configuring DRM as a user, see <a href="../../../guide/drm-and-cdm/">DRM &amp; CDM Setup</a>.</p>
<div class="doc doc-object doc-module">
<a id="unshackle.core.drm"></a>
<div class="doc doc-contents first">
<div class="doc doc-children">
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.drm.ClearKey" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ClearKey</span>
<a href="#unshackle.core.drm.ClearKey" class="headerlink" title="Permanent link">&para;</a></h2>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">ClearKey</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">iv</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>AES-128 ClearKey (HLS) DRM system.</p>
<p>Give the IV where possible. If you do not give an IV, unshackle sets it to
of the same bit-size as the content key.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKey.warn_clear" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">warn_clear</span>
<a href="#unshackle.core.drm.ClearKey.warn_clear" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">warn_clear</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Warn once per track that unshackle passed a segment through undecrypted.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKey.decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt</span>
<a href="#unshackle.core.drm.ClearKey.decrypt" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt a Track with AES-128 ClearKey (HLS) DRM.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKey.from_m3u_key" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">from_m3u_key</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#unshackle.core.drm.ClearKey.from_m3u_key" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">from_m3u_key</span><span class="p">(</span><span class="n">m3u_key</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Load a ClearKey from an M3U(8) Playlist's EXT-X-KEY.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>m3u_key</code>
</td>
<td>
<code><span title="m3u8.model.Key">Key</span></code>
</td>
<td>
<div class="doc-md-description">
<p>A <code>Key</code> object parsed from a m3u(8) playlist using
the <code>m3u8</code> library.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>session</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="requests.Session">Session</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional HTTP session used to request external URIs with.
Useful to set headers, proxies, cookies, and so forth.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.drm.ClearKeyCENC" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ClearKeyCENC</span>
<a href="#unshackle.core.drm.ClearKeyCENC" class="headerlink" title="Permanent link">&para;</a></h2>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">ClearKeyCENC</span><span class="p">(</span><span class="n">kids</span><span class="p">,</span> <span class="n">laurl</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">content_keys</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>W3C EME ClearKey (org.w3.clearkey) DRM System over MPEG-CENC tracks.</p>
<p>Distinct from the HLS AES-128 <code>ClearKey</code> class: a license server gives the keys
here as a JWK Set keyed by KID, and the media is standard CENC
(decrypted with shaka-packager/mp4decrypt KID:KEY pairs, same as Widevine).</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.ClearKeyCENC.kid" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">kid</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.ClearKeyCENC.kid" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">kid</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get first Key ID, if any.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="unshackle.core.drm.ClearKeyCENC.Exceptions" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Exceptions</span>
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc doc-contents ">
<div class="doc doc-children">
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.ClearKeyCENC.Exceptions.KIDNotFound" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">KIDNotFound</span>
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.KIDNotFound" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>KID (Encryption Key ID) was not found.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.ClearKeyCENC.Exceptions.CEKNotFound" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">CEKNotFound</span>
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.CEKNotFound" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>CEK (Content Encryption Key) for KID was not found in License.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.ClearKeyCENC.Exceptions.EmptyLicense" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">EmptyLicense</span>
<a href="#unshackle.core.drm.ClearKeyCENC.Exceptions.EmptyLicense" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>License returned no Content Encryption Keys.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKeyCENC.to_dict" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">to_dict</span>
<a href="#unshackle.core.drm.ClearKeyCENC.to_dict" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">to_dict</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Serialise this DRM instance for export/import (KIDs + license URL).</p>
<p>unshackle stores the content keys once at the export's track level, and does not
duplicate them here.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKeyCENC.get_license_challenge" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get_license_challenge</span>
<a href="#unshackle.core.drm.ClearKeyCENC.get_license_challenge" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">get_license_challenge</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Assemble the W3C EME ClearKey JSON license request for the unkeyed KIDs.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKeyCENC.get_content_keys" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get_content_keys</span>
<a href="#unshackle.core.drm.ClearKeyCENC.get_content_keys" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">get_content_keys</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">licence</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get Content Keys for this DRM Instance from a ClearKey license server.</p>
<p>The licence param is a function. unshackle gives it the W3C JSON license
request as <code>challenge</code>. It may return the JWK Set license as a dict, JSON str,
or bytes. If it returns None and the manifest gave a Laurl, unshackle POSTs the
challenge there directly instead.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKeyCENC.decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt</span>
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt a Track with ClearKey DRM (standard CENC).
Args:
path: Path to the encrypted file to decrypt
Raises:
EnvironmentError if the required decryption executable could not be found.
ValueError if unshackle has not yet downloaded the track.
SubprocessError if the decryption process returned a non-zero exit code.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKeyCENC.mp4decrypt_key_args" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">mp4decrypt_key_args</span>
<a href="#unshackle.core.drm.ClearKeyCENC.mp4decrypt_key_args" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">mp4decrypt_key_args</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Build the mp4decrypt --key arguments for every content key.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKeyCENC.decrypt_with_mp4decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_mp4decrypt</span>
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt_with_mp4decrypt" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt_with_mp4decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt using mp4decrypt</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.ClearKeyCENC.decrypt_with_shaka_packager" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_shaka_packager</span>
<a href="#unshackle.core.drm.ClearKeyCENC.decrypt_with_shaka_packager" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt_with_shaka_packager</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt with shaka-packager</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.drm.MonaLisa" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MonaLisa</span>
<a href="#unshackle.core.drm.MonaLisa" class="headerlink" title="Permanent link">&para;</a></h2>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">MonaLisa</span><span class="p">(</span><span class="n">ticket</span><span class="p">,</span> <span class="n">device_path</span><span class="p">,</span> <span class="n">tool_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>MonaLisa DRM System.</p>
<p>Unlike Widevine/PlayReady, MonaLisa does not use a challenge/response flow
with a license server. Instead, the service API gives the PSSH value (ticket)
directly, and a WASM module extracts the content keys locally.</p>
<p>Initialise MonaLisa DRM.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>ticket</code>
</td>
<td>
<code><span title="typing.Union">Union</span>[<span title="str">str</span>, <span title="bytes">bytes</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>PSSH value from service API (base64 string or raw bytes).</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>device_path</code>
</td>
<td>
<code><span title="pathlib.Path">Path</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Path to the CDM device file (.mld).</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>tool_path</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="pathlib.Path">Path</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional path to an external decryption binary.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>**kwargs</code>
</td>
<td>
<code><span title="typing.Any">Any</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Additional metadata stored in self.data.</p>
</div>
</td>
<td>
<code>{}</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Raises:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="TicketNotFound">TicketNotFound</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If ticket/PSSH is empty.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="KeyExtractionFailed">KeyExtractionFailed</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If content key extraction fails.</p>
</div>
</td>
</tr>
</tbody>
</table>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.MonaLisa.kid" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">kid</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.MonaLisa.kid" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">kid</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get the Key ID.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.MonaLisa.key" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">key</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.MonaLisa.key" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">key</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get the content key as hex string.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.MonaLisa.pssh" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">pssh</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.MonaLisa.pssh" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">pssh</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get the raw PSSH/ticket value as a string.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The raw PSSH value as a base64 string.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.MonaLisa.content_id" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">content_id</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.MonaLisa.content_id" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">content_id</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract the Content ID from the PSSH for display.</p>
<p>The PSSH contains an embedded Content ID at bytes 21-75 with format:
H5DCID-V3-P1-YYYYMMDD-HHMMSS-MEDIAID-TIMESTAMP-SUFFIX</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The Content ID string if extractable, None otherwise.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.MonaLisa.content_keys" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">content_keys</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.MonaLisa.content_keys" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">content_keys</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get content keys in the same format as Widevine/PlayReady.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="dict">dict</span>[<span title="uuid.UUID">UUID</span>, <span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping KID to the content key hex string.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.MonaLisa.key_pair" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">key_pair</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.MonaLisa.key_pair" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">key_pair</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The formatted <code>KID:KEY</code> for CLI decryptors (32hex:32hex).</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="unshackle.core.drm.MonaLisa.Exceptions" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Exceptions</span>
<a href="#unshackle.core.drm.MonaLisa.Exceptions" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc doc-contents ">
<div class="doc doc-children">
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.MonaLisa.Exceptions.TicketNotFound" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">TicketNotFound</span>
<a href="#unshackle.core.drm.MonaLisa.Exceptions.TicketNotFound" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>Raised when the caller gives no PSSH/ticket data.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.MonaLisa.Exceptions.KeyExtractionFailed" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">KeyExtractionFailed</span>
<a href="#unshackle.core.drm.MonaLisa.Exceptions.KeyExtractionFailed" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>Raised when content key extraction from the ticket fails.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.MonaLisa.extract_keys" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">extract_keys</span>
<a href="#unshackle.core.drm.MonaLisa.extract_keys" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">extract_keys</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract keys from the ticket using the MonaLisa CDM.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.MonaLisa.from_ticket" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">from_ticket</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#unshackle.core.drm.MonaLisa.from_ticket" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">from_ticket</span><span class="p">(</span><span class="n">ticket</span><span class="p">,</span> <span class="n">device_path</span><span class="p">,</span> <span class="n">tool_path</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Make a MonaLisa DRM instance from a PSSH/ticket.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>ticket</code>
</td>
<td>
<code><span title="typing.Union">Union</span>[<span title="str">str</span>, <span title="bytes">bytes</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>PSSH value from service API.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>device_path</code>
</td>
<td>
<code><span title="pathlib.Path">Path</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Path to the CDM device file (.mld).</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>tool_path</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="pathlib.Path">Path</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional path to an external decryption binary.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="&lt;code class=&quot;doc-symbol doc-symbol-heading doc-symbol-class&quot;&gt;&lt;/code&gt; &lt;span class=&quot;doc doc-object-name doc-class-name&quot;&gt;MonaLisa&lt;/span&gt; (&lt;code&gt;unshackle.core.drm.monalisa.MonaLisa&lt;/code&gt;)" href="#unshackle.core.drm.MonaLisa">MonaLisa</a></code>
</td>
<td>
<div class="doc-md-description">
<p>MonaLisa DRM instance with extracted keys.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.MonaLisa.decrypt_segment" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_segment</span>
<a href="#unshackle.core.drm.MonaLisa.decrypt_segment" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt_segment</span><span class="p">(</span><span class="n">segment_path</span><span class="p">,</span> <span class="n">output_path</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt an individual segment file using the configured CLI tool via subprocess.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>segment_path</code>
</td>
<td>
<code><span title="pathlib.Path">Path</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Path to the segment file to decrypt.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>output_path</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="pathlib.Path">Path</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional path for the decrypted output segment.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.MonaLisa.decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt</span>
<a href="#unshackle.core.drm.MonaLisa.decrypt" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">output_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">is_segment</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt a media file (segment or track) using the configured CLI tool via subprocess.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>path</code>
</td>
<td>
<code><span title="pathlib.Path">Path</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Path to the target file to decrypt.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>output_path</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="pathlib.Path">Path</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional path for the decrypted output file.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>is_segment</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Set True if this is an individual segment rather than a full track.</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.drm.PlayReady" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">PlayReady</span>
<a href="#unshackle.core.drm.PlayReady" class="headerlink" title="Permanent link">&para;</a></h2>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">PlayReady</span><span class="p">(</span><span class="n">pssh</span><span class="p">,</span> <span class="n">kid</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">pssh_b64</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>PlayReady DRM System.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.extract_kids_from_pssh_b64" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">extract_kids_from_pssh_b64</span>
<a href="#unshackle.core.drm.PlayReady.extract_kids_from_pssh_b64" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">extract_kids_from_pssh_b64</span><span class="p">(</span><span class="n">pssh_b64</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract all KIDs from base64-encoded PSSH data.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.to_dict" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">to_dict</span>
<a href="#unshackle.core.drm.PlayReady.to_dict" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">to_dict</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Serialise this DRM instance for export/import (PSSH + KIDs).</p>
<p>unshackle stores the content keys once at the export's track level, and does not
duplicate them here.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.extract_keys_from_cdm" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">extract_keys_from_cdm</span>
<a href="#unshackle.core.drm.PlayReady.extract_keys_from_cdm" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">extract_keys_from_cdm</span><span class="p">(</span><span class="n">cdm</span><span class="p">,</span> <span class="n">session_id</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract keys from CDM session with cross-library compatibility.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>cdm</code>
</td>
<td>
<code><span title="pyplayready.cdm.Cdm">Cdm</span></code>
</td>
<td>
<div class="doc-md-description">
<p>CDM instance</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>session_id</code>
</td>
<td>
<code><span title="bytes">bytes</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Session identifier</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="dict">dict</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping KID UUIDs to hex keys</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.detect_revocation" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">detect_revocation</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.drm.PlayReady.detect_revocation" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">detect_revocation</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the decoded error string if a revocation HRESULT is present, else None.</p>
<p>Reads the code from the raw SOAP body (<StatusCode>0x8004C065</StatusCode>)
or from an exception message that carries it, so this method covers any service.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt</span>
<a href="#unshackle.core.drm.PlayReady.decrypt" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt a Track with PlayReady DRM.
Args:
path: Path to the encrypted file to decrypt
Raises:
EnvironmentError if the required decryption executable could not be found.
ValueError if unshackle has not yet downloaded the track.
SubprocessError if the decryption process returned a non-zero exit code.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.mp4decrypt_key_args" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">mp4decrypt_key_args</span>
<a href="#unshackle.core.drm.PlayReady.mp4decrypt_key_args" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">mp4decrypt_key_args</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Build the mp4decrypt --key arguments for every content key.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.decrypt_with_mp4decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_mp4decrypt</span>
<a href="#unshackle.core.drm.PlayReady.decrypt_with_mp4decrypt" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt_with_mp4decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt using mp4decrypt</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.PlayReady.decrypt_with_shaka_packager" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_shaka_packager</span>
<a href="#unshackle.core.drm.PlayReady.decrypt_with_shaka_packager" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt_with_shaka_packager</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt with shaka-packager (original method)</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.drm.Widevine" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Widevine</span>
<a href="#unshackle.core.drm.Widevine" class="headerlink" title="Permanent link">&para;</a></h2>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">Widevine</span><span class="p">(</span><span class="n">pssh</span><span class="p">,</span> <span class="n">kid</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Widevine DRM System.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.Widevine.pssh" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">pssh</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.Widevine.pssh" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">pssh</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get Protection System Specific Header Box.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.Widevine.kid" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">kid</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.Widevine.kid" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">kid</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get first Key ID, if any.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.drm.Widevine.kids" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">kids</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.drm.Widevine.kids" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">kids</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get all Key IDs from PSSH, falling back to the externally provided KID.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="unshackle.core.drm.Widevine.Exceptions" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Exceptions</span>
<a href="#unshackle.core.drm.Widevine.Exceptions" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc doc-contents ">
<div class="doc doc-children">
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.Widevine.Exceptions.PSSHNotFound" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">PSSHNotFound</span>
<a href="#unshackle.core.drm.Widevine.Exceptions.PSSHNotFound" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>PSSH (Protection System Specific Header) was not found.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.Widevine.Exceptions.KIDNotFound" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">KIDNotFound</span>
<a href="#unshackle.core.drm.Widevine.Exceptions.KIDNotFound" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>KID (Encryption Key ID) was not found.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.Widevine.Exceptions.CEKNotFound" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">CEKNotFound</span>
<a href="#unshackle.core.drm.Widevine.Exceptions.CEKNotFound" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>CEK (Content Encryption Key) for KID was not found in License.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h4 id="unshackle.core.drm.Widevine.Exceptions.EmptyLicense" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">EmptyLicense</span>
<a href="#unshackle.core.drm.Widevine.Exceptions.EmptyLicense" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="Exception">Exception</span></code></p>
<p>License returned no Content Encryption Keys.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.from_track" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">from_track</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#unshackle.core.drm.Widevine.from_track" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">from_track</span><span class="p">(</span><span class="n">track</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get PSSH and KID from within the Initiation Segment of the Track Data.
It also tries to get PSSH and KID from other track data like M3U8 data
as well as through FFprobe.</p>
<p>Make a Widevine DRM System object from a track's information.
Use this method only when a PSSH cannot be given directly.
It is <em>rare</em> to need to use this.</p>
<p>You can give your own <code>requests.Session</code> to use custom headers
and more.</p>
<p><span class="doc-section-title">Raises:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="PSSHNotFound">PSSHNotFound</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the PSSH was not found within the data.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="KIDNotFound">KIDNotFound</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the KID was not found within the data or PSSH.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.from_init_data" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">from_init_data</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#unshackle.core.drm.Widevine.from_init_data" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">from_init_data</span><span class="p">(</span><span class="n">init_data</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get PSSH and KID from within Initialization Segment Data.</p>
<p>Use this method only when a PSSH cannot be given directly.
It is <em>rare</em> to need to use this.</p>
<p><span class="doc-section-title">Raises:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="PSSHNotFound">PSSHNotFound</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the PSSH was not found within the data.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="KIDNotFound">KIDNotFound</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the KID was not found within the data or PSSH.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.to_dict" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">to_dict</span>
<a href="#unshackle.core.drm.Widevine.to_dict" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">to_dict</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Serialise this DRM instance for export/import (PSSH + KIDs).</p>
<p>unshackle stores the content keys once at the export's track level, and does not
duplicate them here.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.get_content_keys" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get_content_keys</span>
<a href="#unshackle.core.drm.Widevine.get_content_keys" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">get_content_keys</span><span class="p">(</span><span class="n">cdm</span><span class="p">,</span> <span class="n">certificate</span><span class="p">,</span> <span class="n">licence</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Make a CDM Session and get Content Keys for this DRM Instance.
The certificate and license params are functions. unshackle gives them
the challenge and the session ID.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt</span>
<a href="#unshackle.core.drm.Widevine.decrypt" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt a Track with Widevine DRM.
Args:
path: Path to the encrypted file to decrypt
Raises:
EnvironmentError if the required decryption executable could not be found.
ValueError if unshackle has not yet downloaded the track.
SubprocessError if the decryption process returned a non-zero exit code.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.mp4decrypt_key_args" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">mp4decrypt_key_args</span>
<a href="#unshackle.core.drm.Widevine.mp4decrypt_key_args" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">mp4decrypt_key_args</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Build the mp4decrypt --key arguments for every content key.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.decrypt_with_mp4decrypt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_mp4decrypt</span>
<a href="#unshackle.core.drm.Widevine.decrypt_with_mp4decrypt" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt_with_mp4decrypt</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt using mp4decrypt</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.drm.Widevine.decrypt_with_shaka_packager" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">decrypt_with_shaka_packager</span>
<a href="#unshackle.core.drm.Widevine.decrypt_with_shaka_packager" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">decrypt_with_shaka_packager</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decrypt with shaka-packager (original method)</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h2 id="unshackle.core.drm.drm_from_dict" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">drm_from_dict</span>
<a href="#unshackle.core.drm.drm_from_dict" class="headerlink" title="Permanent link">&para;</a></h2>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">drm_from_dict</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Reconstruct a Widevine/PlayReady/ClearKeyCENC DRM instance from its <code>to_dict()</code> form.</p>
<p>Rebuilds the PSSH from the stored base64 (KIDs for ClearKey, which has no PSSH)
and re-injects any saved content keys so the resulting object can decrypt without
contacting a license server.</p>
</div>
</div>
</div>
</div>
</div>
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../titles/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Titles">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
Titles
</div>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "content.tooltips", "navigation.footer", "navigation.indexes", "navigation.sections", "navigation.tabs", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../../assets/javascripts/bundle.d7400e89.min.js"></script>
</body>
</html>