mirror of
https://github.com/unshackle-dl/unshackle.git
synced 2026-11-12 20:15:10 +00:00
4262 lines
120 KiB
HTML
4262 lines
120 KiB
HTML
|
|
<!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/guide/cli-reference/">
|
|
|
|
|
|
<link rel="prev" href="../downloading/">
|
|
|
|
|
|
<link rel="next" href="../drm-and-cdm/">
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="icon" href="../../assets/favicon.svg">
|
|
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.8.0">
|
|
|
|
|
|
|
|
<title>CLI Reference - 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="#cli-reference" 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">
|
|
|
|
CLI Reference
|
|
|
|
</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 md-tabs__item--active">
|
|
<a href="../downloading/" class="md-tabs__link">
|
|
|
|
|
|
|
|
|
|
|
|
User Guide
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../../reference/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">
|
|
<a href="../../reference/api/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--active md-nav__item--section md-nav__item--nested">
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
|
|
|
|
|
|
|
|
<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="true">
|
|
<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="../downloading/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Downloading
|
|
|
|
|
|
|
|
</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">
|
|
|
|
|
|
CLI Reference
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="./" class="md-nav__link md-nav__link--active">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI Reference
|
|
|
|
|
|
|
|
</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="#root-command" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Root command
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#dl" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
dl
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="dl">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#quality-codec-bitrate-range" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Quality, codec, bitrate & range
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#language-subtitles" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Language & subtitles
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#title-episode-selection" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Title & episode selection
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#track-type-inclusion-exclusion" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Track-type inclusion / exclusion
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#output-muxing-files" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Output, muxing & files
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#metadata-tagging" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Metadata & tagging
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Metadata & tagging">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#episode-ordering" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Episode ordering
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#drm-keys-decryption" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
DRM, keys & decryption
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#network-proxy" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Network & proxy
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#concurrency-caching-listing" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Concurrency, caching & listing
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#search" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
search
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#import" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
import
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#tunnel-test" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
tunnel-test
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#setup" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
setup
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#cfg" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
cfg
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="env">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env-check" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env check
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env-info" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env info
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env-theme" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env theme
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env-clear" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env clear
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="kv">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-copy-to_vault-from_vault" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv copy TO_VAULT FROM_VAULT...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-sync-vault" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv sync VAULT...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-add-file-service-vault" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv add FILE SERVICE VAULT...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-search-kid" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv search KID
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-prepare-vault" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv prepare VAULT...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#wvd" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
wvd
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#prd" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
prd
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="prd">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#prd-new-paths" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
prd new PATHS...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#prd-reprovision-prd_path" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
prd reprovision PRD_PATH
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#prd-test-device" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
prd test DEVICE
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#serve" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
serve
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="util">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util-refresh-services" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util refresh-services
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util-crop-path-aspect" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util crop PATH ASPECT
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util-range-path" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util range PATH
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util-test-path" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util test PATH
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#see-also" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
See also
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../drm-and-cdm/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
DRM & CDM Setup
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../proxies-and-vpn/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Proxies & VPN
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../vaults/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Key Vaults
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../output-and-naming/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Output & Naming
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../subtitles/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Subtitles
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../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="../../reference/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="../../reference/configuration/directories/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Directories
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/configuration/services/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Services & Authentication
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/configuration/download/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Download & Processing
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/configuration/output/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Output & Naming
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/configuration/drm/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
DRM & CDM
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/configuration/network/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Network & Proxy
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/configuration/vaults/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Key Vaults
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/configuration/post-scripts/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Post-Scripts
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/configuration/misc/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Other Settings
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/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--nested">
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
|
|
|
|
|
|
|
|
<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="false">
|
|
<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="../../reference/api/service/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Service
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/api/config/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Config
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/api/tracks/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Tracks
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/api/titles/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Titles
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../reference/api/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="#root-command" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Root command
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#dl" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
dl
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="dl">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#quality-codec-bitrate-range" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Quality, codec, bitrate & range
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#language-subtitles" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Language & subtitles
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#title-episode-selection" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Title & episode selection
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#track-type-inclusion-exclusion" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Track-type inclusion / exclusion
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#output-muxing-files" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Output, muxing & files
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#metadata-tagging" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Metadata & tagging
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Metadata & tagging">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#episode-ordering" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Episode ordering
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#drm-keys-decryption" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
DRM, keys & decryption
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#network-proxy" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Network & proxy
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#concurrency-caching-listing" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Concurrency, caching & listing
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#search" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
search
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#import" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
import
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#tunnel-test" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
tunnel-test
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#setup" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
setup
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#cfg" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
cfg
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="env">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env-check" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env check
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env-info" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env info
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env-theme" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env theme
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#env-clear" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
env clear
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="kv">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-copy-to_vault-from_vault" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv copy TO_VAULT FROM_VAULT...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-sync-vault" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv sync VAULT...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-add-file-service-vault" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv add FILE SERVICE VAULT...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-search-kid" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv search KID
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kv-prepare-vault" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
kv prepare VAULT...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#wvd" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
wvd
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#prd" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
prd
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="prd">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#prd-new-paths" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
prd new PATHS...
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#prd-reprovision-prd_path" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
prd reprovision PRD_PATH
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#prd-test-device" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
prd test DEVICE
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#serve" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
serve
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util
|
|
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="util">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util-refresh-services" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util refresh-services
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util-crop-path-aspect" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util crop PATH ASPECT
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util-range-path" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util range PATH
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#util-test-path" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
util test PATH
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#see-also" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
See also
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-content" data-md-component="content">
|
|
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h1 id="cli-reference">CLI Reference<a class="headerlink" href="#cli-reference" title="Permanent link">¶</a></h1>
|
|
<p>A complete reference for every <code>unshackle</code> command, subcommand, and flag. This page groups the commands by purpose:</p>
|
|
<ul>
|
|
<li><strong><a href="#dl"><code>dl</code></a></strong>: the download pipeline (the command you use most).</li>
|
|
<li><strong><a href="#search"><code>search</code></a></strong>: find titles on a service.</li>
|
|
<li><strong><a href="#import"><code>import</code></a></strong>: rebuild a download from an export file.</li>
|
|
<li><strong><a href="#setup"><code>setup</code></a></strong>: install the external tools and make a first config.</li>
|
|
<li><strong><a href="#cfg"><code>cfg</code></a></strong>, <strong><a href="#env"><code>env</code></a></strong>: manage configuration and the environment.</li>
|
|
<li><strong><a href="#kv"><code>kv</code></a></strong>: Key Vault operations.</li>
|
|
<li><strong><a href="#wvd"><code>wvd</code></a></strong>, <strong><a href="#prd"><code>prd</code></a></strong>: Widevine / PlayReady device management.</li>
|
|
<li><strong><a href="#serve"><code>serve</code></a></strong>: operate the local CDM and REST API server.</li>
|
|
<li><strong><a href="#util"><code>util</code></a></strong>: helper media utilities.</li>
|
|
</ul>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Running commands from a clone</p>
|
|
<p>This page uses the bare <code>unshackle</code> command. From a git clone, the recommended install, run each command as <code>uv run unshackle ...</code>.</p>
|
|
</div>
|
|
<div class="admonition tip">
|
|
<p class="admonition-title">Getting help on any command</p>
|
|
<p>Every command accepts <code>-h</code>, <code>--help</code>, or <code>-?</code>. For example <code>unshackle dl --help</code> or <code>unshackle wvd new --help</code>. Each service defines its own arguments for <code>dl</code> and <code>search</code> (such as a title ID or a query), so examine <code>unshackle dl SERVICE --help</code> for those.</p>
|
|
</div>
|
|
<hr />
|
|
<h2 id="root-command">Root command<a class="headerlink" href="#root-command" title="Permanent link">¶</a></h2>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>unshackle [OPTIONS] COMMAND [ARGS]...
|
|
</span></code></pre></div>
|
|
<blockquote>
|
|
<p>unshackle: Modular Movie, TV, and Music Archival Software.</p>
|
|
</blockquote>
|
|
<p>Every invocation prints a banner and, when you enable <code>update_checks</code> in your config, checks for a newer release.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-v</code>, <code>--version</code></td>
|
|
<td>Print version information and exit.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-d</code>, <code>--debug</code></td>
|
|
<td>Enable <code>DEBUG</code>-level logs and JSON debug logging. Silences noisy HTTP libraries unless <code>debug_requests</code> is set in config.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-h</code>, <code>--help</code>, <code>-?</code></td>
|
|
<td>Show help and exit.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>Commands are auto-discovered, so third-party command modules dropped into the commands directory appear automatically.</p>
|
|
<hr />
|
|
<h2 id="dl"><code>dl</code><a class="headerlink" href="#dl" title="Permanent link">¶</a></h2>
|
|
<p>The download command. It is itself a group whose <strong>subcommands are the installed streaming services</strong>, so an invocation always has three layers:</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>unshackle dl [OPTIONS] SERVICE [SERVICE ARGS...]
|
|
</span></code></pre></div>
|
|
<ul>
|
|
<li><code>OPTIONS</code>: every flag below, parsed at the <code>dl</code> level.</li>
|
|
<li><code>SERVICE</code>: a service tag (for example <code>EXAMPLE1</code> or <code>EXAMPLE2</code>). Tags are case-insensitive and honour each service's aliases (<code>example+</code>, <code>EXAMPLE2</code>, and the other alias forms all give the same tag).</li>
|
|
<li><code>SERVICE ARGS</code>: the title, URL, or ID, plus any service-specific options. These belong to the service, not to <code>dl</code>.</li>
|
|
</ul>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Typical downloads</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Best available 1080p SDR of a title</span>
|
|
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>unshackle<span class="w"> </span>dl<span class="w"> </span>-q<span class="w"> </span><span class="m">1080</span><span class="w"> </span>EXAMPLE<span class="w"> </span><span class="m">81234567</span>
|
|
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
|
|
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="c1"># 4K HDR10, English audio + subs, from a URL</span>
|
|
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>unshackle<span class="w"> </span>dl<span class="w"> </span>-q<span class="w"> </span><span class="m">2160</span><span class="w"> </span>-r<span class="w"> </span>HDR10<span class="w"> </span>-l<span class="w"> </span>en<span class="w"> </span>EXAMPLE<span class="w"> </span><span class="s2">"https://www.example.com/..."</span>
|
|
</span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a>
|
|
</span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="c1"># A season range, HEVC video, EC3 audio</span>
|
|
</span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a>unshackle<span class="w"> </span>dl<span class="w"> </span>-w<span class="w"> </span>S01-S03<span class="w"> </span>-v<span class="w"> </span>H.265<span class="w"> </span>-a<span class="w"> </span>EC3<span class="w"> </span>SERVICE<span class="w"> </span>TITLE-ID
|
|
</span></code></pre></div>
|
|
</div>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Config-driven defaults</p>
|
|
<p>You can give any <code>dl</code> flag a default under the <code>dl:</code> section of <code>unshackle.yaml</code>, and per-service under <code>services.<TAG>.dl</code>. Explicit command-line values (and environment values) always win over both. Service defaults only fill in options you did not set. See the <a href="../../getting-started/configuration-file/">configuration file</a> guide.</p>
|
|
</div>
|
|
<h3 id="quality-codec-bitrate-range">Quality, codec, bitrate & range<a class="headerlink" href="#quality-codec-bitrate-range" title="Permanent link">¶</a></h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-p</code>, <code>--profile</code></td>
|
|
<td>-</td>
|
|
<td>Profile for credentials and cookies.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-q</code>, <code>--quality</code></td>
|
|
<td>best</td>
|
|
<td>Resolution(s), comma-separated, e.g. <code>1080,720</code>. <code>-q 1080</code> also matches anamorphic tracks by 16:9 canvas.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-v</code>, <code>--vcodec</code></td>
|
|
<td>any</td>
|
|
<td>Video codec(s). Accepts names or values: <code>AVC</code>/<code>H.264</code>/<code>H264</code>, <code>HEVC</code>/<code>H.265</code>/<code>H265</code>, <code>VC1</code>/<code>VC-1</code>, <code>VP8</code>, <code>VP9</code>, <code>AV1</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-a</code>, <code>--acodec</code></td>
|
|
<td>any</td>
|
|
<td>Audio codec(s), comma-separated. Accepts <code>AAC</code>, <code>AC3</code>/<code>DD</code>, <code>EC3</code>/<code>DD+</code>/<code>eac3</code>/<code>ddp</code>, <code>AC4</code>/<code>AC-4</code>, <code>OPUS</code>, <code>OGG</code>/<code>VORB</code>/<code>vorbis</code>, <code>DTS</code>, <code>DTSX</code>/<code>DTS-X</code>, <code>ALAC</code>, <code>FLAC</code>, <code>MP3</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-vb</code>, <code>--vbitrate</code></td>
|
|
<td>highest</td>
|
|
<td>Exact video bitrate in kbps.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-ab</code>, <code>--abitrate</code></td>
|
|
<td>highest</td>
|
|
<td>Exact audio bitrate in kbps.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-vb-range</code>, <code>--vbitrate-range</code></td>
|
|
<td>-</td>
|
|
<td>Video bitrate range in kbps, e.g. <code>6000-7000</code>; picks highest within. Mutually exclusive with <code>--vbitrate</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-ab-range</code>, <code>--abitrate-range</code></td>
|
|
<td>-</td>
|
|
<td>Audio bitrate range in kbps, e.g. <code>128-256</code>. Mutually exclusive with <code>--abitrate</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-r</code>, <code>--range</code></td>
|
|
<td><code>SDR</code></td>
|
|
<td>Colour range(s): <code>SDR</code>, <code>HLG</code>, <code>HDR10</code>, <code>HDR10P</code> (HDR10+), <code>DV</code>, <code>HYBRID</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--generate-dv</code></td>
|
|
<td>off</td>
|
|
<td>With <code>-r HYBRID</code>, make Dolby Vision from the HDR10+ metadata when a title has no Dolby Vision track. Needs <code>hdr10plus_tool</code>. See <a href="../downloading/#dolby-vision-from-hdr10">Dolby Vision from HDR10+</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-c</code>, <code>--channels</code></td>
|
|
<td>-</td>
|
|
<td>Audio channels; matches sub-layouts (5.1 ≈ 6.0).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-naa</code>, <code>--noatmos</code></td>
|
|
<td>off</td>
|
|
<td>Exclude Dolby Atmos audio tracks.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--worst</code></td>
|
|
<td>off</td>
|
|
<td>Pick the lowest bitrate within the requested quality. <strong>Requires <code>-q</code>.</strong></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--best-available</code>, <code>--warn-only</code></td>
|
|
<td>off</td>
|
|
<td>Warn and continue when a requested resolution, range, or language is absent, instead of failing. With <code>--all-drm</code>, also when one DRM system does not license.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-rvb</code>, <code>--real-video-bitrate</code></td>
|
|
<td>off</td>
|
|
<td>Probe real media size for true video bitrates, overriding the manifest.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-rab</code>, <code>--real-audio-bitrate</code></td>
|
|
<td>off</td>
|
|
<td>Same for audio (slower).</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition note">
|
|
<p class="admonition-title"><code>HYBRID</code> range</p>
|
|
<p><code>-r HYBRID</code> fetches both HDR10/HDR10+ and Dolby Vision and merges them with <code>dovi_tool</code>. It requires the <code>dovi_tool</code> binary on your <code>PATH</code>.</p>
|
|
</div>
|
|
<h3 id="language-subtitles">Language & subtitles<a class="headerlink" href="#language-subtitles" title="Permanent link">¶</a></h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-l</code>, <code>--lang</code></td>
|
|
<td><code>orig</code></td>
|
|
<td>Language(s) for <strong>both</strong> video and audio. <code>orig</code> = the title's original language; e.g. <code>orig,en</code>. A <code>-</code> prefix excludes, e.g. <code>all,-es</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-vl</code>, <code>--v-lang</code></td>
|
|
<td>-</td>
|
|
<td>Video-only language (overrides <code>-l</code> for video). A <code>-</code> prefix excludes.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-al</code>, <code>--a-lang</code></td>
|
|
<td>-</td>
|
|
<td>Audio-only language (overrides <code>-l</code> for audio). A <code>-</code> prefix excludes.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-sl</code>, <code>--s-lang</code></td>
|
|
<td><code>all</code></td>
|
|
<td>Subtitle language(s). A <code>-</code> prefix excludes, e.g. <code>all,-es</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--require-audio</code></td>
|
|
<td>-</td>
|
|
<td>Audio langs that must exist. The title fails even with <code>--best-available</code>. Does not select tracks.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--require-video</code></td>
|
|
<td>-</td>
|
|
<td>Video langs that must exist. The title fails even with <code>--best-available</code>. Does not select tracks.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--require-subs</code></td>
|
|
<td>-</td>
|
|
<td>Subtitle langs that must exist. Fails the title if one is missing. <code>--s-lang</code> still decides what to keep.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-fs</code>, <code>--forced-subs</code></td>
|
|
<td>off</td>
|
|
<td>Include forced subtitle tracks.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-fso</code>, <code>--forced-subs-only</code></td>
|
|
<td>off</td>
|
|
<td>Keep only forced subtitle tracks; drop the other subtitles. Implies <code>-fs</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-fsl</code>, <code>--forced-s-lang</code></td>
|
|
<td>none</td>
|
|
<td>Language(s) wanted for forced subtitles; implies <code>-fs</code>. A <code>-</code> prefix excludes.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--exact-lang</code></td>
|
|
<td>off</td>
|
|
<td>A tag without a region selects only the variant it means and never falls back to another: <code>-l es</code> does not select <code>es-419</code>. A tag with a region, such as <code>es-419</code>, is always exact. Applies to selection and to sort order.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--sub-format</code></td>
|
|
<td>-</td>
|
|
<td>Output subtitle format (<code>SRT</code>/<code>srt</code>, <code>VTT</code>/<code>webvtt</code>, <code>ASS</code>/<code>ssa</code>, <code>TTML</code>, <code>SMI</code>, ...), or <code>original</code> to keep the source format.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition tip">
|
|
<p class="admonition-title">These flags select languages, they do not order them</p>
|
|
<p>Naming languages with <code>-l</code> or <code>-sl</code> removes the others. To keep every language but put
|
|
your preferred ones first, use <code>audio.language_priority</code> and
|
|
<a href="../../reference/configuration/download/#subtitle"><code>subtitle.language_priority</code></a> in your
|
|
configuration file.</p>
|
|
</div>
|
|
<p>unshackle honours the special language tokens <code>orig</code>, <code>all</code>, and <code>best</code> everywhere it expects a language.</p>
|
|
<h3 id="title-episode-selection">Title & episode selection<a class="headerlink" href="#title-episode-selection" title="Permanent link">¶</a></h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-w</code>, <code>--wanted</code></td>
|
|
<td>Wanted episodes, e.g. <code>S01-S05,S07</code>, <code>S01E01-S02E03</code>. Supports exclusions with a leading <code>-</code> (e.g. <code>-S03</code>). For a <a href="../downloading/#split-episodes">split episode</a>, <code>.N</code> picks one part (<code>S01E01.2</code>), a range must stay inside the episode (<code>S01E01.1-S01E01.3</code>), and <code>S01E01</code> on its own takes every part. For a <a href="../downloading/#daily-and-date-based-content">dated episode</a>, a token can also be an ISO air date (<code>2026-08-11</code>) or a date range with a colon (<code>2026-08-01:2026-08-31</code>). For a <a href="../downloading/#music-tracks">music release</a>, a token is a track number (<code>1-5</code>, <code>1,3,7</code>), or <code>{disc}x{track}</code> (<code>2x3</code>) when the release has more than one disc.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--select-titles</code></td>
|
|
<td>Interactively select what to download: episodes of a series, or films when a title has more than one. <strong>Cannot combine with <code>-w</code>.</strong></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--latest-episode</code></td>
|
|
<td>Download only the single most recent episode.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--latest-episodes N</code></td>
|
|
<td>Download only the N most recent episodes.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--list-titles</code></td>
|
|
<td>List titles only; do not download.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="track-type-inclusion-exclusion">Track-type inclusion / exclusion<a class="headerlink" href="#track-type-inclusion-exclusion" title="Permanent link">¶</a></h3>
|
|
<p>Keep only certain track types, or skip certain track types.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Include-only</th>
|
|
<th>Skip</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-V</code>, <code>--video-only</code></td>
|
|
<td><code>-nv</code>, <code>--no-video</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-A</code>, <code>--audio-only</code></td>
|
|
<td><code>-na</code>, <code>--no-audio</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-S</code>, <code>--subs-only</code></td>
|
|
<td><code>-ns</code>, <code>--no-subs</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-C</code>, <code>--chapters-only</code></td>
|
|
<td><code>-nc</code>, <code>--no-chapters</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td><code>-nt</code>, <code>--no-attachments</code> (cover art, subtitle fonts, and files the service attaches)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-ad</code>, <code>--audio-description</code></td>
|
|
<td>Include descriptive (audio-description) tracks.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-ado</code>, <code>--audio-description-only</code></td>
|
|
<td>Keep only descriptive (audio-description) tracks; drop the standard audio. Does not need <code>-ad</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--skip-subtitle-errors</code></td>
|
|
<td>Skip a failed subtitle instead of aborting the title. Video/audio failures remain fatal.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="output-muxing-files">Output, muxing & files<a class="headerlink" href="#output-muxing-files" title="Permanent link">¶</a></h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--split-audio</code></td>
|
|
<td>Write a separate output file per audio codec instead of merging. Defaults to config <code>muxing.merge_audio</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--merge-video</code></td>
|
|
<td>Mux video tracks that share a height, range, and codec into one file, so only language varies inside a file. Defaults to config <code>muxing.merge_video</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-o</code>, <code>--output</code></td>
|
|
<td>Override the output directory for this run.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-folder</code></td>
|
|
<td>Disable folder creation for TV shows.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-source</code></td>
|
|
<td>Remove the source tag from the filename/path.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-mux</code></td>
|
|
<td>Do not mux; keep individual track files.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--sample</code></td>
|
|
<td>Download a short sample and write it with a <code>SAMPLE</code> tag on the filename in a <code>Sample</code> folder inside the output folder. Bare <code>--sample</code> = 60 seconds from 2 minutes in; <code>--sample 0-60</code> = a custom window in seconds.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--include-sample</code></td>
|
|
<td>Download the full title, then also cut a 60 second sample from each muxed file into a <code>Sample</code> folder next to it.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--tag</code></td>
|
|
<td>Group tag override.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--repack</code></td>
|
|
<td>Add a <code>REPACK</code> tag to the filename.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--postscript</code></td>
|
|
<td>Run a command after each output file, with <code>{variable}</code> placeholders substituted. Repeatable. Replaces the <code>post_scripts</code> config for this run. See <a href="../../reference/configuration/post-scripts/">Post-scripts</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-postscript</code></td>
|
|
<td>Run no post-script for this run, neither the configured ones nor <code>--postscript</code>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="metadata-tagging">Metadata & tagging<a class="headerlink" href="#metadata-tagging" title="Permanent link">¶</a></h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--tmdb</code></td>
|
|
<td>TMDB ID (integer). Used for the tags. Skips the title search. <code>--enrich</code> reads it too. Needs <code>tmdb_api_key</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--imdb</code></td>
|
|
<td>IMDb ID, e.g. <code>tt1375666</code>. Used for the tags. Skips the title search. <code>--enrich</code> reads it too. Needs no API key.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--tvdb</code></td>
|
|
<td>TVDB ID (integer). Used for the tags. Skips the series lookup that <code>--tvdb-order</code> would otherwise do. <code>--enrich</code> reads it too. Needs <code>tvdb_api_key</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--anilist</code></td>
|
|
<td>AniList ID (integer), e.g. <code>--anilist 21</code>. A MyAnimeList ID is accepted as <code>mal:12345</code> and resolved to the AniList entry. Used for the tags. Skips the title search. <code>--enrich</code> reads it too. Needs no API key.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--enrich</code></td>
|
|
<td>Overwrite show title, year and original language with the external source's. <strong>Requires</strong> one of <code>--tmdb</code>, <code>--imdb</code>, <code>--tvdb</code>, or <code>--anilist</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--daily</code></td>
|
|
<td>Treat the title as daily/date-based content and fill missing episode air dates from TVDB. The fill needs <code>--enrich</code> and a TVDB ID. See <a href="../downloading/#daily-and-date-based-content">Daily and date-based content</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--tvdb-order</code></td>
|
|
<td>Renumber episodes to a TVDB season order: <code>official</code> (aired), <code>dvd</code>, <code>absolute</code>, <code>alternate</code>, or <code>regional</code>. Needs <code>tvdb_api_key</code>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">One ID at a time</p>
|
|
<p>You cannot combine <code>--tmdb</code>, <code>--imdb</code> and <code>--tvdb</code>. Give one and unshackle finds the
|
|
others from it, and writes all three to the tags. <code>--anilist</code> is outside that rule and pairs
|
|
with one of them, which is how you attach a western ID to an anime title.
|
|
An ID with no metadata provider that can find it, such as <code>--tmdb</code> with no <code>tmdb_api_key</code>,
|
|
fails before the download starts. <code>--anilist</code> needs no API key, so it never fails this check.</p>
|
|
</div>
|
|
<h4 id="episode-ordering">Episode ordering<a class="headerlink" href="#episode-ordering" title="Permanent link">¶</a></h4>
|
|
<p>A service does not always number a series the way TVDB's aired order does. Some services use
|
|
TVDB's <code>alternate</code> (Streaming) order for Futurama, for example. <code>--tvdb-order</code> works out which
|
|
order the service used, then renumbers the episodes into the order you asked for.</p>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Orders that do not cover the whole series</p>
|
|
<p>An order can ignore episodes the service carries. TVDB's <code>dvd</code> order for Futurama leaves
|
|
out the four movies. Those episodes keep their original numbering. If that would give two
|
|
episodes the same season/episode slot, and so the same filename, unshackle logs an error
|
|
and keeps the service's numbering unchanged. Pick an order that covers the whole series.</p>
|
|
</div>
|
|
<h3 id="drm-keys-decryption">DRM, keys & decryption<a class="headerlink" href="#drm-keys-decryption" title="Permanent link">¶</a></h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--cdm-only</code> / <code>--vaults-only</code></td>
|
|
<td>Use only the CDM, or only Key Vaults, for key acquisition.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--cdm <name></code></td>
|
|
<td>Use the named CDM device from the <code>cdm</code> config mapping for this run, ignoring the service/default mapping. Over <code>--remote</code>, that device licenses the remote session, not the server CDM.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--skip-dl</code></td>
|
|
<td>Skip the download but still retrieve keys.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--all-drm</code></td>
|
|
<td>License each track with both Widevine and PlayReady. Needs a CDM for each DRM system. Key Vaults are read first; <code>--cdm-only</code> sends a challenge for each system. Not for use with <code>--cdm</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--export</code></td>
|
|
<td>Export track info and keys to a <code>mediaexport</code> JSON file in the exports directory.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="network-proxy">Network & proxy<a class="headerlink" href="#network-proxy" title="Permanent link">¶</a></h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--proxy</code></td>
|
|
<td>Proxy URI, a country or location code resolved from configured providers, or <code>provider:region</code> (e.g. <code>nordvpn:ca</code>, <code>gluetun:us</code>, <code>protonvpn:de:berlin</code>, <code>controld:yul</code>).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--local-proxy</code></td>
|
|
<td>With <code>--remote</code>, send the server's service requests through your machine's own connection. Works with no other proxy option. Check it first with <code>unshackle tunnel-test</code>. See <a href="../proxies-and-vpn/#send-the-servers-requests-through-your-machine">Proxies & VPN</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-proxy</code></td>
|
|
<td>Force-disable all proxy use.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-proxy-download</code></td>
|
|
<td>Bypass the proxy for <strong>all downloads</strong> (manifest, licence, and auth stay proxied).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--proxy-download</code></td>
|
|
<td>Use a different proxy for <strong>all downloads</strong>, in the same forms as <code>--proxy</code> (manifest, licence, and auth stay on <code>--proxy</code>).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--remote</code></td>
|
|
<td>Use a remote unshackle server.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--local</code></td>
|
|
<td>Use the local service code, also when the config sets <code>remote: true</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--server</code></td>
|
|
<td>Name a remote server from the <code>remote_services</code> config.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="concurrency-caching-listing">Concurrency, caching & listing<a class="headerlink" href="#concurrency-caching-listing" title="Permanent link">¶</a></h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--workers</code></td>
|
|
<td>downloader default</td>
|
|
<td>Per-track download threads.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--adaptive-workers</code></td>
|
|
<td>off</td>
|
|
<td>Scale per-track segment workers dynamically (up to the <code>--workers</code> cap) based on measured CDN throughput and errors.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--download-processes</code></td>
|
|
<td><code>1</code></td>
|
|
<td>Split large segment batches (24+) across this many download processes to exceed the single-process throughput cap on multi-gigabit connections. Ignored while a speed limit is set: the cap is one shared budget, which extra processes cannot share, so the download stays in a single process. Also ignored when the service HTTP session carries state a child process cannot rebuild, such as a custom TLS adapter.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--continue-downloads</code></td>
|
|
<td>off</td>
|
|
<td>Keep completed segment files across runs and resume a previously failed download. One-off enable of the <a href="../../reference/configuration/download/#continue_downloads"><code>continue_downloads</code></a> config option.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--downloads</code></td>
|
|
<td><code>1</code></td>
|
|
<td>Number of tracks downloaded concurrently.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--speed-limit</code></td>
|
|
<td>unlimited</td>
|
|
<td>Cap total download speed across all threads and tracks, e.g. <code>500k</code>, <code>5M</code>, <code>1.5G</code> or plain bytes/sec. Values are bytes, not bits (<code>5M</code> = 5.0 MB/s). <code>off</code> disables a configured limit.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-cache</code></td>
|
|
<td>off</td>
|
|
<td>Bypass the title cache.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--reset-cache</code></td>
|
|
<td>off</td>
|
|
<td>Clear the title cache.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--list</code></td>
|
|
<td>off</td>
|
|
<td>List available/would-be-downloaded tracks; do not download.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--slow</code></td>
|
|
<td>-</td>
|
|
<td>Inter-title delay. Bare <code>--slow</code> = 60-120s; <code>--slow 20-40</code> = custom range (minimum 20s).</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">Some flags cannot be combined</p>
|
|
<p><code>--select-titles</code> and <code>--wanted</code> are mutually exclusive. <code>--worst</code> needs <code>--quality</code>. <code>--vbitrate</code> and <code>--vbitrate-range</code> (and the audio equivalents) are mutually exclusive.</p>
|
|
</div>
|
|
<hr />
|
|
<h2 id="search"><code>search</code><a class="headerlink" href="#search" title="Permanent link">¶</a></h2>
|
|
<p>Find titles on a service. Like <code>dl</code>, <code>search</code> is a group whose subcommands are the installed services, and it reuses <code>dl</code>'s authentication, cookie, and proxy machinery.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>unshackle search [OPTIONS] SERVICE [QUERY...]
|
|
</span></code></pre></div>
|
|
<p>Each service defines its own query syntax. unshackle prints the results as a tree of titles with their service IDs. Feed an ID straight into <code>dl</code>.</p>
|
|
<p>unshackle logs in to the service before the search. A service that declares a search with no login is the exception: unshackle then reads no cookies and no credentials, and <code>--profile</code> has no effect.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-p</code>, <code>--profile</code></td>
|
|
<td>Profile for credentials and cookies.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--proxy</code></td>
|
|
<td>Proxy URI, country or location code, or <code>provider:region</code> (e.g. <code>controld:ca</code>).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--local-proxy</code></td>
|
|
<td>With <code>--remote</code>, send the server's search requests through your machine's own connection. Works with no other proxy option.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-proxy</code></td>
|
|
<td>Force-disable all proxy use.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--remote</code></td>
|
|
<td>Search on a remote unshackle server. The server logs in to the service. unshackle sends it your credentials, cookies and cache for the profile, and saves the cache that the server sends back. A service that searches with no login gets none of them.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--local</code></td>
|
|
<td>Search with the local service code, also when the config sets <code>remote: true</code> for the service.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--server</code></td>
|
|
<td>Name a remote server from the <code>remote_services</code> config.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>unshackle<span class="w"> </span>search<span class="w"> </span>EXAMPLE<span class="w"> </span><span class="s2">"My Show"</span>
|
|
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>unshackle<span class="w"> </span>search<span class="w"> </span>-p<span class="w"> </span>myprofile<span class="w"> </span>EXAMPLE<span class="w"> </span><span class="s2">"Another Show"</span>
|
|
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>unshackle<span class="w"> </span>search<span class="w"> </span>--proxy<span class="w"> </span>nordvpn:ca<span class="w"> </span>SERVICE<span class="w"> </span><span class="s2">"query"</span>
|
|
</span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a>unshackle<span class="w"> </span>search<span class="w"> </span>--remote<span class="w"> </span>--server<span class="w"> </span>my_server<span class="w"> </span>SERVICE<span class="w"> </span><span class="s2">"query"</span>
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="import"><code>import</code><a class="headerlink" href="#import" title="Permanent link">¶</a></h2>
|
|
<p>Reconstruct a download (download → decrypt → mux) from an <code>--export</code> JSON file without re-contacting the service. It uses the DASH or ISM manifest that the export saved, or fetches the manifest again when the export has none. It injects the stored keys and then runs the normal <code>dl</code> pipeline. The service tag is read from the export file, not passed by you.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>unshackle import EXPORT_FILE [DL_ARGS...]
|
|
</span></code></pre></div>
|
|
<p>unshackle forwards any <code>dl</code> options after the file verbatim, so you can override quality, range, proxy, and so on.</p>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>unshackle<span class="w"> </span>import<span class="w"> </span>export.json
|
|
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>unshackle<span class="w"> </span>import<span class="w"> </span>export.json<span class="w"> </span>-r<span class="w"> </span>HDR10<span class="w"> </span>--proxy<span class="w"> </span>US
|
|
</span></code></pre></div>
|
|
</div>
|
|
<p>The export file can be a <code>mediaexport</code> file from <code>dl --export</code>, an export from an older version of unshackle, or an export from unidl. The file must name the service it came from.</p>
|
|
<hr />
|
|
<h2 id="tunnel-test"><code>tunnel-test</code><a class="headerlink" href="#tunnel-test" title="Permanent link">¶</a></h2>
|
|
<p>Check <code>--local-proxy</code> before a real <code>--remote</code> run. The command finds the IP address that this
|
|
machine exits from, opens a tunnel to the server, and makes the server look up its exit IP address
|
|
through the tunnel. It stops at the first step that fails.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>unshackle tunnel-test [--server NAME]
|
|
</span></code></pre></div>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Flag</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--server</code></td>
|
|
<td>Name of the remote server from <code>remote_services</code> config, if you configure more than one.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>See <a href="../proxies-and-vpn/#send-the-servers-requests-through-your-machine">Proxies & VPN</a>.</p>
|
|
<hr />
|
|
<h2 id="setup"><code>setup</code><a class="headerlink" href="#setup" title="Permanent link">¶</a></h2>
|
|
<p>Install the external tools and make a first config.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>unshackle setup
|
|
</span></code></pre></div>
|
|
<p>The command takes no options and asks its questions at the prompt. It shows the missing <a href="../../getting-started/installation/#external-tools-on-your-path">external tools</a> and downloads the ones you accept. It puts them in a <code>binaries</code> folder, in the package folder of a git clone or in your user data directory for a <code>uv</code> tool install. If no <code>unshackle.yaml</code> exists, it writes a first one: inside the clone, or to your user config directory for a <code>uv</code> tool install. It then makes the data folders and imports <code>.wvd</code> and <code>.prd</code> devices, one file or folder per answer, until you give an empty answer. It ends with a summary of the tools, the path of a config that it wrote, and a pointer to <code>env check</code>. You can run it again: it skips the tools it finds and never overwrites a config. <a href="../../getting-started/installation/#what-unshackle-setup-does">Installation</a> gives the full steps and where each file goes.</p>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>uv<span class="w"> </span>run<span class="w"> </span>unshackle<span class="w"> </span>setup<span class="w"> </span><span class="c1"># from a git clone</span>
|
|
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a>unshackle<span class="w"> </span>setup<span class="w"> </span><span class="c1"># from a uv tool install</span>
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="cfg"><code>cfg</code><a class="headerlink" href="#cfg" title="Permanent link">¶</a></h2>
|
|
<p>Read, set, delete, or show configuration values in <code>unshackle.yaml</code> without hand-editing YAML.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>unshackle cfg [KEY] [VALUE] [OPTIONS]
|
|
</span></code></pre></div>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Argument / Option</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>KEY</code></td>
|
|
<td>Dotted path into the config, e.g. <code>tag</code>, <code>serve.api_secret</code>, <code>directories.downloads</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>VALUE</code></td>
|
|
<td>Value to set. Parsed as a Python literal when possible, so <code>true</code>, <code>123</code>, <code>['a','b']</code>, and <code>{'k':1}</code> become real types; bare words stay strings.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--unset</code></td>
|
|
<td>Remove the configuration value.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--list</code></td>
|
|
<td>List all set configuration values.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">Comments are stripped</p>
|
|
<p>Writing a value through <code>cfg</code> rewrites the configuration file and <strong>removes all comments</strong> from it. If your config relies on comments, edit it by hand instead. Setting a value and using <code>--unset</code> together is an error. If a config key is set twice in the same block, every command warns with the line numbers of the two copies and uses the later copy. <code>cfg</code> stops without a change.</p>
|
|
</div>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a>unshackle<span class="w"> </span>cfg<span class="w"> </span>--list<span class="w"> </span><span class="c1"># print entire config</span>
|
|
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a>unshackle<span class="w"> </span>cfg<span class="w"> </span>serve.api_secret<span class="w"> </span><span class="c1"># read a nested key</span>
|
|
</span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a>unshackle<span class="w"> </span>cfg<span class="w"> </span>tag<span class="w"> </span>MYGROUP<span class="w"> </span><span class="c1"># set a string</span>
|
|
</span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a>unshackle<span class="w"> </span>cfg<span class="w"> </span>update_checks<span class="w"> </span><span class="nb">false</span><span class="w"> </span><span class="c1"># literal → boolean False</span>
|
|
</span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a>unshackle<span class="w"> </span>cfg<span class="w"> </span>directories.downloads<span class="w"> </span>/mnt/dl<span class="w"> </span><span class="c1"># set a nested path</span>
|
|
</span><span id="__span-11-6"><a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a>unshackle<span class="w"> </span>cfg<span class="w"> </span>tag<span class="w"> </span>--unset<span class="w"> </span><span class="c1"># remove a key</span>
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="env"><code>env</code><a class="headerlink" href="#env" title="Permanent link">¶</a></h2>
|
|
<p>Inspect and manage the project environment.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a>unshackle env COMMAND [ARGS]...
|
|
</span></code></pre></div>
|
|
<h3 id="env-check"><code>env check</code><a class="headerlink" href="#env-check" title="Permanent link">¶</a></h3>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a>unshackle env check [--verbose]
|
|
</span></code></pre></div>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--verbose</code></td>
|
|
<td>Adds a Path column with the file that unshackle loads for each tool. Use it to find a tool that you want to replace.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>Prints a dependency table (Category / Tool / Status / Version / Required / Purpose) that shows which external tools unshackle finds on your <code>PATH</code> and the version that each one reports. The version is <code>-</code> when a tool does not report one. It also gives a summary of how many required tools are present. If a required tool is missing, it tells you to run <a href="#setup"><code>unshackle setup</code></a>.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Category</th>
|
|
<th>Tools</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>Core</td>
|
|
<td>FFmpeg*, FFprobe*, MKVToolNix*, mkvpropedit*</td>
|
|
</tr>
|
|
<tr>
|
|
<td>DRM</td>
|
|
<td>shaka-packager*, mp4decrypt</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HDR</td>
|
|
<td>dovi_tool, HDR10Plus_tool</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Subtitle</td>
|
|
<td>SubtitleEdit, CCExtractor</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Player</td>
|
|
<td>FFplay, MPV</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Network</td>
|
|
<td>HolaProxy, Caddy, Docker, git</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><small>* required. All others are optional.</small></p>
|
|
<h3 id="env-info"><code>env info</code><a class="headerlink" href="#env-info" title="Permanent link">¶</a></h3>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a>unshackle env info
|
|
</span></code></pre></div>
|
|
<p>Shows the location unshackle loaded the configuration file from. If it found no file, it shows the candidate locations instead. It then prints a table of every configured directory (downloads, temp, cache, cookies, logs, exports, WVDs, PRDs, services, and more).</p>
|
|
<h3 id="env-theme"><code>env theme</code><a class="headerlink" href="#env-theme" title="Permanent link">¶</a></h3>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a>unshackle env theme
|
|
</span></code></pre></div>
|
|
<p>Prints a sample of every available CLI theme. Each sample has colour swatches, help text with option rows, and a track listing with video, audio and subtitle entries. It also has log lines, a progress bar, and the gradient pulse bar. unshackle marks the active theme and shows each theme's aliases. Set your choice with the <a href="../../reference/configuration/misc/#appearance"><code>theme</code></a> config key.</p>
|
|
<h3 id="env-clear"><code>env clear</code><a class="headerlink" href="#env-clear" title="Permanent link">¶</a></h3>
|
|
<p>Clear an environment directory. unshackle empties the directory, makes it again, and reports the number of files and bytes it freed.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Command</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>unshackle env clear cache [SERVICE]</code></td>
|
|
<td>Clear the cache directory, or only one service's cache subdirectory.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>unshackle env clear temp</code></td>
|
|
<td>Clear the temp directory.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a>unshackle<span class="w"> </span>env<span class="w"> </span>check
|
|
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>unshackle<span class="w"> </span>env<span class="w"> </span>info
|
|
</span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a>unshackle<span class="w"> </span>env<span class="w"> </span>theme
|
|
</span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a>unshackle<span class="w"> </span>env<span class="w"> </span>clear<span class="w"> </span>cache
|
|
</span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a>unshackle<span class="w"> </span>env<span class="w"> </span>clear<span class="w"> </span>cache<span class="w"> </span>EXAMPLE<span class="w"> </span><span class="c1"># one service only</span>
|
|
</span><span id="__span-16-6"><a id="__codelineno-16-6" name="__codelineno-16-6" href="#__codelineno-16-6"></a>unshackle<span class="w"> </span>env<span class="w"> </span>clear<span class="w"> </span>temp
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="kv"><code>kv</code><a class="headerlink" href="#kv" title="Permanent link">¶</a></h2>
|
|
<p>Manage Key Vaults. You configure vaults under <code>key_vaults</code> in <code>unshackle.yaml</code>, each with a <code>name</code>, a <code>type</code> (<code>sqlite</code>, <code>mysql</code>, <code>http</code>, <code>api</code>), and type-specific options. unshackle normalises service tags automatically.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a>unshackle kv COMMAND [ARGS]...
|
|
</span></code></pre></div>
|
|
<h3 id="kv-copy-to_vault-from_vault"><code>kv copy TO_VAULT FROM_VAULT...</code><a class="headerlink" href="#kv-copy-to_vault-from_vault" title="Permanent link">¶</a></h3>
|
|
<p>Copy content keys from one or more source vaults into a destination vault. unshackle skips rows whose KIDs match, unless the existing row has no content key. unshackle never alters or deletes existing data.</p>
|
|
<p>A vault argument is the name of a vault in the config, or the path to an SQLite vault file. Use a path to import a vault file that is not in the config.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-s</code>, <code>--service</code></td>
|
|
<td>Only copy data for a specific service.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-l</code>, <code>--local-only</code></td>
|
|
<td>Only copy data for services installed locally. Mutually exclusive with <code>--service</code>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="kv-sync-vault"><code>kv sync VAULT...</code><a class="headerlink" href="#kv-sync-vault" title="Permanent link">¶</a></h3>
|
|
<p>Make sure that two or more vaults hold the same set of content keys, essentially a chained bidirectional copy. More than one vault is necessary. Accepts the same <code>--service</code> / <code>--local-only</code> options as <code>copy</code>.</p>
|
|
<h3 id="kv-add-file-service-vault"><code>kv add FILE SERVICE VAULT...</code><a class="headerlink" href="#kv-add-file-service-vault" title="Permanent link">¶</a></h3>
|
|
<p>Add content keys to one or more vaults for a service. <code>FILE</code> contains one <code>KID:KEY</code> pair per line (32 hex : 32 hex, UTF-8). unshackle skips every line that does not match that form.</p>
|
|
<h3 id="kv-search-kid"><code>kv search KID</code><a class="headerlink" href="#kv-search-kid" title="Permanent link">¶</a></h3>
|
|
<p>Find a KID (32 hex characters, no dashes) in the configured vaults and report its content key.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-s</code>, <code>--service</code></td>
|
|
<td>Limit the search to a specific service tag.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-v</code>, <code>--vault</code></td>
|
|
<td>Limit the search to a specific configured vault by name.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Note</p>
|
|
<p>unshackle cannot enumerate remote vaults without a service, so pass <code>--service</code> when you examine them.</p>
|
|
</div>
|
|
<h3 id="kv-prepare-vault"><code>kv prepare VAULT...</code><a class="headerlink" href="#kv-prepare-vault" title="Permanent link">¶</a></h3>
|
|
<p>Make service tables on vaults that use tables, for every installed service, where they do not already exist.</p>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a>unshackle<span class="w"> </span>kv<span class="w"> </span>copy<span class="w"> </span>main<span class="w"> </span>backup1<span class="w"> </span>backup2
|
|
</span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a>unshackle<span class="w"> </span>kv<span class="w"> </span>copy<span class="w"> </span>main<span class="w"> </span>backup<span class="w"> </span>-s<span class="w"> </span>EXAMPLE
|
|
</span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a>unshackle<span class="w"> </span>kv<span class="w"> </span>copy<span class="w"> </span>main<span class="w"> </span>~/Downloads/key_store.db<span class="w"> </span>-s<span class="w"> </span>EXAMPLE
|
|
</span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a>unshackle<span class="w"> </span>kv<span class="w"> </span>sync<span class="w"> </span>main<span class="w"> </span>mysql_vault
|
|
</span><span id="__span-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a>unshackle<span class="w"> </span>kv<span class="w"> </span>add<span class="w"> </span>keys.txt<span class="w"> </span>EXAMPLE<span class="w"> </span>main<span class="w"> </span>backup
|
|
</span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a>unshackle<span class="w"> </span>kv<span class="w"> </span>search<span class="w"> </span>0123456789abcdef0123456789abcdef<span class="w"> </span>-s<span class="w"> </span>EXAMPLE<span class="w"> </span>-v<span class="w"> </span>main
|
|
</span><span id="__span-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a>unshackle<span class="w"> </span>kv<span class="w"> </span>prepare<span class="w"> </span>main<span class="w"> </span>mysql_vault
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="wvd"><code>wvd</code><a class="headerlink" href="#wvd" title="Permanent link">¶</a></h2>
|
|
<p>Manage Widevine Device (<code>.wvd</code>) files. Devices live in the configured WVDs directory.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a>unshackle wvd COMMAND [ARGS]...
|
|
</span></code></pre></div>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Command</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>wvd add PATHS...</code></td>
|
|
<td>Validate and move one or more <code>.wvd</code> files into the WVDs directory.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>wvd delete NAMES...</code></td>
|
|
<td>Delete <code>.wvd</code> files by name (without extension). Prompts for confirmation.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>wvd parse PATH</code></td>
|
|
<td>Parse a <code>.wvd</code> and print its System ID, security level, type, flags, and client info. Relative paths resolve against the WVDs directory.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>wvd dump WVD_PATHS... OUT_DIR</code></td>
|
|
<td>Extract a device's contents (metadata, private key, client ID, VMP) into <code>OUT_DIR/<name>/</code>. With no paths, dumps every WVD in the WVDs directory.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>wvd new NAME PRIVATE_KEY CLIENT_ID [FILE_HASHES]</code></td>
|
|
<td>Create a new <code>.wvd</code> from a PEM private key and a <code>ClientIdentification</code> blob, optionally with a VMP (<code>FileHashes</code>) blob.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><code>wvd new</code> options:</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-t</code>, <code>--type</code></td>
|
|
<td><code>Android</code></td>
|
|
<td>Device type.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-l</code>, <code>--level</code></td>
|
|
<td><code>1</code></td>
|
|
<td>Security level (1-3).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-o</code>, <code>--output</code></td>
|
|
<td>WVDs dir</td>
|
|
<td>Output directory.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a>unshackle<span class="w"> </span>wvd<span class="w"> </span>add<span class="w"> </span>device.wvd
|
|
</span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a>unshackle<span class="w"> </span>wvd<span class="w"> </span>parse<span class="w"> </span>nexus_6p_1234_l1
|
|
</span><span id="__span-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a>unshackle<span class="w"> </span>wvd<span class="w"> </span>dump<span class="w"> </span>device.wvd<span class="w"> </span>./out_dir
|
|
</span><span id="__span-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a>unshackle<span class="w"> </span>wvd<span class="w"> </span>new<span class="w"> </span><span class="s2">"Nexus 6P"</span><span class="w"> </span>private_key.pem<span class="w"> </span>client_id.bin<span class="w"> </span>vmp.bin<span class="w"> </span>-t<span class="w"> </span>ANDROID<span class="w"> </span>-l<span class="w"> </span><span class="m">3</span>
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="prd"><code>prd</code><a class="headerlink" href="#prd" title="Permanent link">¶</a></h2>
|
|
<p>Manage PlayReady Device (<code>.prd</code>) files. Devices live in the configured PRDs directory. Built on <code>pyplayready</code>.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a>unshackle prd COMMAND [ARGS]...
|
|
</span></code></pre></div>
|
|
<h3 id="prd-new-paths"><code>prd new PATHS...</code><a class="headerlink" href="#prd-new-paths" title="Permanent link">¶</a></h3>
|
|
<p>Make a new <code>.prd</code>. Give either a single folder that contains <code>zgpriv.dat</code> (group key) and <code>bgroupcert.dat</code> (group certificate), or two file paths (group key, then group certificate).</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-e</code>, <code>--encryption_key</code></td>
|
|
<td>Optional device ECC private encryption key (generated if omitted).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-s</code>, <code>--signing_key</code></td>
|
|
<td>Optional device ECC private signing key (generated if omitted).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-o</code>, <code>--output</code></td>
|
|
<td>Output directory or <code>.prd</code> file path.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><code>prd new</code> will not overwrite an existing file.</p>
|
|
<h3 id="prd-reprovision-prd_path"><code>prd reprovision PRD_PATH</code><a class="headerlink" href="#prd-reprovision-prd_path" title="Permanent link">¶</a></h3>
|
|
<p>Reprovision an existing device by replacing its leaf certificate and keys. Only a device of version 3 or higher can do reprovisioning. Accepts the same <code>-e</code> / <code>-s</code> / <code>-o</code> options. By default it overwrites the device in place.</p>
|
|
<h3 id="prd-test-device"><code>prd test DEVICE</code><a class="headerlink" href="#prd-test-device" title="Permanent link">¶</a></h3>
|
|
<p>Do a test of a device against the Microsoft PlayReady demo server and print the returned content keys.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-c</code>, <code>--ckt</code></td>
|
|
<td><code>aesctr</code></td>
|
|
<td>Content key encryption type: <code>aesctr</code> or <code>aescbc</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-sl</code>, <code>--security-level</code></td>
|
|
<td><code>2000</code></td>
|
|
<td>Minimum security level: <code>150</code>, <code>2000</code>, or <code>3000</code>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a>unshackle<span class="w"> </span>prd<span class="w"> </span>new<span class="w"> </span>./device_folder/
|
|
</span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a>unshackle<span class="w"> </span>prd<span class="w"> </span>new<span class="w"> </span>zgpriv.dat<span class="w"> </span>bgroupcert.dat<span class="w"> </span>-o<span class="w"> </span>/out/dir
|
|
</span><span id="__span-22-3"><a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a>unshackle<span class="w"> </span>prd<span class="w"> </span>reprovision<span class="w"> </span>mydevice.prd
|
|
</span><span id="__span-22-4"><a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a>unshackle<span class="w"> </span>prd<span class="w"> </span><span class="nb">test</span><span class="w"> </span>mydevice.prd<span class="w"> </span>-sl<span class="w"> </span><span class="m">3000</span><span class="w"> </span>-c<span class="w"> </span>aescbc
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="serve"><code>serve</code><a class="headerlink" href="#serve" title="Permanent link">¶</a></h2>
|
|
<p>Serve your local Widevine/PlayReady devices and the REST API for remote access. Built on <code>aiohttp</code>.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a>unshackle serve [OPTIONS]
|
|
</span></code></pre></div>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-h</code>, <code>--host</code></td>
|
|
<td><code>127.0.0.1</code></td>
|
|
<td>Host to serve from.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-p</code>, <code>--port</code></td>
|
|
<td><code>8786</code></td>
|
|
<td>Port to serve from.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--caddy</code></td>
|
|
<td>off</td>
|
|
<td>Also serve through Caddy (requires the <code>caddy</code> binary and a <code>Caddyfile</code>).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--api-only</code></td>
|
|
<td>off</td>
|
|
<td>Serve only the REST API, not the CDM endpoints. Incompatible with <code>--no-widevine</code>/<code>--no-playready</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-widevine</code></td>
|
|
<td>off</td>
|
|
<td>Disable the Widevine CDM endpoints.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-playready</code></td>
|
|
<td>off</td>
|
|
<td>Disable the PlayReady CDM endpoints.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--no-key</code></td>
|
|
<td>off</td>
|
|
<td>Disable API-key authentication (allows all requests).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--debug-api</code></td>
|
|
<td>off</td>
|
|
<td>Include tracebacks/stderr in API error responses.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--debug</code></td>
|
|
<td>off</td>
|
|
<td>Enable debug logging for API operations.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>--remote-only</code></td>
|
|
<td>off</td>
|
|
<td>Expose only the remote service session endpoints (health, services, search, session). Implies <code>--api-only</code>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>WVD files in the WVDs directory and PRD files in the PRDs directory are auto-loaded. The REST API lives under <code>http://<host>:<port>/api/</code>, with Swagger UI at <code>/api/docs/</code> and a health check at <code>/api/health</code>.</p>
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">Configure <code>api_secret</code> first</p>
|
|
<p>Unless you pass <code>--no-key</code>, <code>serve.api_secret</code> must be set in your config. Requests authenticate with the <code>X-Secret-Key</code> header. <code>--no-key</code> disables authentication entirely. Only use it on a trusted, private network.</p>
|
|
<div class="language-yaml highlight"><span class="filename">unshackle.yaml</span><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="nt">serve</span><span class="p">:</span>
|
|
</span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a><span class="w"> </span><span class="nt">api_secret</span><span class="p">:</span><span class="w"> </span><span class="s">"your-api-secret"</span>
|
|
</span><span id="__span-24-3"><a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a><span class="w"> </span><span class="nt">users</span><span class="p">:</span>
|
|
</span><span id="__span-24-4"><a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a><span class="w"> </span><span class="nt">your-secret-key</span><span class="p">:</span>
|
|
</span><span id="__span-24-5"><a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a><span class="w"> </span><span class="nt">devices</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"device_name"</span><span class="p p-Indicator">]</span><span class="w"> </span><span class="c1"># Widevine devices</span>
|
|
</span><span id="__span-24-6"><a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a><span class="w"> </span><span class="nt">playready_devices</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"device_name"</span><span class="p p-Indicator">]</span><span class="w"> </span><span class="c1"># PlayReady devices</span>
|
|
</span><span id="__span-24-7"><a id="__codelineno-24-7" name="__codelineno-24-7" href="#__codelineno-24-7"></a><span class="w"> </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">user</span>
|
|
</span></code></pre></div>
|
|
</div>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-25-1"><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a>unshackle<span class="w"> </span>serve
|
|
</span><span id="__span-25-2"><a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a>unshackle<span class="w"> </span>serve<span class="w"> </span>-h<span class="w"> </span><span class="m">0</span>.0.0.0<span class="w"> </span>-p<span class="w"> </span><span class="m">8080</span>
|
|
</span><span id="__span-25-3"><a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a>unshackle<span class="w"> </span>serve<span class="w"> </span>--api-only
|
|
</span><span id="__span-25-4"><a id="__codelineno-25-4" name="__codelineno-25-4" href="#__codelineno-25-4"></a>unshackle<span class="w"> </span>serve<span class="w"> </span>--remote-only
|
|
</span><span id="__span-25-5"><a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a>unshackle<span class="w"> </span>serve<span class="w"> </span>--caddy
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="util"><code>util</code><a class="headerlink" href="#util" title="Permanent link">¶</a></h2>
|
|
<p>Various helper media utilities. When you give a command a directory, it processes every <code>.mkv</code>/<code>.mp4</code> inside it in natural (S01E01 before S01E10) order.</p>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-26-1"><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a>unshackle util COMMAND [ARGS]...
|
|
</span></code></pre></div>
|
|
<h3 id="util-refresh-services"><code>util refresh-services</code><a class="headerlink" href="#util-refresh-services" title="Permanent link">¶</a></h3>
|
|
<div class="language-text highlight"><pre><span></span><code><span id="__span-27-1"><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a>unshackle util refresh-services
|
|
</span></code></pre></div>
|
|
<p>Force a refresh (git pull / hard reset) of all service repos configured under <code>directories.services</code>. This updates the clones on disk. A server that is already running reloads the changed services through <code>POST /api/maintenance/refresh-services</code> or <code>serve.services_refresh_interval</code> instead.</p>
|
|
<h3 id="util-crop-path-aspect"><code>util crop PATH ASPECT</code><a class="headerlink" href="#util-crop-path-aspect" title="Permanent link">¶</a></h3>
|
|
<p>Losslessly crop H.264/H.265 video at the bitstream level. <code>ASPECT</code> is a <code>W:H</code> target such as <code>2.39:1</code>.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--letter</code> / <code>--pillar</code></td>
|
|
<td><code>--letter</code></td>
|
|
<td>Crop top/bottom (<code>--letter</code>) or the sides (<code>--pillar</code>).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-o</code>, <code>--offset</code></td>
|
|
<td><code>0</code></td>
|
|
<td>Fine-tune the computed crop area if not perfectly centred.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-p</code>, <code>--preview</code></td>
|
|
<td>off</td>
|
|
<td>Preview the crop in MPV (or FFplay) instead of writing a file.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="util-range-path"><code>util range PATH</code><a class="headerlink" href="#util-range-path" title="Permanent link">¶</a></h3>
|
|
<p>Losslessly set the video range flag to full or limited at the bitstream level.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>--full</code> / <code>--limited</code></td>
|
|
<td>-</td>
|
|
<td>Full (0-255) or limited (16-235) range.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>-p</code>, <code>--preview</code></td>
|
|
<td>off</td>
|
|
<td>Preview instead of writing a file.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="util-test-path"><code>util test PATH</code><a class="headerlink" href="#util-test-path" title="Permanent link">¶</a></h3>
|
|
<p>Decode an entire video with FFmpeg and report any corruptions or errors. By default it does a test of every track. It cannot do a test of subtitles.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>-m</code>, <code>--map</code></td>
|
|
<td><code>0</code></td>
|
|
<td>Do a test of specific tracks with FFmpeg's <code>-map</code>, for example <code>0:v:0</code> or <code>0:a</code>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="admonition example">
|
|
<p class="admonition-title">Example</p>
|
|
<div class="language-shell highlight"><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a>unshackle<span class="w"> </span>util<span class="w"> </span>refresh-services
|
|
</span><span id="__span-28-2"><a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a>unshackle<span class="w"> </span>util<span class="w"> </span>crop<span class="w"> </span>video.mkv<span class="w"> </span><span class="m">2</span>.39:1
|
|
</span><span id="__span-28-3"><a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-3"></a>unshackle<span class="w"> </span>util<span class="w"> </span>crop<span class="w"> </span>./season/<span class="w"> </span><span class="m">16</span>:9<span class="w"> </span>--pillar<span class="w"> </span>-o<span class="w"> </span><span class="m">10</span>
|
|
</span><span id="__span-28-4"><a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-4"></a>unshackle<span class="w"> </span>util<span class="w"> </span>range<span class="w"> </span>video.mkv<span class="w"> </span>--full
|
|
</span><span id="__span-28-5"><a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-5"></a>unshackle<span class="w"> </span>util<span class="w"> </span><span class="nb">test</span><span class="w"> </span>video.mkv<span class="w"> </span>-m<span class="w"> </span><span class="m">0</span>:v:0
|
|
</span></code></pre></div>
|
|
</div>
|
|
<hr />
|
|
<h2 id="see-also">See also<a class="headerlink" href="#see-also" title="Permanent link">¶</a></h2>
|
|
<ul>
|
|
<li><a href="../../getting-started/installation/">Installation</a>: install unshackle and its dependencies.</li>
|
|
<li><a href="../../getting-started/quickstart/">Quickstart</a>: your first download.</li>
|
|
<li><a href="../../getting-started/configuration-file/">Configuration file</a>: set defaults for any <code>dl</code> flag and configure vaults, proxies, and directories.</li>
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</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="../downloading/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Downloading">
|
|
<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">
|
|
Downloading
|
|
</div>
|
|
</div>
|
|
</a>
|
|
|
|
|
|
|
|
<a href="../drm-and-cdm/" class="md-footer__link md-footer__link--next" aria-label="Next: DRM & CDM Setup">
|
|
<div class="md-footer__title">
|
|
<span class="md-footer__direction">
|
|
Next
|
|
</span>
|
|
<div class="md-ellipsis">
|
|
DRM & CDM Setup
|
|
</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> |