Files
unshackle/reference/api/tracks/index.html
T
2026-10-31 05:41:08 +00:00

9511 lines
294 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/tracks/">
<link rel="prev" href="../config/">
<link rel="next" href="../titles/">
<link rel="icon" href="../../../assets/favicon.svg">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.8.0">
<title>Tracks - unshackle</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.57a0d79d.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.fb2fffe2.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">
<link rel="stylesheet" href="../../../assets/extra.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="#tracks-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">
Tracks
</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 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">
Tracks
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Tracks
</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.tracks" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;tracks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Attachment
</span>
</a>
<nav class="md-nav" aria-label=" Attachment">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment.id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment.download" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;download
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment.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.tracks.Attachment.delete" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;delete
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment.from_url" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_url
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Audio
</span>
</a>
<nav class="md-nav" aria-label=" Audio">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.atmos" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;atmos
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.parse_channels" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;parse_channels
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.dolby_channel_layout" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dolby_channel_layout
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.channels_from_count" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;channels_from_count
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.channel_total" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;channel_total
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.to_music_container" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;to_music_container
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.get_track_name" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_track_name
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapter" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Chapter
</span>
</a>
<nav class="md-nav" aria-label=" Chapter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapter.id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapter.named" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;named
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Chapters
</span>
</a>
<nav class="md-nav" aria-label=" Chapters">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.loads" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;loads
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.load" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;load
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.dumps" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dumps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.dump" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dump
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Hybrid
</span>
</a>
<nav class="md-nav" aria-label=" Hybrid">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.log" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;log
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.level_5" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;level_5
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.detect_active_area" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;detect_active_area
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.sanitize_l6" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_l6
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.level_6" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;level_6
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.extract_hdr10plus" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_hdr10plus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.probe_hdr_metadata" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;probe_hdr_metadata
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.convert_hdr10plus_to_dv" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;convert_hdr10plus_to_dv
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Subtitle
</span>
</a>
<nav class="md-nav" aria-label=" Subtitle">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.mux_language" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;mux_language
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.get_track_name" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_track_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.dash_offset_ms" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dash_offset_ms
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.rebase_ttml" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;rebase_ttml
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.mdat_payloads" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mdat_payloads
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.first_cue_start" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;first_cue_start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.unwrap_ism_ttml" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;unwrap_ism_ttml
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.strip_webvtt_cue_classes" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;strip_webvtt_cue_classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.strip_webvtt_timestamp_map" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;strip_webvtt_timestamp_map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt_timestamps" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_webvtt_timestamps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.has_webvtt_cue_identifiers" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;has_webvtt_cue_identifiers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt_cue_identifiers" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_webvtt_cue_identifiers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.parse_vtt_time" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;parse_vtt_time
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.has_overlapping_webvtt_cues" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;has_overlapping_webvtt_cues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.merge_overlapping_webvtt_cues" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;merge_overlapping_webvtt_cues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_webvtt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.convert" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;convert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.extract_fonts" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_fonts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sanitize_broken_webvtt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_broken_webvtt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.space_webvtt_headers" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;space_webvtt_headers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.merge_same_cues" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;merge_same_cues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.filter_unwanted_cues" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;filter_unwanted_cues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.merge_segmented_wvtt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;merge_segmented_wvtt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sample_slice" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sample_slice
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.trim" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;trim
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.strip_hearing_impaired" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;strip_hearing_impaired
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.reverse_rtl" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;reverse_rtl
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.DownloadContext" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;DownloadContext
</span>
</a>
<nav class="md-nav" aria-label=" DownloadContext">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.DownloadContext.ensure_session" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;ensure_session
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Track
</span>
</a>
<nav class="md-nav" aria-label=" Track">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.language" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;language
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.data" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.drm_preference" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;drm_preference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.mux_language" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;mux_language
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.sample_slice" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sample_slice
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.sample_byte_range" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sample_byte_range
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.can_sample" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;can_sample
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.add_init_drm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;add_init_drm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.prefers_playready" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;prefers_playready
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.download" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;download
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.move" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;move
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.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.tracks.Track.base_kwargs_from_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;base_kwargs_from_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.from_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.embedded_audio_name" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;embedded_audio_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.get_track_name" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_track_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.with_original_label" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;with_original_label
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.get_drm_for_cdm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_drm_for_cdm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.get_key_id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_key_id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.load_drm_if_needed" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;load_drm_if_needed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.load_drm_from_playlist" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;load_drm_from_playlist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.get_init_segment" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_init_segment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.repackage" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;repackage
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Tracks
</span>
</a>
<nav class="md-nav" aria-label=" Tracks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.sample_base" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;sample_base
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.exists" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;exists
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.add" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;add
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.signature" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;signature
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.dedupe" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dedupe
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.sort_videos" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sort_videos
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.sort_audio" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sort_audio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.sort_subtitles" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sort_subtitles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.filter" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.merge_video_selections" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;merge_video_selections
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.partition_hybrid_videos" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;partition_hybrid_videos
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.flag_hybrid_ingredients" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;flag_hybrid_ingredients
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.select_hybrid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;select_hybrid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.first_match_index" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;first_match_index
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.mux" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mux
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Video
</span>
</a>
<nav class="md-nav" aria-label=" Video">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.carries_hdr10plus" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;carries_hdr10plus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.finished_hybrid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;finished_hybrid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.range_label" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;range_label
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.Range" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Range
</span>
</a>
<nav class="md-nav" aria-label=" Range">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.Range.from_cicp" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_cicp
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.dv_fourccs" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dv_fourccs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.has_dv_codec" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;has_dv_codec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.is_dv_composite" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;is_dv_composite
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.change_color_range" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;change_color_range
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.vui_bsf" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;vui_bsf
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.normalize_vui" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;normalize_vui
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.vp9_colour_args" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;vp9_colour_args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.ccextractor" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;ccextractor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.extract_c608" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_c608
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.remove_eia_cc" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;remove_eia_cc
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</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">
<a href="../drm/" class="md-nav__link">
<span class="md-ellipsis">
DRM
</span>
</a>
</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.tracks" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;tracks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Attachment
</span>
</a>
<nav class="md-nav" aria-label=" Attachment">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment.id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment.download" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;download
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment.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.tracks.Attachment.delete" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;delete
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Attachment.from_url" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_url
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Audio
</span>
</a>
<nav class="md-nav" aria-label=" Audio">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.atmos" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;atmos
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.parse_channels" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;parse_channels
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.dolby_channel_layout" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dolby_channel_layout
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.channels_from_count" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;channels_from_count
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.channel_total" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;channel_total
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.to_music_container" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;to_music_container
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Audio.get_track_name" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_track_name
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapter" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Chapter
</span>
</a>
<nav class="md-nav" aria-label=" Chapter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapter.id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapter.named" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;named
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Chapters
</span>
</a>
<nav class="md-nav" aria-label=" Chapters">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.loads" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;loads
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.load" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;load
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.dumps" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dumps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Chapters.dump" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dump
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Hybrid
</span>
</a>
<nav class="md-nav" aria-label=" Hybrid">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.log" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;log
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.level_5" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;level_5
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.detect_active_area" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;detect_active_area
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.sanitize_l6" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_l6
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.level_6" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;level_6
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.extract_hdr10plus" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_hdr10plus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.probe_hdr_metadata" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;probe_hdr_metadata
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Hybrid.convert_hdr10plus_to_dv" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;convert_hdr10plus_to_dv
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Subtitle
</span>
</a>
<nav class="md-nav" aria-label=" Subtitle">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.mux_language" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;mux_language
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.get_track_name" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_track_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.dash_offset_ms" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dash_offset_ms
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.rebase_ttml" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;rebase_ttml
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.mdat_payloads" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mdat_payloads
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.first_cue_start" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;first_cue_start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.unwrap_ism_ttml" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;unwrap_ism_ttml
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.strip_webvtt_cue_classes" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;strip_webvtt_cue_classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.strip_webvtt_timestamp_map" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;strip_webvtt_timestamp_map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt_timestamps" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_webvtt_timestamps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.has_webvtt_cue_identifiers" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;has_webvtt_cue_identifiers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt_cue_identifiers" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_webvtt_cue_identifiers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.parse_vtt_time" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;parse_vtt_time
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.has_overlapping_webvtt_cues" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;has_overlapping_webvtt_cues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.merge_overlapping_webvtt_cues" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;merge_overlapping_webvtt_cues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_webvtt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.convert" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;convert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.extract_fonts" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_fonts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sanitize_broken_webvtt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sanitize_broken_webvtt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.space_webvtt_headers" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;space_webvtt_headers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.merge_same_cues" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;merge_same_cues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.filter_unwanted_cues" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;filter_unwanted_cues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.merge_segmented_wvtt" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;merge_segmented_wvtt
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.sample_slice" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sample_slice
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.trim" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;trim
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.strip_hearing_impaired" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;strip_hearing_impaired
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Subtitle.reverse_rtl" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;reverse_rtl
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.DownloadContext" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;DownloadContext
</span>
</a>
<nav class="md-nav" aria-label=" DownloadContext">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.DownloadContext.ensure_session" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;ensure_session
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Track
</span>
</a>
<nav class="md-nav" aria-label=" Track">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.language" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;language
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.data" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.drm_preference" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;drm_preference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.mux_language" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;mux_language
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.sample_slice" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sample_slice
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.sample_byte_range" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sample_byte_range
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.can_sample" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;can_sample
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.add_init_drm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;add_init_drm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.prefers_playready" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;prefers_playready
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.download" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;download
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.move" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;move
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.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.tracks.Track.base_kwargs_from_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;base_kwargs_from_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.from_dict" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_dict
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.embedded_audio_name" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;embedded_audio_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.get_track_name" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_track_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.with_original_label" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;with_original_label
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.get_drm_for_cdm" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_drm_for_cdm
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.get_key_id" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_key_id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.load_drm_if_needed" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;load_drm_if_needed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.load_drm_from_playlist" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;load_drm_from_playlist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.get_init_segment" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_init_segment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Track.repackage" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;repackage
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Tracks
</span>
</a>
<nav class="md-nav" aria-label=" Tracks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.sample_base" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;sample_base
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.exists" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;exists
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.add" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;add
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.signature" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;signature
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.dedupe" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dedupe
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.sort_videos" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sort_videos
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.sort_audio" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sort_audio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.sort_subtitles" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;sort_subtitles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.filter" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.merge_video_selections" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;merge_video_selections
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.partition_hybrid_videos" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;partition_hybrid_videos
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.flag_hybrid_ingredients" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;flag_hybrid_ingredients
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.select_hybrid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;select_hybrid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.first_match_index" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;first_match_index
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Tracks.mux" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;mux
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Video
</span>
</a>
<nav class="md-nav" aria-label=" Video">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.carries_hdr10plus" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;carries_hdr10plus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.finished_hybrid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;finished_hybrid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.range_label" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;range_label
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.Range" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Range
</span>
</a>
<nav class="md-nav" aria-label=" Range">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.Range.from_cicp" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;from_cicp
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.dv_fourccs" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dv_fourccs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.has_dv_codec" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;has_dv_codec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.is_dv_composite" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;is_dv_composite
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.change_color_range" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;change_color_range
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.vui_bsf" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;vui_bsf
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.normalize_vui" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;normalize_vui
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.vp9_colour_args" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;vp9_colour_args
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.ccextractor" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;ccextractor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.extract_c608" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;extract_c608
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.remove_eia_cc" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;remove_eia_cc
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="tracks-api">Tracks API<a class="headerlink" href="#tracks-api" title="Permanent link">&para;</a></h1>
<p>Auto-generated reference for the track model: <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;Tracks&lt;/span&gt;" href="#unshackle.core.tracks.Tracks"><code>Tracks</code></a>,
<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;Track&lt;/span&gt;" href="#unshackle.core.tracks.Track"><code>Track</code></a>, and the media-specific subclasses. See
<a href="../../../dev/service-architecture/">Service Architecture</a> for how these fit together.</p>
<div class="doc doc-object doc-module">
<a id="unshackle.core.tracks"></a>
<div class="doc doc-contents first">
<div class="doc doc-children">
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.Attachment" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Attachment</span>
<a href="#unshackle.core.tracks.Attachment" 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">Attachment</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">mime_type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">description</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Make a new Attachment.</p>
<p>If providing a path, the file must already exist.
If providing a URL, download() fetches the file during the download phase.
You must give either path or url.</p>
<p>If name is not provided it will use the file name (without extension).
If mime_type is not provided, it will try to guess it.</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="typing.Union">Union</span>[<span title="pathlib.Path">Path</span>, <span title="str">str</span>, None]</code>
</td>
<td>
<div class="doc-md-description">
<p>Path to an existing file.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>url</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>URL to download the attachment from.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>name</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Name of the attachment.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>mime_type</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>MIME type of the attachment.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>description</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Description of the attachment.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>session</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="unshackle.core.session.AnySession">AnySession</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional requests HTTP session to download the file with.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Attachment.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">id</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Attachment.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="nb">id</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Compute an ID from the attachment data.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Attachment.download" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">download</span>
<a href="#unshackle.core.tracks.Attachment.download" 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">download</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">no_proxy_download</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">proxy_download</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Download a URL-backed attachment to the temp directory.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Attachment.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.tracks.Attachment.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 a URL-backed attachment for export/import.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Attachment.delete" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">delete</span>
<a href="#unshackle.core.tracks.Attachment.delete" 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">delete</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Delete the file only if it is in the temp directory. Files in other locations belong to the user.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Attachment.from_url" 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_url</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Attachment.from_url" 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_url</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">url</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">mime_type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">description</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Make an attachment from a URL.</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>url</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>URL to download the attachment from.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>name</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Name of the attachment.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>mime_type</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>MIME type of the attachment.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>description</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Description of the attachment.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>session</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="unshackle.core.session.AnySession">AnySession</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional requests HTTP session to download the file with.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>Attachment</code></td> <td>
<code>&#39;Attachment&#39;</code>
</td>
<td>
<div class="doc-md-description">
<p>A new attachment instance.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.Audio" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Audio</span>
<a href="#unshackle.core.tracks.Audio" 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">Audio</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="o">*</span><span class="n">args</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">codec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">bitrate</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">channels</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">joc</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">descriptive</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <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;Track&lt;/span&gt; (&lt;code&gt;unshackle.core.tracks.track.Track&lt;/code&gt;)" href="#unshackle.core.tracks.Track">Track</a></code></p>
<p>Make a new Audio track object.</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>codec</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="unshackle.core.tracks.audio.Audio.Codec">Codec</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>An Audio.Codec enum representing the audio codec.
If not specified, unshackle uses MediaInfo to get the codec
after it downloads the track.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>bitrate</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="typing.Union">Union</span>[<span title="str">str</span>, <span title="int">int</span>, <span title="float">float</span>]]</code>
</td>
<td>
<div class="doc-md-description">
<p>A number or float representing the average bandwidth in bits/s.
unshackle rounds float values up to the nearest integer.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>channels</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="typing.Union">Union</span>[<span title="str">str</span>, <span title="int">int</span>, <span title="float">float</span>]]</code>
</td>
<td>
<div class="doc-md-description">
<p>A number, float, or string representing the number of audio channels.
Strings may represent numbers or floats. Expanded layouts like 7.1.1 is
not supported. All numbers and strings will be cast to float.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>joc</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="int">int</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The number of Joint-Object-Coding Channels/Objects in the audio track.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>descriptive</code>
</td>
<td>
<code><span title="typing.Union">Union</span>[<span title="bool">bool</span>, <span title="int">int</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Mark this audio as being descriptive audio for the blind.</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
</tbody>
</table>
<p>Note: If codec, bitrate, channels, or joc is not specified some checks may be
skipped or assume a value. Specifying as much information as possible is highly
recommended.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Audio.atmos" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">atmos</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Audio.atmos" 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">atmos</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return True if the audio track contains Atmos.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Audio.parse_channels" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">parse_channels</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Audio.parse_channels" 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">parse_channels</span><span class="p">(</span><span class="n">channels</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Converts a Channel string to a float representing the audio channel layout.
E.g. "3" -&gt; "3.0", "2.1" -&gt; "2.1", ".1" -&gt; "0.1".</p>
<p>An immersive layout names its height channels in a third figure, e.g. "5.1.4",
which no float can hold, so it stays the string it came as. Use channel_total for
arithmetic on either form.</p>
<p>This does not validate channel strings as genuine channel counts or valid layouts.
It does not convert the value to assume a sub speaker channel layout, e.g. 5.1-&gt;6.0.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Audio.dolby_channel_layout" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">dolby_channel_layout</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Audio.dolby_channel_layout" 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">dolby_channel_layout</span><span class="p">(</span><span class="n">mask</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Channel layout of a Dolby DASH channel configuration mask, e.g. 0xF801 -&gt; 5.1.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Audio.channels_from_count" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">channels_from_count</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Audio.channels_from_count" 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">channels_from_count</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Channel layout for a bare number of channels, as HLS CHANNELS, Smooth Streaming and most DASH schemes give it.</p>
<p>A count does not say which channel is the LFE, so 6, 7 and 8 take the 5.1, 6.1 and 7.1 layouts those streams
carry in practice. Any other value goes back as-is, for parse_channels to read.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Audio.channel_total" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">channel_total</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Audio.channel_total" 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">channel_total</span><span class="p">(</span><span class="n">channels</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Total number of channels in either channel form, so a caller can compare both.</p>
<p>A float layout keeps its own value, because a caller compares those by rounding
the sub channel up, e.g. 5.1 and 6.0 both match. An immersive layout has no such
float, so this adds its figures: "5.1.4" -&gt; 10.0.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Audio.to_music_container" 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_music_container</span>
<a href="#unshackle.core.tracks.Audio.to_music_container" 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_music_container</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Remux the track into the container of its codec, as a standalone audio file.</p>
<p>Music titles never reach the muxer, so the downloaded file is the delivered file, and
after decryption that is still a fragmented MP4. Its header states a length of zero, so
a player stops after the first fragment. FLAC inside an MP4 is also not a FLAC stream.
A rename cannot correct either fault. Returns True once the new file replaces the
downloaded one; every failure raises.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Audio.get_track_name" 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_track_name</span>
<a href="#unshackle.core.tracks.Audio.get_track_name" 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_track_name</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the base Track Name.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.Chapter" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Chapter</span>
<a href="#unshackle.core.tracks.Chapter" 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">Chapter</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="n">name</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 new Chapter with a Timestamp and optional name.</p>
<p>The timestamp may be in the following formats:
- "HH:MM:SS" string, e.g., <code>25:05:23</code>.
- "HH:MM:SS.mss" string, e.g., <code>25:05:23.120</code>.
- a timecode integer in milliseconds, e.g., <code>90323120</code> is <code>25:05:23.120</code>.
- a timecode float in seconds, e.g., <code>90323.12</code> is <code>25:05:23.120</code>.</p>
<p>If you have a timecode integer in seconds, multiply it by 1000.
If you have a timecode float in milliseconds (no decimal value), convert
it to an integer.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Chapter.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">id</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Chapter.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="nb">id</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Compute an ID from the Chapter data.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Chapter.named" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">named</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Chapter.named" 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">named</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>True if the Chapter has a name.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.Chapters" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Chapters</span>
<a href="#unshackle.core.tracks.Chapters" 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">Chapters</span><span class="p">(</span><span class="n">iterable</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="sortedcontainers.SortedKeyList">SortedKeyList</span></code>, <code><span title="abc.ABC">ABC</span></code></p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Chapters.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">id</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Chapters.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="nb">id</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Compute an ID from the Chapter data.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Chapters.loads" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">loads</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Chapters.loads" 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">loads</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Load chapter data from a string.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Chapters.load" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">load</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Chapters.load" 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">load</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Load chapter data from a file.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Chapters.dumps" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">dumps</span>
<a href="#unshackle.core.tracks.Chapters.dumps" 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">dumps</span><span class="p">(</span><span class="n">fallback_name</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return chapter data in OGM-based Simple Chapter format.
https://mkvtoolnix.download/doc/mkvmerge.html#mkvmerge.chapters.simple</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>fallback_name</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Name used for Chapters without a Name set.</p>
</div>
</td>
<td>
<code>&#39;&#39;</code>
</td>
</tr>
</tbody>
</table>
<p>The fallback name can use the following variables in f-string style:</p>
<ul>
<li>{i}: The Chapter number starting at 1.
E.g., <code>"Chapter {i}"</code>: "Chapter 1", "Intro", "Chapter 3".</li>
<li>{j}: A number starting at 1 that increments any time a Chapter has no name.
E.g., <code>"Chapter {j}"</code>: "Chapter 1", "Intro", "Chapter 2".</li>
</ul>
<p>unshackle formats these with f-strings, so format directives work.
For example, <code>"Chapter {i:02}"</code> will result in <code>"Chapter 01"</code>.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Chapters.dump" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">dump</span>
<a href="#unshackle.core.tracks.Chapters.dump" 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">dump</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="o">*</span><span class="n">args</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>Write chapter data in OGM-based Simple Chapter format to a file.</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="typing.Union">Union</span>[<span title="pathlib.Path">Path</span>, <span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The file path to write the Chapter data to, overwriting
any existing data.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p>See <code>Chapters.dumps</code> for more parameter documentation.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.Hybrid" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Hybrid</span>
<a href="#unshackle.core.tracks.Hybrid" 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">Hybrid</span><span class="p">(</span><span class="n">videos</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">output_name</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Hybrid.log" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">log</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
<a href="#unshackle.core.tracks.Hybrid.log" 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">log</span> <span class="o">=</span> <span class="n"><span title="logging">logging</span></span><span class="o">.</span><span class="n"><span title="logging.getLogger">getLogger</span></span><span class="p">(</span><span class="s1">'hybrid'</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Takes the Dolby Vision and HDR10(+) streams out of the VideoTracks.
It will then attempt to inject the Dolby Vision metadata layer to the HDR10(+) stream.
If no DV track is available but HDR10+ is present, it will convert HDR10+ to DV.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.level_5" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">level_5</span>
<a href="#unshackle.core.tracks.Hybrid.level_5" 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">level_5</span><span class="p">(</span><span class="n">crop</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Write the active area of the HDR10 track, as (left, top, right, bottom), to Level 5.</p>
<p>This resolves mismatches where DV has no black bars but HDR10 does (or vice versa)
by telling the display the correct active area.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.detect_active_area" 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_active_area</span>
<a href="#unshackle.core.tracks.Hybrid.detect_active_area" 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_active_area</span><span class="p">(</span><span class="n">input_video</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The picture's crop as (left, top, right, bottom) and its share of the frame, or None.</p>
<p>None also when the picture is under 40% of the frame: cropdetect on dark samples can report a tiny
picture, which would be wrong in L5 and would divide the HDR10+ conversion's mean by a tiny share.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.sanitize_l6" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sanitize_l6</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Hybrid.sanitize_l6" 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">sanitize_l6</span><span class="p">(</span><span class="n">max_mdl</span><span class="p">,</span> <span class="n">min_mdl</span><span class="p">,</span> <span class="n">max_cll</span><span class="p">,</span> <span class="n">max_fall</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Clamp static L6 values to a valid relationship.</p>
<p>MaxCLL must not exceed the mastering-display peak (some HDR10+ sources ship
MaxCLL 10000 on a 1000-nit master), and MaxFALL must not exceed
MaxCLL. A value of 0 means "unknown", and this method keeps it as-is.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.level_6" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">level_6</span>
<a href="#unshackle.core.tracks.Hybrid.level_6" 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">level_6</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Edit RPU Level 6 values using the static L6 luminance data from the RPU.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.extract_hdr10plus" 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_hdr10plus</span>
<a href="#unshackle.core.tracks.Hybrid.extract_hdr10plus" 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_hdr10plus</span><span class="p">(</span><span class="n">video</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract HDR10+ metadata from the video track</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.probe_hdr_metadata" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">probe_hdr_metadata</span>
<a href="#unshackle.core.tracks.Hybrid.probe_hdr_metadata" 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">probe_hdr_metadata</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract mastering display and Content Light Level metadata from the HDR10 track with FFprobe.</p>
<p>Returns (max_mdl, min_mdl, max_cll, max_fall) in dovi_tool level6 units:
- max_mdl: nits (integer)
- min_mdl: 0.0001 nit units (integer)
- max_cll / max_fall: nits (integer)</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Hybrid.convert_hdr10plus_to_dv" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">convert_hdr10plus_to_dv</span>
<a href="#unshackle.core.tracks.Hybrid.convert_hdr10plus_to_dv" 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">convert_hdr10plus_to_dv</span><span class="p">(</span><span class="n">active_fraction</span><span class="o">=</span><span class="mf">1.0</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Generate a Dolby Vision RPU with one shot per HDR10+ scene.</p>
<p>By default unshackle builds the L1 of each shot itself (see hdr10plus_shots), because dovi_tool's
--hdr10plus-json sets L1 avg from the linear AverageMaxRGB and so makes most scenes too bright.
config.generate_dv_mode picks the L1 avg floor: v29 (about 2.4 nits, closest to the pixels) or v40
(about 10 nits, as in studio CM v4.0 RPUs). legacy hands the HDR10+ JSON to dovi_tool instead.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.Subtitle" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Subtitle</span>
<a href="#unshackle.core.tracks.Subtitle" 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">Subtitle</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="o">*</span><span class="n">args</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">codec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">cc</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">sdh</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">forced</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <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;Track&lt;/span&gt; (&lt;code&gt;unshackle.core.tracks.track.Track&lt;/code&gt;)" href="#unshackle.core.tracks.Track">Track</a></code></p>
<p>Make a new Subtitle track object.</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>codec</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="unshackle.core.tracks.subtitle.Subtitle.Codec">Codec</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>A Subtitle.Codec enum representing the subtitle format.
If not specified, unshackle uses MediaInfo to get the format
after it downloads the track.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>cc</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Closed Caption.
- Intended as if you could not hear the audio at all.
- Can have Sound as well as Dialogue, but does not have to.
- Original source would be from EIA-CC encoded video. Typically all
upper-case characters.
Indicators of it being CC without knowing original source:
- Extracted with CCExtractor, or
- &gt;&gt;&gt; (or similar) at the start of some or all lines, or
- All text is uppercase or at least the majority, or
- Subtitles use the scrolling-text style (one line appears, oldest
line then disappears).
The fact that you downloaded it as a SRT or VTT or such does not mean it
is not from an EIA-CC stream. And I would not take the streaming services
(CC) as gospel either as they tend to get it wrong too.</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>sdh</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Deaf or Hard-of-Hearing. Also known as HOH in the UK (EU?).
- Intended as if you could not hear the audio at all.
- MUST have Sound as well as Dialogue to count as SDH.
- It has no "syntax" or "format", but it is not transmitted in
archaic forms like EIA-CC streams. It is intended for transmission
through SubRip (SRT), WebVTT (VTT), TTML, and the other modern
subtitle formats.
If you can see important audio/sound transcriptions and not only dialogue
and it does not have the indicators of CC, then it is most likely SDH.
If it does not have important audio/sounds transcriptions it might only be
regular subtitling (you would not mark as CC or SDH). This would be the
case for most translation subtitles. Like Anime for example.</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>forced</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Typically used if there is important information at some point in time
like watching a Dubbed title and an important Sign or Letter is shown
or someone talking in a different language.
The Matroska Spec recommends that the player plays Forced tracks if
the player's current playback audio language matches a subtitle
marked as "forced".
However, that does not mean every player works like this but there is
no other way to reliably work with Forced subtitles where multiple
forced subtitles may be in the output file. Know what to expect
with "forced" subtitles.</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
</tbody>
</table>
<p>Note: If codec is not specified, unshackle can skip some checks or assume a value.
Give as much information as possible.</p>
<details class="information-on-subtitle-types" open>
<summary>Information on Subtitle Types</summary>
<p>https://bit.ly/2Oe4fLC (3PlayMedia Blog on SUB vs CC vs SDH).
However, I would not pay much attention to the claims about SDH needing to
be in the original language. It is logically not true.</p>
<p>CC == Closed Captions. Source: Every site.
SDH = Subtitles for the Deaf or Hard-of-Hearing. Source: Every site.
HOH = Exact same as SDH. Is a term used in the UK. Source: https://bit.ly/2PGJatz (ICO UK)</p>
<p>More in-depth information, examples, and stuff to look for can be found in the Parameter
explanation list above.</p>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Subtitle.mux_language" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">mux_language</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.mux_language" 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">mux_language</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The language tag written to the output file, with the script its region implies.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.get_track_name" 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_track_name</span>
<a href="#unshackle.core.tracks.Subtitle.get_track_name" 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_track_name</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the base Track Name.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.dash_offset_ms" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">dash_offset_ms</span>
<a href="#unshackle.core.tracks.Subtitle.dash_offset_ms" 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">dash_offset_ms</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The DASH presentationTimeOffset and one segment's length, in ms, from the merged SegmentTemplate.
Returns (0, 0) for a track that is not DASH or has no SegmentTemplate.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.rebase_ttml" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">rebase_ttml</span>
<a href="#unshackle.core.tracks.Subtitle.rebase_ttml" 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">rebase_ttml</span><span class="p">(</span><span class="n">offset_ms</span><span class="p">,</span> <span class="n">segment_ms</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Move the TTML cues back by offset_ms, under the same first-cue guard as rebase_webvtt.
A cue carried in from before the offset starts at 0; this method drops a cue that ends by then.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.mdat_payloads" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">mdat_payloads</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.mdat_payloads" 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">mdat_payloads</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The payload of every mdat box in a fragmented MP4 file, in file order.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.first_cue_start" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">first_cue_start</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.first_cue_start" 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">first_cue_start</span><span class="p">(</span><span class="n">caption_set</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The start of the first cue, in microseconds, looking past empty languages; None with no cues.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.unwrap_ism_ttml" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">unwrap_ism_ttml</span>
<a href="#unshackle.core.tracks.Subtitle.unwrap_ism_ttml" 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">unwrap_ism_ttml</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Convert ISM fTTML to TTML with every cue on the stream timeline, counted from its first fragment.
Smooth Streaming packagers often time the cues of a fragment from that fragment's start. A cue
that starts before the previous fragment does marks the stream as timed that way.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.strip_webvtt_cue_classes" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">strip_webvtt_cue_classes</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.strip_webvtt_cue_classes" 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">strip_webvtt_cue_classes</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Reduce a cue payload to the markup every target format shares: <code>&lt;i&gt;</code>, <code>&lt;b&gt;</code>
and <code>&lt;u&gt;</code> without their class list. It removes class spans (<code>&lt;c.foo&gt;</code>),
<code>&lt;v&gt;</code>, <code>&lt;lang&gt;</code>, <code>&lt;ruby&gt;</code>/<code>&lt;rt&gt;</code> and karaoke timestamps
(<code>&lt;00:00:01.000&gt;</code>).</p>
<p>A class only selects a CSS <code>::cue</code> rule that no player receives, so it never
carries styling, but it does break rendering. FFmpeg's SubRip reader treats a tag
name as a tag only while it matches <code>[0-9a-zA-Z_/]</code>. The dot fails that test, so
FFmpeg prints <code>&lt;i.loud&gt;</code> as cue text and then emits the closing italic-off with
nothing opened. FFmpeg's WebVTT reader matches <code>i</code>/<code>b</code>/<code>u</code> exactly and drops
the rest, so there a class silently loses the styling instead. The tags this
method removes outright are the ones both readers already discard, and that
libass would draw as text if a conversion carried them into ASS.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.strip_webvtt_timestamp_map" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">strip_webvtt_timestamp_map</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.strip_webvtt_timestamp_map" 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">strip_webvtt_timestamp_map</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Remove X-TIMESTAMP-MAP header lines (RFC 8216 §3.5, HLS only).</p>
<p>Cue times are already absolute, but SubtitleEdit reads the header and offsets
every cue by it during conversion.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.sanitize_webvtt_timestamps" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sanitize_webvtt_timestamps</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt_timestamps" 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">sanitize_webvtt_timestamps</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Fix invalid timestamps in WebVTT files, particularly negative timestamps.</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>text</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The WebVTT text as string</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="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Sanitized WebVTT text</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.has_webvtt_cue_identifiers" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">has_webvtt_cue_identifiers</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.has_webvtt_cue_identifiers" 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">has_webvtt_cue_identifiers</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Examine WebVTT text for cue identifiers that need removal.</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>text</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The WebVTT text as string</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="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>True if the text has cue identifiers, False otherwise</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.sanitize_webvtt_cue_identifiers" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sanitize_webvtt_cue_identifiers</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt_cue_identifiers" 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">sanitize_webvtt_cue_identifiers</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Remove WebVTT cue identifiers that can confuse subtitle parsers.</p>
<p>Some services use cue identifiers such as "Q0" and "Q1"
that appear on their own line before the timing line. These can be
incorrectly parsed as part of the previous cue's text by
some parsers (like pysubs2).</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>text</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The WebVTT text as string</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="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Sanitized WebVTT text with cue identifiers removed</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.parse_vtt_time" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">parse_vtt_time</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.parse_vtt_time" 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">parse_vtt_time</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Parse WebVTT timestamp to milliseconds. Returns 0 for malformed input.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.has_overlapping_webvtt_cues" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">has_overlapping_webvtt_cues</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.has_overlapping_webvtt_cues" 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">has_overlapping_webvtt_cues</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Examine WebVTT text for overlapping cues that need merging.</p>
<p>Detects cues with start times within 50ms of each other and the same end time,
which indicates multi-line subtitles split into separate cues.</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>text</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The WebVTT text as string</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="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>True if the text has overlapping cues, False otherwise</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.merge_overlapping_webvtt_cues" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">merge_overlapping_webvtt_cues</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.merge_overlapping_webvtt_cues" 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">merge_overlapping_webvtt_cues</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Merge WebVTT cues that have overlapping/near-identical times but different line positions.</p>
<p>Some services use separate cues for each line of a multi-line subtitle, with
slightly different start times (1ms apart) and different line: positions.
This merges them into single cues with proper line ordering based on the
line: position (lower percentage = higher on screen = first line).</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>text</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The WebVTT text as string</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="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>WebVTT text with overlapping cues merged</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.sanitize_webvtt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sanitize_webvtt</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.sanitize_webvtt" 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">sanitize_webvtt</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>More thorough sanitization of WebVTT files that corrects multiple potential issues.</p>
<p>This is lossy, so use it only as a fallback once normal parsing has failed. This method discards
everything before the WEBVTT header line and reduces the header itself to a bare "WEBVTT" line.
Negative timestamps become 00:00:00.000, and it pads timestamps that have no hours field to
HH:MM:SS.mmm.</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>text</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The WebVTT text as string</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="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Sanitized WebVTT text</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.convert" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">convert</span>
<a href="#unshackle.core.tracks.Subtitle.convert" 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">convert</span><span class="p">(</span><span class="n">codec</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">forced</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Convert this Subtitle to another format.</p>
<p>Backend selection is data-driven (see <code>tracks/subtitle_convert.py</code>): unshackle
uses the best available backend that can convert source-&gt;target, and falls back
through the capability chain on failure. The <code>conversion_method</code> config key
(<code>auto</code> | <code>subby</code> | <code>pysubs2</code> | <code>subtitleedit</code> | <code>pycaption</code>) pins the
backend, and <code>preferred_conversion_method</code> nudges it per-service. An explicit
config value always wins.</p>
<p><code>forced</code> marks an explicit user request (<code>--sub-format</code>). unshackle skips lossy
downconverts of styled formats (SSA/ASS -&gt; SRT) unless <code>forced</code> is True.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.extract_fonts" 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_fonts</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.extract_fonts" 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_fonts</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Font names referenced by an ASS/SSA subtitle.</p>
<p>Covers both sources that need attaching for correct rendering:
- the <code>Fontname</code> column of every <code>Style:</code> line in <code>[V4+ Styles]</code>/<code>[V4 Styles]</code>
(column located from the section's <code>Format:</code> line, not assumed by index), and
- inline <code>\fn</code> font overrides inside <code>Dialogue</code> override blocks.</p>
<p>This method removes a leading <code>@</code> (vertical-writing prefix), de-duplicates the
names case-insensitively, and prefers a mixed-case spelling over an all-lowercase one.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.sanitize_broken_webvtt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sanitize_broken_webvtt</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.sanitize_broken_webvtt" 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">sanitize_broken_webvtt</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Remove or fix corrupted WebVTT lines, particularly those with invalid timestamps.</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>text</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The WebVTT text as string</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="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Sanitized WebVTT text with corrupted lines removed</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.space_webvtt_headers" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">space_webvtt_headers</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.space_webvtt_headers" 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">space_webvtt_headers</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Space out the WEBVTT Headers from Captions.</p>
<p>Segmented VTT when merged may have the WEBVTT headers part of the next caption
as they were not separated far enough from the previous caption and ended up
as caption text rather than the header for the next segment.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.merge_same_cues" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">merge_same_cues</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.merge_same_cues" 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">merge_same_cues</span><span class="p">(</span><span class="n">caption_set</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Merge captions with the same timecodes and text as one in-place.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.filter_unwanted_cues" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">filter_unwanted_cues</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.filter_unwanted_cues" 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">filter_unwanted_cues</span><span class="p">(</span><span class="n">caption_set</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Filter out subtitle cues containing only &nbsp; or whitespace.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.merge_segmented_wvtt" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">merge_segmented_wvtt</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Subtitle.merge_segmented_wvtt" 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">merge_segmented_wvtt</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">period_start</span><span class="o">=</span><span class="mf">0.0</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Convert Segmented DASH WebVTT cues into a pycaption Caption List.
Also returns an ISO 639-2 alpha-3 language tag if available.</p>
<p>Code ported originally by xhlove to Python from shaka-player.
rlaphoenix has since improved it with pymp4 and
pycaption functions.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.sample_slice" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sample_slice</span>
<a href="#unshackle.core.tracks.Subtitle.sample_slice" 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">sample_slice</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">timescale</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">window</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the segments of <code>window</code> plus one segment on each side.</p>
<p>Cue times in a segment are absolute, so <code>sample_start</code> stays zero and <code>trim</code> makes the cut.
A track that ends before the window keeps only its last segment.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.trim" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">trim</span>
<a href="#unshackle.core.tracks.Subtitle.trim" 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">trim</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Keep the cues between <code>start</code> and <code>end</code> seconds and move them to start at zero.</p>
<p>Returns False and leaves the file whole when pysubs2 cannot read or write its format.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.strip_hearing_impaired" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">strip_hearing_impaired</span>
<a href="#unshackle.core.tracks.Subtitle.strip_hearing_impaired" 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">strip_hearing_impaired</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Remove the SDH captions.</p>
<p>The 'sdh_method' setting in config gives the SDH stripping method:
- 'auto' (default): Tries subby first, then SubtitleEdit, then filter-subs
- 'subby': Uses subby's SDHStripper
- 'subtitleedit': Uses SubtitleEdit when available
- 'filter-subs': Uses subtitle-filter library</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Subtitle.reverse_rtl" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">reverse_rtl</span>
<a href="#unshackle.core.tracks.Subtitle.reverse_rtl" 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">reverse_rtl</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Reverse RTL (Right to Left) Start/End on Captions.
Use this to fix the positioning of sentence-ending characters.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.DownloadContext" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">DownloadContext</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-dataclass"><code>dataclass</code></small>
</span>
<a href="#unshackle.core.tracks.DownloadContext" 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">DownloadContext</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">save_path</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">save_dir</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">progress</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">proxy</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">max_workers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="n">adaptive_workers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="n">download_processes</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="n">license_widevine</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="n">cdm</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Shared arguments passed to each manifest's <code>download_track</code>.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.DownloadContext.ensure_session" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">ensure_session</span>
<a href="#unshackle.core.tracks.DownloadContext.ensure_session" 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">ensure_session</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the HTTP session, or a new <code>Session</code> if none was set.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.Track" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Track</span>
<a href="#unshackle.core.tracks.Track" 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">Track</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">url</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">language</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">is_original_lang</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">descriptor</span><span class="o">=</span><span class="n"><span title="unshackle.core.tracks.track.Track.Descriptor.URL">URL</span></span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">needs_repack</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="n">drm</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="n">edition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="n">note</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a> <span class="n">downloader</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a> <span class="n">downloader_args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a> <span class="n">from_file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-16"><a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a> <span class="n">id_</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-17"><a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a> <span class="n">extra</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-18"><a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Track.language" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">language</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
<small class="doc doc-label doc-label-writable"><code>writable</code></small>
</span>
<a href="#unshackle.core.tracks.Track.language" 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">language</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The language the service tagged, parsed even when a service assigns a string or None later.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Track.data" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">data</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
<small class="doc doc-label doc-label-writable"><code>writable</code></small>
</span>
<a href="#unshackle.core.tracks.Track.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="n">data</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Arbitrary track data dictionary.</p>
<p>This uses a defaultdict with a dict as the factory for easier
nested saving and safer exists-checks.</p>
<p>Reserved keys:</p>
<ul>
<li>"hls" used by the HLS class.</li>
<li>playlist: m3u8.model.Playlist - The primary track information.</li>
<li>media: m3u8.model.Media - The audio/subtitle track information.</li>
<li>segment_durations: list[int] - A list of each segment's duration.</li>
<li>"dash" used by the DASH class.</li>
<li>manifest: lxml.ElementTree - DASH MPD manifest.</li>
<li>period: lxml.Element - The period of this track.</li>
<li>adaptation_set: lxml.Element - The adaptation set of this track.</li>
<li>representation: lxml.Element - The representation of this track.</li>
<li>timescale: int - The timescale of the track's segments.</li>
<li>segment_durations: list[int] - A list of each segment's duration.</li>
</ul>
<p>You should not add, change, or remove any data within reserved keys.
You may use their data, but note that these values can change or be removed
at any point.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Track.drm_preference" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">drm_preference</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
<small class="doc doc-label doc-label-writable"><code>writable</code></small>
</span>
<a href="#unshackle.core.tracks.Track.drm_preference" 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">drm_preference</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>DRM system this track must license with, one of the names in DRM_PREFERENCE_TYPES.</p>
<p>None (the default) lets the loaded CDM choose. Set it when the manifest advertises more
than one DRM system but only one of them licenses this track.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Track.mux_language" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">mux_language</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Track.mux_language" 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">mux_language</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The language tag written to the output file.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.sample_slice" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sample_slice</span>
<a href="#unshackle.core.tracks.Track.sample_slice" 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">sample_slice</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">timescale</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">window</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the slice of segments that hold <code>window</code>, from the start time of each segment.</p>
<p>Sets <code>sample_start</code> to the start time of the first kept segment, in seconds. A video keeps
<code>sample_tail</code> segments after the window: mkvmerge ends the cut only at a video keyframe, and
with no such keyframe the audio and the subtitles continue to their own end.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.sample_byte_range" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sample_byte_range</span>
<a href="#unshackle.core.tracks.Track.sample_byte_range" 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">sample_byte_range</span><span class="p">(</span><span class="n">session</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Find the bytes of a one-file track that hold the sample window.</p>
<p>Reads the start of the file for a <code>sidx</code> box. Returns the bytes before that box, which hold
the init data, and the byte range of the window. Returns None when the file has no such index.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.can_sample" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">can_sample</span>
<a href="#unshackle.core.tracks.Track.can_sample" 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">can_sample</span><span class="p">(</span><span class="n">session</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return False when a sample cannot cut this track, because it is one file with no segment index.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.add_init_drm" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">add_init_drm</span>
<a href="#unshackle.core.tracks.Track.add_init_drm" 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">add_init_drm</span><span class="p">(</span><span class="n">init_data</span><span class="p">,</span> <span class="n">cdm</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Add the Widevine and PlayReady DRM that the init segment carries and the track does not have.</p>
<p>A track with a different DRM type stays as it is. The DRM system that agrees with the CDM comes first.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.prefers_playready" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">prefers_playready</span>
<a href="#unshackle.core.tracks.Track.prefers_playready" 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">prefers_playready</span><span class="p">(</span><span class="n">cdm</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether to try PlayReady before Widevine. The track's preference wins over the loaded CDM.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.download" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">download</span>
<a href="#unshackle.core.tracks.Track.download" 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">download</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">session</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">prepare_drm</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">max_workers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">progress</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">cdm</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="n">no_proxy_download</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="n">proxy_download</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="n">adaptive_workers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="n">download_processes</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Download and optionally Decrypt this Track.</p>
<p>For a URL-descriptor Video or Audio track with no <code>drm</code> set, unshackle probes the DRM from the
track's init data and stores it on the track, so a service need not declare <code>drm</code> itself.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.move" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">move</span>
<a href="#unshackle.core.tracks.Track.move" 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">move</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Move the Track's file from current location, to target location.
This will overwrite anything at the target path.</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="TypeError">TypeError</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the target argument is not the expected type.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="ValueError">ValueError</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If track has no file to move, or the target does not exist.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="OSError">OSError</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the file somehow failed to move.</p>
</div>
</td>
</tr>
</tbody>
</table>
<p>Returns the new location of the track.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.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.tracks.Track.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 the track for export/import (identity/URL/descriptor/language).</p>
<p>DRM is not serialised here. The export writer attaches the licensed DRM + keys.
Subclasses add their own codec/quality fields.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.base_kwargs_from_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">base_kwargs_from_dict</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Track.base_kwargs_from_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">base_kwargs_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>Assemble the shared Track constructor kwargs from a <code>to_dict()</code> payload.</p>
<p>DRM is not reconstructed here: <code>to_dict</code> does not serialise it, and the import
flow attaches the licensed DRM + content keys separately.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.from_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">from_dict</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Track.from_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">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 the correct Track subclass from a <code>to_dict()</code> payload.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.embedded_audio_name" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">embedded_audio_name</span>
<a href="#unshackle.core.tracks.Track.embedded_audio_name" 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">embedded_audio_name</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Name the audio a service keeps inside this track's file, by its language when the service set none.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.get_track_name" 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_track_name</span>
<a href="#unshackle.core.tracks.Track.get_track_name" 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_track_name</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get the Track Name, or the name of its language when the service set none.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.with_original_label" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">with_original_label</span>
<a href="#unshackle.core.tracks.Track.with_original_label" 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">with_original_label</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Add <code>muxing.original_label</code> to the name of a track in the title's original language,
unless the name already contains the label's words.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.get_drm_for_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">get_drm_for_cdm</span>
<a href="#unshackle.core.tracks.Track.get_drm_for_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">get_drm_for_cdm</span><span class="p">(</span><span class="n">cdm</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the DRM matching the provided CDM, if available.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.get_key_id" 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_key_id</span>
<a href="#unshackle.core.tracks.Track.get_key_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="nf">get_key_id</span><span class="p">(</span><span class="n">init_data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</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>Probe the DRM encryption Key ID (KID) for this specific track.</p>
<p>It can find the Key ID by probing the track with FFprobe for
<code>enc_key_id</code> data, as well as for mp4 <code>tenc</code> (Track Encryption)
boxes.</p>
<p>It explicitly ignores PSSH information like the <code>PSSH</code> box, as the box
is likely to contain multiple Key IDs that may or may not be for this
specific track.</p>
<p>To retrieve the initialization segment, this method calls :meth:<code>get_init_segment</code>
with the positional and keyword arguments. This method then uses the return value
of <code>get_init_segment</code> to find the Key ID.</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="uuid.UUID">UUID</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The Key ID as a UUID object, or None if unshackle cannot find the Key ID.</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.load_drm_if_needed" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">load_drm_if_needed</span>
<a href="#unshackle.core.tracks.Track.load_drm_if_needed" 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">load_drm_if_needed</span><span class="p">(</span><span class="n">service</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 DRM information for this track if the parser deferred it.</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>service</code>
</td>
<td>
<code><span title="Service">Service</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Service instance that can fetch track-specific DRM info</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><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>True if the DRM loaded or is already present, False if the load failed</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.load_drm_from_playlist" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">load_drm_from_playlist</span>
<a href="#unshackle.core.tracks.Track.load_drm_from_playlist" 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">load_drm_from_playlist</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Fallback method to load DRM by fetching this track's individual playlist.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.get_init_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">get_init_segment</span>
<a href="#unshackle.core.tracks.Track.get_init_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">get_init_segment</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">maximum_size</span><span class="o">=</span><span class="mi">20000</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">byte_range</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Get the Track's initial segment data.</p>
<p>HLS and DASH tracks must explicitly give a URL to the init segment or file.
Give the byte-range for the init segment where possible.</p>
<p>If <code>byte_range</code> is not set, it will make a HEAD request and examine the size of
the file. If it cannot find the size, it will download up to the first
20KB only, which should contain the entirety of the init segment. You may
override this by changing the <code>maximum_size</code>.</p>
<p>The default maximum_size of 20000 (20KB) is a tried-and-tested value that
seems to work well across the board.</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>maximum_size</code>
</td>
<td>
<code><span title="int">int</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Size to assume as the response body length if byte-range is
not used, if unshackle cannot find the body size, or if the body size
is larger than it. Use a value of 20000 (20KB) or higher.</p>
</div>
</td>
<td>
<code>20000</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>url</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Explicit init map or file URL to probe from.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>byte_range</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Range of bytes to download from the explicit or implicit URL.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>session</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="unshackle.core.session.AnySession">AnySession</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>HTTP session context, for example authorization and headers.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Track.repackage" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">repackage</span>
<a href="#unshackle.core.tracks.Track.repackage" 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">repackage</span><span class="p">(</span><span class="n">bsf_v</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Remux the track with FFmpeg <code>-c copy</code>.</p>
<p>A given <code>bsf_v</code> goes into the same pass as <code>-bsf:v</code>, which normalises video VUI
colour metadata without a second full-file remux. Repackaging is mandatory. The
bitstream filter is best-effort: if the combined pass fails, and it is not the
AAC-retry case, unshackle tries it again once without <code>bsf_v</code> so the remux still
succeeds. Returns True if unshackle applied the requested <code>bsf_v</code> (always False
when <code>bsf_v</code> is None, because the caller requested nothing).</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h2 id="unshackle.core.tracks.Tracks" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Tracks</span>
<a href="#unshackle.core.tracks.Tracks" 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">Tracks</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">manifest_url</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Video, Audio, Subtitle, Chapter, and Attachment Track Store.
It provides convenience functions for listing, sorting, and selecting tracks.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Tracks.sample_base" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">sample_base</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Tracks.sample_base" 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">sample_base</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The earliest <code>sample_start</code> of the video and audio tracks, which a sample mux uses as time zero.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.exists" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">exists</span>
<a href="#unshackle.core.tracks.Tracks.exists" 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">exists</span><span class="p">(</span><span class="n">by_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">by_url</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Examine whether a track already exists, by various methods.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.add" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">add</span>
<a href="#unshackle.core.tracks.Tracks.add" 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">add</span><span class="p">(</span><span class="n">tracks</span><span class="p">,</span> <span class="n">warn_only</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Add a provided track to its appropriate array.</p>
<p>A track whose ID is already in the collection raises ValueError. With <code>warn_only</code>
set, this method skips such a track and logs how many it skipped.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.signature" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">signature</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Tracks.signature" 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">signature</span><span class="p">(</span><span class="n">track</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The attributes that listing and selection read. Two tracks with one signature look and select the same.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.dedupe" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">dedupe</span>
<a href="#unshackle.core.tracks.Tracks.dedupe" 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">dedupe</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Drop each video, audio or subtitle track whose signature matches an earlier track.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.sort_videos" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sort_videos</span>
<a href="#unshackle.core.tracks.Tracks.sort_videos" 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">sort_videos</span><span class="p">(</span><span class="n">by_language</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">exact_match</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Sort video tracks by resolution then bitrate, and optionally language.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.sort_audio" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sort_audio</span>
<a href="#unshackle.core.tracks.Tracks.sort_audio" 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">sort_audio</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">by_language</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">codec_priority</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">exact_match</span><span class="o">=</span><span class="kc">False</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Sort audio tracks by bitrate, codec priority, Atmos, descriptive, and optionally language.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.sort_subtitles" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">sort_subtitles</span>
<a href="#unshackle.core.tracks.Tracks.sort_subtitles" 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">sort_subtitles</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">by_language</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">type_priority</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">group_by</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">exact_match</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Sort subtitle tracks by various track attributes to a common P2P standard.
You may optionally give a sequence of languages to prioritise to the top.</p>
<details class="section-order" open>
<summary>Section Order</summary>
<ul>
<li>by_language groups prioritized to top, and ascending alphabetically</li>
<li>then rest ascending alphabetically after the prioritized groups
(Each section ascending alphabetically, but separated)</li>
</ul>
</details>
<details class="type-order" open>
<summary>Type Order</summary>
<ul>
<li>Forced</li>
<li>Normal</li>
<li>Hard of Hearing (SDH/CC)
(Least to most captions expected in the subtitle)</li>
</ul>
</details> <p>type_priority overrides the Type Order with an explicit ranking of "forced",
"normal", and "sdh" (cc counts as sdh). Unlisted types fall to the end.</p>
<p>group_by sets the major sort order. "type" (default) keeps every forced track together,
then every normal, then every SDH, each block ascending by language. "language"
groups by language instead, so Finnish sits next to Finnish SDH, with the Type
Order applied inside each language.</p>
<p>exact_match makes a by_language entry sort only its own tag. By default "en" also
sorts "en-US" and "en-GB".</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.filter" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">filter</span>
<a href="#unshackle.core.tracks.Tracks.filter" 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">filter</span><span class="p">(</span><span class="n">predicate</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return a new Tracks with tracks filtered by predicate, preserving metadata.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.merge_video_selections" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">merge_video_selections</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Tracks.merge_video_selections" 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">merge_video_selections</span><span class="p">(</span><span class="o">*</span><span class="n">groups</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Concatenate video selections, dropping duplicates (by track id, order-preserving).</p>
<p>A caller can choose a DV track as both the hybrid ingredient (lowest) and an
explicit deliverable. Without dedup, unshackle would mux and download the same
track twice.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.partition_hybrid_videos" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">partition_hybrid_videos</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Tracks.partition_hybrid_videos" 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">partition_hybrid_videos</span><span class="p">(</span><span class="n">videos</span><span class="p">,</span> <span class="n">non_hybrid_ranges</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Split videos into hybrid-ingredient candidates and the standalone-deliverable pool.</p>
<p>HDR10/HDR10+/DV tracks are hybrid ingredients. They only enter the standalone
pool when the user explicitly requested their range alongside HYBRID, so for
example <code>-r HYBRID</code> muxes only the hybrid while <code>-r HYBRID,HDR10P</code> also delivers
HDR10+.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.flag_hybrid_ingredients" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">flag_hybrid_ingredients</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Tracks.flag_hybrid_ingredients" 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">flag_hybrid_ingredients</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">hybrid_selected</span><span class="p">,</span> <span class="n">non_hybrid_selected</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Mark tracks selected only as hybrid ingredients so the standalone mux loop skips them.</p>
<p>A track that the caller also selected as an explicit deliverable (same track in both
selections) stays unflagged, and the standalone mux loop muxes it alongside the hybrid.
A <code>native_hybrid</code> track is the hybrid itself, so it stays unflagged too.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.select_hybrid" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">select_hybrid</span>
<a href="#unshackle.core.tracks.Tracks.select_hybrid" 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">select_hybrid</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">tracks</span><span class="p">,</span> <span class="n">quality</span><span class="p">,</span> <span class="n">worst</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">generate_dv</span><span class="o">=</span><span class="kc">False</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A filter for the hybrid ingredients of each resolution. It sets <code>native_hybrid</code> on every track.</p>
<p>A track that already carries DV and an HDR10 or HDR10+ base (DV+HDR10P, HDR10+DV, HDR10P+DV) is a finished
hybrid, so its resolution takes that track and no base. One that carries HDR10+ comes first. The other
resolutions get a base only when a DV track can give it an RPU, or with <code>generate_dv</code>.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.first_match_index" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">first_match_index</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Tracks.first_match_index" 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">first_match_index</span><span class="p">(</span><span class="n">tracks</span><span class="p">,</span> <span class="n">language</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The index of the first track that <code>language</code> asks for, matched against every track at once.</p>
<p>Matching the whole list lets the RFC 4647 string preference pick en-US over en.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Tracks.mux" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">mux</span>
<a href="#unshackle.core.tracks.Tracks.mux" 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">mux</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">title</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">delete</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">progress</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">audio_expected</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">title_language</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">skip_subtitles</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="n">output_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Multiplex all the Tracks into a Matroska Container file.</p>
<p>A failed mux does not raise. mkvmerge's exit code and error lines come back alongside the
output path, and the caller must examine them.</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>title</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Set the Matroska Container file title. Usually displayed in players
instead of the filename if set.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>delete</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Delete all track files after multiplexing.</p>
</div>
</td>
<td>
<code>True</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>progress</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="functools.partial">partial</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Update a rich progress bar with <code>completed=...</code>. This must be the
progress object's update() func, pre-set with task id by functools.partial.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>audio_expected</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Whether the output must have audio. unshackle uses this to
decide if it adds embedded audio metadata.</p>
</div>
</td>
<td>
<code>True</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>title_language</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="langcodes.Language">Language</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The title's intended language. Used to select the best video track
for audio metadata when multiple video tracks exist.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>skip_subtitles</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Skip muxing subtitle tracks into the container.</p>
</div>
</td>
<td>
<code>False</code>
</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>Explicit destination for the muxed container. When None (default)
unshackle derives the path from the first track, so callers muxing several track groups that
share a video list must pass distinct paths to avoid clobbering each other.</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.tracks.Video" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Video</span>
<a href="#unshackle.core.tracks.Video" 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">Video</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="o">*</span><span class="n">args</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">codec</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">range_</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">bitrate</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">width</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">height</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="n">fps</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="n">scan_type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="n">closed_captions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="n">dv_compatible_bitstream</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a> <span class="n">hdr10plus</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a> <span class="n">hdr10_base</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <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;Track&lt;/span&gt; (&lt;code&gt;unshackle.core.tracks.track.Track&lt;/code&gt;)" href="#unshackle.core.tracks.Track">Track</a></code></p>
<p>Make a new Video track object.</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>codec</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="unshackle.core.tracks.video.Video.Codec">Codec</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>A Video.Codec enum representing the video codec.
If not specified, unshackle uses MediaInfo to get the codec
after it downloads the track.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>range_</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<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;Range&lt;/span&gt; (&lt;code&gt;unshackle.core.tracks.video.Video.Range&lt;/code&gt;)" href="#unshackle.core.tracks.Video.Range">Range</a>]</code>
</td>
<td>
<div class="doc-md-description">
<p>A Video.Range enum representing the video colour range.
Defaults to SDR if not specified.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>bitrate</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="typing.Union">Union</span>[<span title="str">str</span>, <span title="int">int</span>, <span title="float">float</span>]]</code>
</td>
<td>
<div class="doc-md-description">
<p>A number or float representing the average bandwidth in bytes/s.
unshackle rounds float values up to the nearest integer.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>width</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="int">int</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The horizontal resolution of the video.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>height</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="int">int</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The vertical resolution of the video.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>fps</code>
</td>
<td>
<code><span title="typing.Optional">Optional</span>[<span title="typing.Union">Union</span>[<span title="str">str</span>, <span title="int">int</span>, <span title="float">float</span>]]</code>
</td>
<td>
<div class="doc-md-description">
<p>A number, float, or string representing the frames/s of the video.
Strings may represent numbers, floats, or a fraction (num/den).
All strings will be cast to either a number or float.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>hdr10plus</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The DV track also carries HDR10+ metadata. The HDR10+ probe sets it.</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>hdr10_base</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The DV track has an HDR10 base layer, as DV profile 8.1 does.</p>
</div>
</td>
<td>
<code>False</code>
</td>
</tr>
</tbody>
</table>
<p>Note: If codec, bitrate, width, height, or fps is not specified, unshackle can
skip some checks or assume a value. Give as much information as possible.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Video.carries_hdr10plus" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">carries_hdr10plus</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Video.carries_hdr10plus" 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">carries_hdr10plus</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether the track carries HDR10+, as its range or, on a DV track, found by the HDR10+ probe.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Video.finished_hybrid" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">finished_hybrid</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Video.finished_hybrid" 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">finished_hybrid</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether the track already carries DV and an HDR10 or HDR10+ base, so <code>-r HYBRID</code> needs no build.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Video.range_label" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">range_label</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Video.range_label" 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">range_label</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The range that <code>-r</code> selects the track by, then any second format it carries: HDR10+DV, DV+HDR10, DV+HDR10P.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="unshackle.core.tracks.Video.Range" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Range</span>
<a href="#unshackle.core.tracks.Video.Range" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="str">str</span></code>, <code><span title="enum.Enum">Enum</span></code></p>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="unshackle.core.tracks.Video.Range.from_cicp" 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_cicp</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Video.Range.from_cicp" class="headerlink" title="Permanent link">&para;</a></h4>
<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_cicp</span><span class="p">(</span><span class="n">primaries</span><span class="p">,</span> <span class="n">transfer</span><span class="p">,</span> <span class="n">matrix</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Convert CICP (Coding-Independent Code Points) values to Video Range.</p>
<p>ITU-T H.273 and ISO/IEC 23091-2 define CICP for signalling video
colour properties independently of the compression codec. These values are
used across AVC (H.264), HEVC (H.265), VVC, AV1, and other modern codecs.</p>
<p>The enum values (Primaries, Transfer, Matrix) match the official specifications:
- ITU-T H.273: Coding-independent code points for video signal type identification
- ISO/IEC 23091-2: Information technology - Coding-independent code points - Part 2: Video
- H.264 Table E-3 (Colour Primaries) and Table E-4 (Transfer Characteristics)
- H.265 Table E.3 and E.4 (identical to H.264)</p>
<p>Note: Value 0 = "Reserved" and Value 2 = "Unspecified" per specification.
While both effectively mean "unknown" in practice, the distinction matters for
spec compliance. Value 2 was added after user feedback (GitHub issue) and matches
FFmpeg's AVColorPrimaries/AVColorTransferCharacteristic enums.</p>
<p>Sources:
- https://www.itu.int/rec/T-REC-H.273
- https://www.itu.int/rec/T-REC-H.Sup19-202104-I
- https://github.com/FFmpeg/FFmpeg/blob/master/libavutil/pixfmt.h</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.dv_fourccs" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">dv_fourccs</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Video.dv_fourccs" 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">dv_fourccs</span><span class="p">(</span><span class="n">codecs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The Dolby Vision fourccs in a codecs list (comma or space separated, <code>/brand</code> suffixes allowed).</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.has_dv_codec" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">has_dv_codec</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Video.has_dv_codec" 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">has_dv_codec</span><span class="p">(</span><span class="n">codecs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether a codecs list names a Dolby Vision codec.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.is_dv_composite" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">is_dv_composite</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Video.is_dv_composite" 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">is_dv_composite</span><span class="p">(</span><span class="n">codec</span><span class="p">,</span> <span class="n">codecs</span><span class="p">,</span> <span class="n">supplemental_codecs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether an HEVC track names DV only in its supplemental codecs: DV profile 8 on an HDR10, SDR or HLG base.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.change_color_range" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">change_color_range</span>
<a href="#unshackle.core.tracks.Video.change_color_range" 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">change_color_range</span><span class="p">(</span><span class="n">range_</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Change the Video's Colour Range to Limited (0) or Full (1).</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.vui_bsf" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">vui_bsf</span>
<a href="#unshackle.core.tracks.Video.vui_bsf" 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">vui_bsf</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return the <code>-bsf:v</code> value that rewrites SPS VUI colour metadata to match <code>self.range</code>.</p>
<p>Returns None when a rewrite is not necessary: SDR/DV/HYBRID ranges, non-AVC/HEVC codecs, a
missing file, or when the bitstream already ships the correct colour metadata. Otherwise
returns a <code>{h264,hevc}_metadata=...</code> string suitable for FFmpeg <code>-bsf:v</code>.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.normalize_vui" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">normalize_vui</span>
<a href="#unshackle.core.tracks.Video.normalize_vui" 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">normalize_vui</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Rewrite SPS VUI colour metadata to match <code>self.range</code>.</p>
<p>Some services ship HDR10/HLG bitstreams with stale BT.709 VUI, which makes
downstream tools mis-classify the file. The manifest-derived range is the
source of truth. Skips SDR, DV, and HYBRID. Returns True if unshackle rewrote
the bitstream.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.vp9_colour_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">vp9_colour_args</span>
<a href="#unshackle.core.tracks.Video.vp9_colour_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">vp9_colour_args</span><span class="p">(</span><span class="n">track_id</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return mkvmerge colour args for an HDR VP9 track.</p>
<p>mkvmerge drops the MP4 vpcC/SmDm/CoLL colour boxes of VP9, which leaves an HDR10 file tagged as SDR.
The transfer the file states wins; <code>self.range</code> applies only when the file states none.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.ccextractor" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">ccextractor</span>
<a href="#unshackle.core.tracks.Video.ccextractor" 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">ccextractor</span><span class="p">(</span><span class="n">track_id</span><span class="p">,</span> <span class="n">out_path</span><span class="p">,</span> <span class="n">language</span><span class="p">,</span> <span class="n">original</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Return a TextTrack object representing CC track extracted by CCExtractor.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.extract_c608" 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_c608</span>
<a href="#unshackle.core.tracks.Video.extract_c608" 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_c608</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Extract Apple-Style c608 box (CEA-608) subtitle using CCExtractor.</p>
<p>This is not much more than a wrapper to the track.ccextractor function.
All this does is examine if a c608 box exists, and only then
does it call CCExtractor.</p>
<p>Even though there is a possibility of more than one c608 box, unshackle
can extract only one. It is also very possible this
needs to be done before any decryption as the decryption may destroy
some of the metadata.</p>
<details class="todo" open>
<summary>Need a test file with more than one c608 box, before unshackle can</summary>
<p>extract more than one CEA-608 track.</p>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.remove_eia_cc" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">remove_eia_cc</span>
<a href="#unshackle.core.tracks.Video.remove_eia_cc" 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">remove_eia_cc</span><span class="p">()</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Remove EIA-CC data from Bitstream while keeping SEI data.</p>
<p>This works by removing all NAL Unit's with the Type of 6 from the bistream
and then re-adding SEI data (effectively a new NAL Unit with only the SEI data).
unshackle can do this only for bitstreams with x264 encoding information, because of
the obscurity on the MDAT mp4 box structure. Therefore, we need to use hacky regex.</p>
</div>
</div>
</div>
</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="../config/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Config">
<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">
Config
</div>
</div>
</a>
<a href="../titles/" class="md-footer__link md-footer__link--next" aria-label="Next: Titles">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
Titles
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</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.a7633da7.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.c21346df.min.js"></script>
</body>
</html>