Bugfix and Docs

This commit is contained in:
michael committed 2026-03-10 13:12:57 +00:00
1 parent 3516ff8486
commit ac4d77dddf
75 files changed
+3510 -5141

No files matched your search

+29 -139
View File
@@ -1,139 +1,29 @@
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/encoding/ rel=canonical><link href=../workflow/ rel=prev><link href=../playlist-analysis/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Encode-Planung & Track-Auswahl - Ripster</title><link rel=stylesheet href=../../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#encode-planung-track-auswahl class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=../.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Encode-Planung & Track-Auswahl </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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/svLine truncated
</span><span id=__span-0-2><a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> ↓
</span><span id=__span-0-3><a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a>HandBrake --scan (alle Titel &amp; Tracks einlesen)
</span><span id=__span-0-4><a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> ↓
</span><span id=__span-0-5><a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a>buildTrackSelectors() ← Regeln aus Einstellungen ableiten
</span><span id=__span-0-6><a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> ↓
</span><span id=__span-0-7><a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a>selectTrackIds() ← Tracks anhand Regeln vorauswählen
</span><span id=__span-0-8><a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> ↓
</span><span id=__span-0-9><a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a>resolveAudioEncoderAction() ← Encoder-Aktion pro Track bestimmen
</span><span id=__span-0-10><a id=__codelineno-0-10 name=__codelineno-0-10 href=#__codelineno-0-10></a> ↓
</span><span id=__span-0-11><a id=__codelineno-0-11 name=__codelineno-0-11 href=#__codelineno-0-11></a>buildDiscScanReview() ← Vollständigen Encode-Plan erstellen
</span><span id=__span-0-12><a id=__codelineno-0-12 name=__codelineno-0-12 href=#__codelineno-0-12></a> ↓
</span><span id=__span-0-13><a id=__codelineno-0-13 name=__codelineno-0-13 href=#__codelineno-0-13></a>READY_TO_ENCODE ← Benutzer-Review im Frontend
</span><span id=__span-0-14><a id=__codelineno-0-14 name=__codelineno-0-14 href=#__codelineno-0-14></a> ↓
</span><span id=__span-0-15><a id=__codelineno-0-15 name=__codelineno-0-15 href=#__codelineno-0-15></a>applyManualTrackSelectionToPlan() ← Benutzer-Auswahl anwenden
</span><span id=__span-0-16><a id=__codelineno-0-16 name=__codelineno-0-16 href=#__codelineno-0-16></a> ↓
</span><span id=__span-0-17><a id=__codelineno-0-17 name=__codelineno-0-17 href=#__codelineno-0-17></a>ENCODING ← HandBrake-CLI mit finalem Plan starten
</span></code></pre></div> <hr> <h2 id=phase-1-pre-rip-track-scan>Phase 1: Pre-Rip Track-Scan<a class=headerlink href=#phase-1-pre-rip-track-scan title="Permanent link">&para;</a></h2> <p>Ripster führt einen <strong>HandBrake-Scan</strong> bereits <strong>vor dem eigentlichen Ripping</strong> durch:</p> <div class="language-bash highlight"><pre><span></span><code><span id=__span-1-1><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a>HandBrakeCLI<span class=w> </span>--scan<span class=w> </span>-i<span class=w> </span>/dev/sr0<span class=w> </span>-t<span class=w> </span><span class=m>0</span>
</span></code></pre></div> <p>Dieser Scan liest alle Titel und deren Tracks aus der Disc (ohne zu encodieren). So kann der Benutzer die Track-Auswahl bereits vor dem zeitintensiven Rip-Prozess bestätigen.</p> <div class="admonition info"> <p class=admonition-title>Pre-Rip vs. Post-Rip</p> <p>Ob der Scan vor oder nach dem Ripping passiert, hängt vom konfigurierten Modus ab. Bei direktem Disc-Zugriff ist Pre-Rip möglich; nach einem MakeMKV-Backup wird die entstandene <code>.mkv</code>-Datei gescannt.</p> </div> <hr> <h2 id=phase-2-track-selektor-regeln-buildtrackselectors>Phase 2: Track-Selektor-Regeln (<code>buildTrackSelectors</code>)<a class=headerlink href=#phase-2-track-selektor-regeln-buildtrackselectors title="Permanent link">&para;</a></h2> <p>Die Regeln werden aus den HandBrake-Einstellungen abgeleitet. Es gibt fünf <strong>Selektionsmodi</strong>:</p> <table> <thead> <tr> <th>Modus</th> <th>Beschreibung</th> </tr> </thead> <tbody> <tr> <td><code>none</code></td> <td>Keine Tracks dieser Art übernehmen</td> </tr> <tr> <td><code>first</code></td> <td>Nur den ersten Track übernehmen</td> </tr> <tr> <td><code>all</code></td> <td>Alle Tracks übernehmen</td> </tr> <tr> <td><code>language</code></td> <td>Nur Tracks in bestimmten Sprachen</td> </tr> <tr> <td><code>explicit</code></td> <td>Bestimmte Track-IDs explizit angeben</td> </tr> </tbody> </table> <p>Der aktive Modus wird aus den <code>handbrake_*</code>-Einstellungen und <code>handbrake_extra_args</code> abgeleitet. Explizite CLI-Argumente (<code>--audio</code>, <code>--audio-lang-list</code>) überschreiben die Basis-Konfiguration.</p> <hr> <h2 id=phase-3-automatische-vorauswahl-selecttrackids>Phase 3: Automatische Vorauswahl (<code>selectTrackIds</code>)<a class=headerlink href=#phase-3-automatische-vorauswahl-selecttrackids title="Permanent link">&para;</a></h2> <h3 id=audio-tracks>Audio-Tracks<a class=headerlink href=#audio-tracks title="Permanent link">&para;</a></h3> <div class="language-text highlight"><pre><span></span><code><span id=__span-2-1><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a>Modus &#39;none&#39; → Keine Audio-Tracks
</span><span id=__span-2-2><a id=__codelineno-2-2 name=__codelineno-2-2 href=#__codelineno-2-2></a>Modus &#39;all&#39; → Alle Tracks (oder nur erster, wenn firstOnly)
</span><span id=__span-2-3><a id=__codelineno-2-3 name=__codelineno-2-3 href=#__codelineno-2-3></a>Modus &#39;language&#39; → Alle Tracks in den konfigurierten Sprachen
</span><span id=__span-2-4><a id=__codelineno-2-4 name=__codelineno-2-4 href=#__codelineno-2-4></a>Modus &#39;explicit&#39; → Nur die angegebenen Track-IDs
</span><span id=__span-2-5><a id=__codelineno-2-5 name=__codelineno-2-5 href=#__codelineno-2-5></a>Modus &#39;first&#39; → Nur Track 1
</span></code></pre></div> <p>Jeder Audio-Track erhält das Feld <code>selectedByRule: true/false</code> – dieses zeigt dem Benutzer, welche Tracks automatisch vorausgewählt wurden.</p> <p><strong>Sprach-Normalisierung (<code>normalizeLanguage</code>):</strong></p> <p>Alle Sprachcodes werden auf <strong>ISO 639-2</strong> (3-Buchstaben) normalisiert:</p> <table> <thead> <tr> <th>Eingabe</th> <th>Normalisiert</th> </tr> </thead> <tbody> <tr> <td><code>de</code>, <code>ger</code></td> <td><code>deu</code></td> </tr> <tr> <td><code>German</code></td> <td><code>deu</code></td> </tr> <tr> <td><code>en</code>, <code>eng</code></td> <td><code>eng</code></td> </tr> <tr> <td><code>English</code></td> <td><code>eng</code></td> </tr> <tr> <td><code>fr</code>, <code>fre</code></td> <td><code>fra</code></td> </tr> <tr> <td><code>ja</code>, <code>jpn</code></td> <td><code>jpn</code></td> </tr> <tr> <td>Unbekannt</td> <td><code>und</code></td> </tr> </tbody> </table> <h3 id=untertitel-tracks>Untertitel-Tracks<a class=headerlink href=#untertitel-tracks title="Permanent link">&para;</a></h3> <p>Gleiche Modus-Logik wie Audio, aber mit <strong>zusätzlichen Flags</strong> pro Track:</p> <table> <thead> <tr> <th>Flag</th> <th>Bedeutung</th> </tr> </thead> <tbody> <tr> <td><code>burnIn</code></td> <td>Untertitel in Video einbrennen (<code>--subtitle-burned</code>)</td> </tr> <tr> <td><code>forced</code></td> <td>Nur erzwungene Untertitel übernehmen (<code>--subtitle-forced</code>)</td> </tr> <tr> <td><code>defaultTrack</code></td> <td>Als Standard-Untertitelspur markieren (<code>--subtitle-default</code>)</td> </tr> </tbody> </table> <p>Diese Flags werden im Encode-Review als Checkboxen angezeigt.</p> <hr> <h2 id=phase-4-encoder-aktion-bestimmen-resolveaudioencoderaction>Phase 4: Encoder-Aktion bestimmen (<code>resolveAudioEncoderAction</code>)<a class=headerlink href=#phase-4-encoder-aktion-bestimmen-resolveaudioencoderaction title="Permanent link">&para;</a></h2> <p>Für jeden vorausgewählten Audio-Track bestimmt Ripster die Encoder-Aktion:</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>Encoder-Einstellung Codec-Support in Copy-Mask? Aktion
</span><span id=__span-3-2><a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a>─────────────────────────────────────────────────────────────────────
</span><span id=__span-3-3><a id=__codelineno-3-3 name=__codelineno-3-3 href=#__codelineno-3-3></a>Kein Encoder / &#39;preset-default&#39; → preset-default HandBrake-Preset entscheidet
</span><span id=__span-3-4><a id=__codelineno-3-4 name=__codelineno-3-4 href=#__codelineno-3-4></a>encoder.startsWith(&#39;copy&#39;)
</span><span id=__span-3-5><a id=__codelineno-3-5 name=__codelineno-3-5 href=#__codelineno-3-5></a> UND Codec in audioCopyMask → copy Direktkopie (verlustfrei)
</span><span id=__span-3-6><a id=__codelineno-3-6 name=__codelineno-3-6 href=#__codelineno-3-6></a> UND Codec NICHT in audioCopyMask→ fallback Transcode mit Fallback-Encoder
</span><span id=__span-3-7><a id=__codelineno-3-7 name=__codelineno-3-7 href=#__codelineno-3-7></a>sonstiger Encoder → transcode Transcode mit explizitem Encoder
</span></code></pre></div> <p><strong>Encoder-Aktionstypen:</strong></p> <table> <thead> <tr> <th>Typ</th> <th>Label (UI)</th> <th>Qualität</th> </tr> </thead> <tbody> <tr> <td><code>preset-default</code></td> <td><code>Preset-Default (HandBrake)</code></td> <td>HandBrake entscheidet</td> </tr> <tr> <td><code>copy</code></td> <td><code>Copy (ac3)</code></td> <td>Verlustfrei</td> </tr> <tr> <td><code>fallback</code></td> <td><code>Fallback Transcode (av_aac)</code></td> <td>Mit Qualitätsverlust</td> </tr> <tr> <td><code>transcode</code></td> <td><code>Transcode (av_aac)</code></td> <td>Mit Qualitätsverlust</td> </tr> </tbody> </table> <p><strong>Copy-kompatible Codecs (Standard Copy-Mask):</strong></p> <table> <thead> <tr> <th>Codec</th> <th>Encoder-String</th> </tr> </thead> <tbody> <tr> <td>AC-3</td> <td><code>copy:ac3</code></td> </tr> <tr> <td>E-AC-3</td> <td><code>copy:eac3</code></td> </tr> <tr> <td>AAC</td> <td><code>copy:aac</code></td> </tr> <tr> <td>MP3</td> <td><code>copy:mp3</code></td> </tr> <tr> <td>TrueHD</td> <td><code>copy:truehd</code></td> </tr> <tr> <td>DTS</td> <td><code>copy:dts</code> <em>(nur mit spez. HandBrake-Build)</em></td> </tr> <tr> <td>DTS-HD</td> <td><code>copy:dtshd</code> <em>(nur mit spez. HandBrake-Build)</em></td> </tr> </tbody> </table> <div class="admonition warning"> <p class=admonition-title>DTS im Standard-HandBrake</p> <p>Standard-HandBrake-Builds unterstützen kein DTS-Passthrough. DTS-Tracks werden dann automatisch auf den Fallback-Encoder umgestellt (Standard: <code>av_aac</code>).</p> </div> <hr> <h2 id=phase-5-encode-plan-struktur>Phase 5: Encode-Plan-Struktur<a class=headerlink href=#phase-5-encode-plan-struktur title="Permanent link">&para;</a></h2> <p>Der vollständige Plan wird im Job-Datensatz als <code>encode_plan_json</code> gespeichert:</p> <div class="language-json highlight"><pre><span></span><code><span id=__span-4-1><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a><span class=p>{</span>
</span><span id=__span-4-2><a id=__codelineno-4-2 name=__codelineno-4-2 href=#__codelineno-4-2></a><span class=w> </span><span class=nt>&quot;mode&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;pre_rip&quot;</span><span class=p>,</span>
</span><span id=__span-4-3><a id=__codelineno-4-3 name=__codelineno-4-3 href=#__codelineno-4-3></a><span class=w> </span><span class=nt>&quot;preRip&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-4><a id=__codelineno-4-4 name=__codelineno-4-4 href=#__codelineno-4-4></a><span class=w> </span><span class=nt>&quot;encodeInputTitleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-4-5><a id=__codelineno-4-5 name=__codelineno-4-5 href=#__codelineno-4-5></a><span class=w> </span><span class=nt>&quot;encodeInputPath&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;disc-track-scan://title-1&quot;</span><span class=p>,</span>
</span><span id=__span-4-6><a id=__codelineno-4-6 name=__codelineno-4-6 href=#__codelineno-4-6></a><span class=w> </span><span class=nt>&quot;selectors&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-4-7><a id=__codelineno-4-7 name=__codelineno-4-7 href=#__codelineno-4-7></a><span class=w> </span><span class=nt>&quot;audio&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;mode&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;language&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;languages&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=s2>&quot;deu&quot;</span><span class=p>,</span><span class=w> </span><span class=s2>&quot;eng&quot;</span><span class=p>],</span><span class=w> </span><span class=nt>&quot;copyMask&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=s2>&quot;copy:ac3&quot;</span><span class=p>,</span><span class=w> </span><span class=s2>&quot;copy:eac3&quot;</span><span class=p>]</span><span class=w> </span><span class=p>},</span>
</span><span id=__span-4-8><a id=__codelineno-4-8 name=__codelineno-4-8 href=#__codelineno-4-8></a><span class=w> </span><span class=nt>&quot;subtitle&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;mode&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;none&quot;</span><span class=w> </span><span class=p>}</span>
</span><span id=__span-4-9><a id=__codelineno-4-9 name=__codelineno-4-9 href=#__codelineno-4-9></a><span class=w> </span><span class=p>},</span>
</span><span id=__span-4-10><a id=__codelineno-4-10 name=__codelineno-4-10 href=#__codelineno-4-10></a><span class=w> </span><span class=nt>&quot;titles&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-4-11><a id=__codelineno-4-11 name=__codelineno-4-11 href=#__codelineno-4-11></a><span class=w> </span><span class=p>{</span>
</span><span id=__span-4-12><a id=__codelineno-4-12 name=__codelineno-4-12 href=#__codelineno-4-12></a><span class=w> </span><span class=nt>&quot;id&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-4-13><a id=__codelineno-4-13 name=__codelineno-4-13 href=#__codelineno-4-13></a><span class=w> </span><span class=nt>&quot;fileName&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Disc Title 1&quot;</span><span class=p>,</span>
</span><span id=__span-4-14><a id=__codelineno-4-14 name=__codelineno-4-14 href=#__codelineno-4-14></a><span class=w> </span><span class=nt>&quot;durationSeconds&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>8885</span><span class=p>,</span>
</span><span id=__span-4-15><a id=__codelineno-4-15 name=__codelineno-4-15 href=#__codelineno-4-15></a><span class=w> </span><span class=nt>&quot;selectedByMinLength&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-16><a id=__codelineno-4-16 name=__codelineno-4-16 href=#__codelineno-4-16></a><span class=w> </span><span class=nt>&quot;isEncodeInput&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-17><a id=__codelineno-4-17 name=__codelineno-4-17 href=#__codelineno-4-17></a><span class=w> </span><span class=nt>&quot;audioTracks&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-4-18><a id=__codelineno-4-18 name=__codelineno-4-18 href=#__codelineno-4-18></a><span class=w> </span><span class=p>{</span>
</span><span id=__span-4-19><a id=__codelineno-4-19 name=__codelineno-4-19 href=#__codelineno-4-19></a><span class=w> </span><span class=nt>&quot;id&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-4-20><a id=__codelineno-4-20 name=__codelineno-4-20 href=#__codelineno-4-20></a><span class=w> </span><span class=nt>&quot;sourceTrackId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-4-21><a id=__codelineno-4-21 name=__codelineno-4-21 href=#__codelineno-4-21></a><span class=w> </span><span class=nt>&quot;language&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;eng&quot;</span><span class=p>,</span>
</span><span id=__span-4-22><a id=__codelineno-4-22 name=__codelineno-4-22 href=#__codelineno-4-22></a><span class=w> </span><span class=nt>&quot;languageLabel&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;English&quot;</span><span class=p>,</span>
</span><span id=__span-4-23><a id=__codelineno-4-23 name=__codelineno-4-23 href=#__codelineno-4-23></a><span class=w> </span><span class=nt>&quot;title&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;5.1 Surround&quot;</span><span class=p>,</span>
</span><span id=__span-4-24><a id=__codelineno-4-24 name=__codelineno-4-24 href=#__codelineno-4-24></a><span class=w> </span><span class=nt>&quot;format&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;AC3&quot;</span><span class=p>,</span>
</span><span id=__span-4-25><a id=__codelineno-4-25 name=__codelineno-4-25 href=#__codelineno-4-25></a><span class=w> </span><span class=nt>&quot;codecToken&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;ac3&quot;</span><span class=p>,</span>
</span><span id=__span-4-26><a id=__codelineno-4-26 name=__codelineno-4-26 href=#__codelineno-4-26></a><span class=w> </span><span class=nt>&quot;channels&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;6&quot;</span><span class=p>,</span>
</span><span id=__span-4-27><a id=__codelineno-4-27 name=__codelineno-4-27 href=#__codelineno-4-27></a><span class=w> </span><span class=nt>&quot;selectedByRule&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-28><a id=__codelineno-4-28 name=__codelineno-4-28 href=#__codelineno-4-28></a><span class=w> </span><span class=nt>&quot;selectedForEncode&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-29><a id=__codelineno-4-29 name=__codelineno-4-29 href=#__codelineno-4-29></a><span class=w> </span><span class=nt>&quot;encodePreviewActions&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-4-30><a id=__codelineno-4-30 name=__codelineno-4-30 href=#__codelineno-4-30></a><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;type&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;copy&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;encoder&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;copy:ac3&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;label&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Copy (ac3)&quot;</span><span class=w> </span><span class=p>}</span>
</span><span id=__span-4-31><a id=__codelineno-4-31 name=__codelineno-4-31 href=#__codelineno-4-31></a><span class=w> </span><span class=p>],</span>
</span><span id=__span-4-32><a id=__codelineno-4-32 name=__codelineno-4-32 href=#__codelineno-4-32></a><span class=w> </span><span class=nt>&quot;encodePreviewSummary&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Copy (ac3)&quot;</span>
</span><span id=__span-4-33><a id=__codelineno-4-33 name=__codelineno-4-33 href=#__codelineno-4-33></a><span class=w> </span><span class=p>},</span>
</span><span id=__span-4-34><a id=__codelineno-4-34 name=__codelineno-4-34 href=#__codelineno-4-34></a><span class=w> </span><span class=p>{</span>
</span><span id=__span-4-35><a id=__codelineno-4-35 name=__codelineno-4-35 href=#__codelineno-4-35></a><span class=w> </span><span class=nt>&quot;id&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>2</span><span class=p>,</span>
</span><span id=__span-4-36><a id=__codelineno-4-36 name=__codelineno-4-36 href=#__codelineno-4-36></a><span class=w> </span><span class=nt>&quot;sourceTrackId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>2</span><span class=p>,</span>
</span><span id=__span-4-37><a id=__codelineno-4-37 name=__codelineno-4-37 href=#__codelineno-4-37></a><span class=w> </span><span class=nt>&quot;language&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;deu&quot;</span><span class=p>,</span>
</span><span id=__span-4-38><a id=__codelineno-4-38 name=__codelineno-4-38 href=#__codelineno-4-38></a><span class=w> </span><span class=nt>&quot;languageLabel&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Deutsch&quot;</span><span class=p>,</span>
</span><span id=__span-4-39><a id=__codelineno-4-39 name=__codelineno-4-39 href=#__codelineno-4-39></a><span class=w> </span><span class=nt>&quot;format&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;DTS&quot;</span><span class=p>,</span>
</span><span id=__span-4-40><a id=__codelineno-4-40 name=__codelineno-4-40 href=#__codelineno-4-40></a><span class=w> </span><span class=nt>&quot;codecToken&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;dts&quot;</span><span class=p>,</span>
</span><span id=__span-4-41><a id=__codelineno-4-41 name=__codelineno-4-41 href=#__codelineno-4-41></a><span class=w> </span><span class=nt>&quot;channels&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;6&quot;</span><span class=p>,</span>
</span><span id=__span-4-42><a id=__codelineno-4-42 name=__codelineno-4-42 href=#__codelineno-4-42></a><span class=w> </span><span class=nt>&quot;selectedByRule&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-43><a id=__codelineno-4-43 name=__codelineno-4-43 href=#__codelineno-4-43></a><span class=w> </span><span class=nt>&quot;selectedForEncode&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-44><a id=__codelineno-4-44 name=__codelineno-4-44 href=#__codelineno-4-44></a><span class=w> </span><span class=nt>&quot;encodePreviewActions&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-4-45><a id=__codelineno-4-45 name=__codelineno-4-45 href=#__codelineno-4-45></a><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;type&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;fallback&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;encoder&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;av_aac&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;label&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Fallback Transcode (av_aac)&quot;</span><span class=w> </span><span class=p>}</span>
</span><span id=__span-4-46><a id=__codelineno-4-46 name=__codelineno-4-46 href=#__codelineno-4-46></a><span class=w> </span><span class=p>],</span>
</span><span id=__span-4-47><a id=__codelineno-4-47 name=__codelineno-4-47 href=#__codelineno-4-47></a><span class=w> </span><span class=nt>&quot;encodePreviewSummary&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Fallback Transcode (av_aac)&quot;</span>
</span><span id=__span-4-48><a id=__codelineno-4-48 name=__codelineno-4-48 href=#__codelineno-4-48></a><span class=w> </span><span class=p>},</span>
</span><span id=__span-4-49><a id=__codelineno-4-49 name=__codelineno-4-49 href=#__codelineno-4-49></a><span class=w> </span><span class=p>{</span>
</span><span id=__span-4-50><a id=__codelineno-4-50 name=__codelineno-4-50 href=#__codelineno-4-50></a><span class=w> </span><span class=nt>&quot;id&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>3</span><span class=p>,</span>
</span><span id=__span-4-51><a id=__codelineno-4-51 name=__codelineno-4-51 href=#__codelineno-4-51></a><span class=w> </span><span class=nt>&quot;language&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;fra&quot;</span><span class=p>,</span>
</span><span id=__span-4-52><a id=__codelineno-4-52 name=__codelineno-4-52 href=#__codelineno-4-52></a><span class=w> </span><span class=nt>&quot;languageLabel&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Français&quot;</span><span class=p>,</span>
</span><span id=__span-4-53><a id=__codelineno-4-53 name=__codelineno-4-53 href=#__codelineno-4-53></a><span class=w> </span><span class=nt>&quot;selectedByRule&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>false</span><span class=p>,</span>
</span><span id=__span-4-54><a id=__codelineno-4-54 name=__codelineno-4-54 href=#__codelineno-4-54></a><span class=w> </span><span class=nt>&quot;selectedForEncode&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>false</span><span class=p>,</span>
</span><span id=__span-4-55><a id=__codelineno-4-55 name=__codelineno-4-55 href=#__codelineno-4-55></a><span class=w> </span><span class=nt>&quot;encodePreviewSummary&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Nicht übernommen&quot;</span>
</span><span id=__span-4-56><a id=__codelineno-4-56 name=__codelineno-4-56 href=#__codelineno-4-56></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-4-57><a id=__codelineno-4-57 name=__codelineno-4-57 href=#__codelineno-4-57></a><span class=w> </span><span class=p>],</span>
</span><span id=__span-4-58><a id=__codelineno-4-58 name=__codelineno-4-58 href=#__codelineno-4-58></a><span class=w> </span><span class=nt>&quot;subtitleTracks&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-4-59><a id=__codelineno-4-59 name=__codelineno-4-59 href=#__codelineno-4-59></a><span class=w> </span><span class=p>{</span>
</span><span id=__span-4-60><a id=__codelineno-4-60 name=__codelineno-4-60 href=#__codelineno-4-60></a><span class=w> </span><span class=nt>&quot;id&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-4-61><a id=__codelineno-4-61 name=__codelineno-4-61 href=#__codelineno-4-61></a><span class=w> </span><span class=nt>&quot;language&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;deu&quot;</span><span class=p>,</span>
</span><span id=__span-4-62><a id=__codelineno-4-62 name=__codelineno-4-62 href=#__codelineno-4-62></a><span class=w> </span><span class=nt>&quot;selectedByRule&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-63><a id=__codelineno-4-63 name=__codelineno-4-63 href=#__codelineno-4-63></a><span class=w> </span><span class=nt>&quot;selectedForEncode&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-64><a id=__codelineno-4-64 name=__codelineno-4-64 href=#__codelineno-4-64></a><span class=w> </span><span class=nt>&quot;burnIn&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>false</span><span class=p>,</span>
</span><span id=__span-4-65><a id=__codelineno-4-65 name=__codelineno-4-65 href=#__codelineno-4-65></a><span class=w> </span><span class=nt>&quot;forced&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>false</span><span class=p>,</span>
</span><span id=__span-4-66><a id=__codelineno-4-66 name=__codelineno-4-66 href=#__codelineno-4-66></a><span class=w> </span><span class=nt>&quot;defaultTrack&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-4-67><a id=__codelineno-4-67 name=__codelineno-4-67 href=#__codelineno-4-67></a><span class=w> </span><span class=nt>&quot;subtitlePreviewSummary&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Übernehmen&quot;</span><span class=p>,</span>
</span><span id=__span-4-68><a id=__codelineno-4-68 name=__codelineno-4-68 href=#__codelineno-4-68></a><span class=w> </span><span class=nt>&quot;subtitlePreviewFlags&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=s2>&quot;default&quot;</span><span class=p>]</span>
</span><span id=__span-4-69><a id=__codelineno-4-69 name=__codelineno-4-69 href=#__codelineno-4-69></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-4-70><a id=__codelineno-4-70 name=__codelineno-4-70 href=#__codelineno-4-70></a><span class=w> </span><span class=p>]</span>
</span><span id=__span-4-71><a id=__codelineno-4-71 name=__codelineno-4-71 href=#__codelineno-4-71></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-4-72><a id=__codelineno-4-72 name=__codelineno-4-72 href=#__codelineno-4-72></a><span class=w> </span><span class=p>]</span>
</span><span id=__span-4-73><a id=__codelineno-4-73 name=__codelineno-4-73 href=#__codelineno-4-73></a><span class=p>}</span>
</span></code></pre></div> <hr> <h2 id=phase-6-benutzer-review-im-frontend-mediainforeviewpanel>Phase 6: Benutzer-Review im Frontend (<code>MediaInfoReviewPanel</code>)<a class=headerlink href=#phase-6-benutzer-review-im-frontend-mediainforeviewpanel title="Permanent link">&para;</a></h2> <p>Das Review-Panel zeigt:</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>┌─────────────────────────────────────────────────────────────────┐
</span><span id=__span-5-2><a id=__codelineno-5-2 name=__codelineno-5-2 href=#__codelineno-5-2></a>│ Encode-Review Titel: Disc Title 1 │
</span><span id=__span-5-3><a id=__codelineno-5-3 name=__codelineno-5-3 href=#__codelineno-5-3></a>│ Laufzeit: 2:28:05 │
</span><span id=__span-5-4><a id=__codelineno-5-4 name=__codelineno-5-4 href=#__codelineno-5-4></a>├─────────────────────────────────────────────────────────────────┤
</span><span id=__span-5-5><a id=__codelineno-5-5 name=__codelineno-5-5 href=#__codelineno-5-5></a>│ Audio-Spuren │
</span><span id=__span-5-6><a id=__codelineno-5-6 name=__codelineno-5-6 href=#__codelineno-5-6></a>├──────┬──────────────────────────┬──────────────────────────────┤
</span><span id=__span-5-7><a id=__codelineno-5-7 name=__codelineno-5-7 href=#__codelineno-5-7></a>│ [✓] │ Track 1: English (AC3) │ Copy (ac3) │
</span><span id=__span-5-8><a id=__codelineno-5-8 name=__codelineno-5-8 href=#__codelineno-5-8></a>│ [✓] │ Track 2: Deutsch (DTS) │ Fallback Transcode (av_aac) │
</span><span id=__span-5-9><a id=__codelineno-5-9 name=__codelineno-5-9 href=#__codelineno-5-9></a>│ [ ] │ Track 3: Français (DTS) │ Nicht übernommen │
</span><span id=__span-5-10><a id=__codelineno-5-10 name=__codelineno-5-10 href=#__codelineno-5-10></a>├──────┴──────────────────────────┴──────────────────────────────┤
</span><span id=__span-5-11><a id=__codelineno-5-11 name=__codelineno-5-11 href=#__codelineno-5-11></a>│ Untertitel-Spuren │
</span><span id=__span-5-12><a id=__codelineno-5-12 name=__codelineno-5-12 href=#__codelineno-5-12></a>├──────┬──────────────────────────┬────────┬────────┬────────────┤
</span><span id=__span-5-13><a id=__codelineno-5-13 name=__codelineno-5-13 href=#__codelineno-5-13></a>│ [✓] │ Track 1: Deutsch │Einbr.[ ]│Forced[ ]│Default[✓]│
</span><span id=__span-5-14><a id=__codelineno-5-14 name=__codelineno-5-14 href=#__codelineno-5-14></a>│ [ ] │ Track 2: English │Einbr.[ ]│Forced[ ]│Default[ ]│
</span><span id=__span-5-15><a id=__codelineno-5-15 name=__codelineno-5-15 href=#__codelineno-5-15></a>├──────┴──────────────────────────┴────────┴────────┴────────────┤
</span><span id=__span-5-16><a id=__codelineno-5-16 name=__codelineno-5-16 href=#__codelineno-5-16></a>│ [Encoding starten] │
</span><span id=__span-5-17><a id=__codelineno-5-17 name=__codelineno-5-17 href=#__codelineno-5-17></a>└─────────────────────────────────────────────────────────────────┘
</span></code></pre></div> <p>Der Benutzer kann: - <strong>Audio-Tracks</strong> per Checkbox aktivieren/deaktivieren - <strong>Untertitel-Flags</strong> (Einbrennen, Forced, Default) setzen - <strong>Mehrere Titel</strong> bei der Titleauswahl wechseln (für Discs mit mehreren Haupttiteln)</p> <hr> <h2 id=phase-7-benutzer-auswahl-anwenden-applymanualtrackselectiontoplan>Phase 7: Benutzer-Auswahl anwenden (<code>applyManualTrackSelectionToPlan</code>)<a class=headerlink href=#phase-7-benutzer-auswahl-anwenden-applymanualtrackselectiontoplan title="Permanent link">&para;</a></h2> <p>Im Frontend wird die Benutzer-Auswahl beim Klick auf <strong>"Encoding starten"</strong> (ggf. automatisch) bestätigt und dann auf den Plan angewendet:</p> <div class="language-json highlight"><pre><span></span><code><span id=__span-6-1><a id=__codelineno-6-1 name=__codelineno-6-1 href=#__codelineno-6-1></a><span class=err>Payload</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-6-2><a id=__codelineno-6-2 name=__codelineno-6-2 href=#__codelineno-6-2></a><span class=w> </span><span class=nt>&quot;selectedEncodeTitleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-6-3><a id=__codelineno-6-3 name=__codelineno-6-3 href=#__codelineno-6-3></a><span class=w> </span><span class=nt>&quot;selectedTrackSelection&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-6-4><a id=__codelineno-6-4 name=__codelineno-6-4 href=#__codelineno-6-4></a><span class=w> </span><span class=nt>&quot;1&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-6-5><a id=__codelineno-6-5 name=__codelineno-6-5 href=#__codelineno-6-5></a><span class=w> </span><span class=nt>&quot;audioTrackIds&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>1</span><span class=p>,</span><span class=w> </span><span class=mi>2</span><span class=p>],</span>
</span><span id=__span-6-6><a id=__codelineno-6-6 name=__codelineno-6-6 href=#__codelineno-6-6></a><span class=w> </span><span class=nt>&quot;subtitleTrackIds&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>1</span><span class=p>]</span>
</span><span id=__span-6-7><a id=__codelineno-6-7 name=__codelineno-6-7 href=#__codelineno-6-7></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-6-8><a id=__codelineno-6-8 name=__codelineno-6-8 href=#__codelineno-6-8></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-6-9><a id=__codelineno-6-9 name=__codelineno-6-9 href=#__codelineno-6-9></a><span class=p>}</span>
</span></code></pre></div> <p>Jeder Track erhält <code>selectedForEncode: true/false</code> entsprechend der Auswahl. Die Encoder-Aktionen (<code>encodeActions</code>) der nicht gewählten Tracks werden geleert.</p> <hr> <h2 id=phase-8-handbrake-cli-befehl>Phase 8: HandBrake-CLI-Befehl<a class=headerlink href=#phase-8-handbrake-cli-befehl title="Permanent link">&para;</a></h2> <p>Aus dem finalisierten Plan baut Ripster den HandBrake-Aufruf:</p> <div class="language-bash highlight"><pre><span></span><code><span id=__span-7-1><a id=__codelineno-7-1 name=__codelineno-7-1 href=#__codelineno-7-1></a>HandBrakeCLI<span class=w> </span><span class=se>\</span>
</span><span id=__span-7-2><a id=__codelineno-7-2 name=__codelineno-7-2 href=#__codelineno-7-2></a><span class=w> </span>-i<span class=w> </span>/dev/sr0<span class=w> </span><span class=se>\</span>
</span><span id=__span-7-3><a id=__codelineno-7-3 name=__codelineno-7-3 href=#__codelineno-7-3></a><span class=w> </span>-o<span class=w> </span><span class=s2>&quot;/mnt/movies/Inception (2010).mkv&quot;</span><span class=w> </span><span class=se>\</span>
</span><span id=__span-7-4><a id=__codelineno-7-4 name=__codelineno-7-4 href=#__codelineno-7-4></a><span class=w> </span>-t<span class=w> </span><span class=m>1</span><span class=w> </span><span class=se>\</span>
</span><span id=__span-7-5><a id=__codelineno-7-5 name=__codelineno-7-5 href=#__codelineno-7-5></a><span class=w> </span>--preset<span class=w> </span><span class=s2>&quot;H.265 MKV 1080p30&quot;</span><span class=w> </span><span class=se>\</span>
</span><span id=__span-7-6><a id=__codelineno-7-6 name=__codelineno-7-6 href=#__codelineno-7-6></a><span class=w> </span>-a<span class=w> </span><span class=m>1</span>,2<span class=w> </span><span class=se>\</span>
</span><span id=__span-7-7><a id=__codelineno-7-7 name=__codelineno-7-7 href=#__codelineno-7-7></a><span class=w> </span>-E<span class=w> </span>copy:ac3,av_aac<span class=w> </span><span class=se>\</span>
</span><span id=__span-7-8><a id=__codelineno-7-8 name=__codelineno-7-8 href=#__codelineno-7-8></a><span class=w> </span>-s<span class=w> </span><span class=m>1</span><span class=w> </span><span class=se>\</span>
</span><span id=__span-7-9><a id=__codelineno-7-9 name=__codelineno-7-9 href=#__codelineno-7-9></a><span class=w> </span>--subtitle-default<span class=w> </span><span class=m>1</span>
</span></code></pre></div> <table> <thead> <tr> <th>Argument</th> <th>Quelle</th> </tr> </thead> <tbody> <tr> <td><code>-i</code></td> <td><code>encode_input_path</code> aus Job</td> </tr> <tr> <td><code>-o</code></td> <td>Ausgabepfad aus <code>filename_template</code> + <code>movie_dir</code></td> </tr> <tr> <td><code>-t</code></td> <td>Gewählter Titel-Index</td> </tr> <tr> <td><code>-a</code></td> <td>Kommagetrennte Audio-Track-IDs der ausgewählten Tracks</td> </tr> <tr> <td><code>-E</code></td> <td>Kommagetrennte Encoder-Aktionen (eine pro Track, gleiche Reihenfolge wie <code>-a</code>)</td> </tr> <tr> <td><code>-s</code></td> <td>Kommagetrennte Untertitel-Track-IDs</td> </tr> <tr> <td><code>--subtitle-default</code></td> <td>Track-ID der als Default markierten Untertitelspur</td> </tr> <tr> <td><code>--preset</code></td> <td><code>handbrake_preset</code>-Einstellung</td> </tr> <tr> <td>Extras</td> <td><code>handbrake_extra_args</code>-Einstellung</td> </tr> </tbody> </table> <hr> <h2 id=dateiname-template>Dateiname-Template<a class=headerlink href=#dateiname-template title="Permanent link">&para;</a></h2> <table> <thead> <tr> <th>Platzhalter</th> <th>Wert</th> <th>Beispiel</th> </tr> </thead> <tbody> <tr> <td><code>{title}</code></td> <td>Filmtitel von OMDb</td> <td><code>Inception</code></td> </tr> <tr> <td><code>{year}</code></td> <td>Erscheinungsjahr</td> <td><code>2010</code></td> </tr> <tr> <td><code>{imdb_id}</code></td> <td>IMDb-ID</td> <td><code>tt1375666</code></td> </tr> <tr> <td><code>{type}</code></td> <td><code>movie</code> oder <code>series</code></td> <td><code>movie</code></td> </tr> </tbody> </table> <p>Sonderzeichen (<code>:</code>, <code>/</code>, <code>?</code>, <code>*</code> etc.) werden automatisch aus dem Dateinamen entfernt.</p> <hr> <h2 id=re-encoding>Re-Encoding<a class=headerlink href=#re-encoding title="Permanent link">&para;</a></h2> <p>Ein abgeschlossener Job kann ohne erneutes Ripping neu encodiert werden:</p> <ol> <li>Job in der <strong>History</strong> öffnen</li> <li><strong>"Re-Encode"</strong> klicken</li> <li>Track-Auswahl anpassen (oder bestehende übernehmen)</li> <li>Encoding startet mit den aktuellen <code>handbrake_*</code>-Einstellungen</li> </ol> <p>Nützlich bei geänderten Presets, anderen Sprach-Präferenzen oder nach einem Einstellungs-Update.</p> </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> Zurück zum Seitenanfang </button> </main> <footer class=md-footer> <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 class=md-social> <a href=https://github.com/YOUR_GITHUB_USERNAME/ripster target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2Line truncated
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/encoding/ rel=canonical><link href=../workflow/ rel=prev><link href=../playlist-analysis/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Encode-Planung & Track-Auswahl - Ripster</title><link rel=stylesheet href=../../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#encode-planung-track-auswahl class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=../.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Encode-Planung & Track-Auswahl </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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/svLine truncated
</span><span id=__span-0-2><a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> -&gt; HandBrake-Scan (--scan --json)
</span><span id=__span-0-3><a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> -&gt; Plan erstellen (Titel, Audio, Untertitel)
</span><span id=__span-0-4><a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> -&gt; READY_TO_ENCODE
</span><span id=__span-0-5><a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> -&gt; Benutzer bestätigt Auswahl
</span><span id=__span-0-6><a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> -&gt; finaler HandBrake-Aufruf
</span></code></pre></div> <hr> <h2 id=review-inhalt-ready_to_encode>Review-Inhalt (<code>READY_TO_ENCODE</code>)<a class=headerlink href=#review-inhalt-ready_to_encode title="Permanent link">&para;</a></h2> <ul> <li>auswählbarer Encode-Titel</li> <li>Audio-Track-Selektion</li> <li>Untertitel-Track-Selektion inkl. Flags</li> <li><code>burnIn</code></li> <li><code>forced</code></li> <li><code>defaultTrack</code></li> <li>optionale User-Presets (HandBrake-Preset + Extra-Args)</li> <li>optionale Pre-/Post-Skripte und Ketten</li> </ul> <hr> <h2 id=bestatigung-confirm-encode>Bestätigung (<code>confirm-encode</code>)<a class=headerlink href=#bestatigung-confirm-encode title="Permanent link">&para;</a></h2> <p>Typischer Payload:</p> <div class="language-json highlight"><pre><span></span><code><span id=__span-1-1><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=p>{</span>
</span><span id=__span-1-2><a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a><span class=w> </span><span class=nt>&quot;selectedEncodeTitleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-1-3><a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a><span class=w> </span><span class=nt>&quot;selectedTrackSelection&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-1-4><a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a><span class=w> </span><span class=nt>&quot;1&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-1-5><a id=__codelineno-1-5 name=__codelineno-1-5 href=#__codelineno-1-5></a><span class=w> </span><span class=nt>&quot;audioTrackIds&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>1</span><span class=p>,</span><span class=w> </span><span class=mi>2</span><span class=p>],</span>
</span><span id=__span-1-6><a id=__codelineno-1-6 name=__codelineno-1-6 href=#__codelineno-1-6></a><span class=w> </span><span class=nt>&quot;subtitleTrackIds&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>3</span><span class=p>]</span>
</span><span id=__span-1-7><a id=__codelineno-1-7 name=__codelineno-1-7 href=#__codelineno-1-7></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-1-8><a id=__codelineno-1-8 name=__codelineno-1-8 href=#__codelineno-1-8></a><span class=w> </span><span class=p>},</span>
</span><span id=__span-1-9><a id=__codelineno-1-9 name=__codelineno-1-9 href=#__codelineno-1-9></a><span class=w> </span><span class=nt>&quot;selectedPreEncodeScriptIds&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>1</span><span class=p>],</span>
</span><span id=__span-1-10><a id=__codelineno-1-10 name=__codelineno-1-10 href=#__codelineno-1-10></a><span class=w> </span><span class=nt>&quot;selectedPostEncodeScriptIds&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>2</span><span class=p>],</span>
</span><span id=__span-1-11><a id=__codelineno-1-11 name=__codelineno-1-11 href=#__codelineno-1-11></a><span class=w> </span><span class=nt>&quot;selectedPreEncodeChainIds&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>3</span><span class=p>],</span>
</span><span id=__span-1-12><a id=__codelineno-1-12 name=__codelineno-1-12 href=#__codelineno-1-12></a><span class=w> </span><span class=nt>&quot;selectedPostEncodeChainIds&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>4</span><span class=p>],</span>
</span><span id=__span-1-13><a id=__codelineno-1-13 name=__codelineno-1-13 href=#__codelineno-1-13></a><span class=w> </span><span class=nt>&quot;selectedUserPresetId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>5</span>
</span><span id=__span-1-14><a id=__codelineno-1-14 name=__codelineno-1-14 href=#__codelineno-1-14></a><span class=p>}</span>
</span></code></pre></div> <p>Ripster speichert die bestätigte Auswahl in <code>jobs.encode_plan_json</code> und markiert <code>encode_review_confirmed = 1</code>.</p> <hr> <h2 id=handbrake-aufruf>HandBrake-Aufruf<a class=headerlink href=#handbrake-aufruf title="Permanent link">&para;</a></h2> <p>Grundstruktur:</p> <div class="language-bash highlight"><pre><span></span><code><span id=__span-2-1><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a>HandBrakeCLI<span class=w> </span><span class=se>\</span>
</span><span id=__span-2-2><a id=__codelineno-2-2 name=__codelineno-2-2 href=#__codelineno-2-2></a><span class=w> </span>-i<span class=w> </span>&lt;input&gt;<span class=w> </span><span class=se>\</span>
</span><span id=__span-2-3><a id=__codelineno-2-3 name=__codelineno-2-3 href=#__codelineno-2-3></a><span class=w> </span>-o<span class=w> </span>&lt;output&gt;<span class=w> </span><span class=se>\</span>
</span><span id=__span-2-4><a id=__codelineno-2-4 name=__codelineno-2-4 href=#__codelineno-2-4></a><span class=w> </span>-t<span class=w> </span>&lt;titleId&gt;<span class=w> </span><span class=se>\</span>
</span><span id=__span-2-5><a id=__codelineno-2-5 name=__codelineno-2-5 href=#__codelineno-2-5></a><span class=w> </span>-Z<span class=w> </span><span class=s2>&quot;&lt;preset&gt;&quot;</span><span class=w> </span><span class=se>\</span>
</span><span id=__span-2-6><a id=__codelineno-2-6 name=__codelineno-2-6 href=#__codelineno-2-6></a><span class=w> </span>&lt;extra-args&gt;<span class=w> </span><span class=se>\</span>
</span><span id=__span-2-7><a id=__codelineno-2-7 name=__codelineno-2-7 href=#__codelineno-2-7></a><span class=w> </span>-a<span class=w> </span>&lt;audioTrackIds<span class=p>|</span>none&gt;<span class=w> </span><span class=se>\</span>
</span><span id=__span-2-8><a id=__codelineno-2-8 name=__codelineno-2-8 href=#__codelineno-2-8></a><span class=w> </span>-s<span class=w> </span>&lt;subtitleTrackIds<span class=p>|</span>none&gt;
</span></code></pre></div> <p>Untertitel-Flags werden bei Bedarf ergänzt:</p> <ul> <li><code>--subtitle-burned=&lt;id&gt;</code></li> <li><code>--subtitle-default=&lt;id&gt;</code></li> <li><code>--subtitle-forced=&lt;id&gt;</code> oder <code>--subtitle-forced</code></li> </ul> <hr> <h2 id=pre-post-encode-ausfuhrungen>Pre-/Post-Encode-Ausführungen<a class=headerlink href=#pre-post-encode-ausfuhrungen title="Permanent link">&para;</a></h2> <ul> <li>Pre-Encode läuft vor HandBrake</li> <li>Post-Encode läuft nach HandBrake</li> </ul> <p>Verhalten bei Fehlern:</p> <ul> <li>Pre-Encode-Fehler: Job wird als <code>ERROR</code> beendet (Encode startet nicht)</li> <li>Post-Encode-Fehler: Job kann <code>FINISHED</code> bleiben, enthält aber Fehlerhinweis/Script-Summary</li> </ul> <hr> <h2 id=dateinamenordner>Dateinamen/Ordner<a class=headerlink href=#dateinamenordner title="Permanent link">&para;</a></h2> <p>Der finale Outputpfad wird aus Settings-Templates aufgebaut.</p> <p>Platzhalter:</p> <ul> <li><code>${title}</code></li> <li><code>${year}</code></li> <li><code>${imdbId}</code></li> </ul> <p>Ungültige Dateizeichen werden sanitisiert.</p> </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> Zurück zum Seitenanfang </button> </main> <footer class=md-footer> <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 class=md-social> <a href=https://github.com/YOUR_GITHUB_USERNAME/ripster target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </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": ["navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.expand", "navigation.indexes", "navigation.top", "search.highlight", "search.suggest", "content.code.copy", "content.code.annotate", "content.tabs.link", "toc.integrate"], "search": "../../assets/javascripts/workers/search.7a47a382.min.js", "tags": null, "translations": {"clipboard.copied": "In Zwischenablage kopiert", "clipboard.copy": "In Zwischenablage kopieren", "search.result.more.one": "1 weiteres Suchergebnis auf dieser Seite", "search.result.more.other": "# weitere Suchergebnisse auf dieser Seite", "search.result.none": "Keine Suchergebnisse", "search.result.one": "1 Suchergebnis", "search.result.other": "# Suchergebnisse", "search.result.placeholder": "Suchbegriff eingeben", "search.result.term.missing": "Es fehlt", "select.version": "VerLine truncated
+1 -1
View File
@@ -1 +1 @@
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/ rel=canonical><link href=../architecture/database/ rel=prev><link href=workflow/ rel=next><link rel=icon href=../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Pipeline - Ripster</title><link rel=stylesheet href=../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#pipeline class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Pipeline </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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.2Line truncated
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/ rel=canonical><link href=../architecture/database/ rel=prev><link href=workflow/ rel=next><link rel=icon href=../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Pipeline - Ripster</title><link rel=stylesheet href=../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#pipeline class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Pipeline </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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.2Line truncated
+1 -74
View File
@@ -1,74 +1 @@
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/playlist-analysis/ rel=canonical><link href=../encoding/ rel=prev><link href=../post-encode-scripts/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Playlist-Analyse - Ripster</title><link rel=stylesheet href=../../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#playlist-analyse class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=../.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Playlist-Analyse </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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 dLine truncated
</span></code></pre></div> <p>Feld <strong>26</strong> enthält die kommagetrennte Liste der Segment-Nummern in der Abspielreihenfolge des Titels.</p> <hr> <h2 id=algorithmus-im-detail-playlistanalysisjs>Algorithmus im Detail (<code>playlistAnalysis.js</code>)<a class=headerlink href=#algorithmus-im-detail-playlistanalysisjs title="Permanent link">&para;</a></h2> <h3 id=schritt-1-segment-nummern-parsen>Schritt 1 – Segment-Nummern parsen<a class=headerlink href=#schritt-1-segment-nummern-parsen title="Permanent link">&para;</a></h3> <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>TINFO:1,26,&quot;00000,00001,00002,00003&quot; → [0, 1, 2, 3] linearer Film
</span><span id=__span-1-2><a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a>TINFO:2,26,&quot;00100,00050,00100,00051&quot; → [100, 50, 100, 51] Fake-Playlist
</span></code></pre></div> <h3 id=schritt-2-metriken-berechnen-computesegmentmetrics>Schritt 2 – Metriken berechnen (<code>computeSegmentMetrics</code>)<a class=headerlink href=#schritt-2-metriken-berechnen-computesegmentmetrics title="Permanent link">&para;</a></h3> <p>Für jedes aufeinanderfolgende Segment-Paar <code>[a, b]</code> wird <code>diff = b − a</code> berechnet:</p> <table> <thead> <tr> <th>Metrik</th> <th>Bedingung</th> <th>Bedeutung</th> </tr> </thead> <tbody> <tr> <td><code>directSequenceSteps</code></td> <td><code>diff == 1</code></td> <td>Aufeinanderfolgende Segmente → linearer Film</td> </tr> <tr> <td><code>backwardJumps</code></td> <td><code>b &lt; a</code></td> <td>Rückwärtssprünge → verdächtig</td> </tr> <tr> <td><code>largeJumps</code></td> <td><code>\|diff\| &gt; 20</code></td> <td>Große Sprünge → verdächtig</td> </tr> <tr> <td><code>alternatingPairs</code></td> <td>Große Sprünge mit <strong>wechselndem Vorzeichen</strong></td> <td>Hin-und-her-Muster → starker Fake-Indikator</td> </tr> </tbody> </table> <p><strong>Score-Formel:</strong></p> <div class="language-text highlight"><pre><span></span><code><span id=__span-2-1><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a>score = (directSequenceSteps × 2) − (backwardJumps × 3) − (largeJumps × 2)
</span></code></pre></div> <p><strong>Konkrete Beispiele:</strong></p> <table> <thead> <tr> <th>Segmentfolge</th> <th>directSeq</th> <th>backward</th> <th>large</th> <th>score</th> <th>Ergebnis</th> </tr> </thead> <tbody> <tr> <td><code>0,1,2,3,4,5</code></td> <td>5</td> <td>0</td> <td>0</td> <td>+10</td> <td>Echter Film</td> </tr> <tr> <td><code>0,1,100,2,101,3</code></td> <td>2</td> <td>0</td> <td>4</td> <td>-4</td> <td>Verdächtig</td> </tr> <tr> <td><code>50,10,60,11,70,12</code></td> <td>0</td> <td>3</td> <td>3</td> <td>-15</td> <td>Fake</td> </tr> </tbody> </table> <h3 id=schritt-3-bewertungslabel-vergeben-buildevaluationlabel>Schritt 3 – Bewertungslabel vergeben (<code>buildEvaluationLabel</code>)<a class=headerlink href=#schritt-3-bewertungslabel-vergeben-buildevaluationlabel title="Permanent link">&para;</a></h3> <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>alternatingRatio = alternatingPairs / largeJumps
</span><span id=__span-3-2><a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a>
</span><span id=__span-3-3><a id=__codelineno-3-3 name=__codelineno-3-3 href=#__codelineno-3-3></a>if alternatingRatio &gt;= 0.55 AND alternatingPairs &gt;= 3:
</span><span id=__span-3-4><a id=__codelineno-3-4 name=__codelineno-3-4 href=#__codelineno-3-4></a> → &quot;Fake-Struktur (alternierendes Sprungmuster)&quot;
</span><span id=__span-3-5><a id=__codelineno-3-5 name=__codelineno-3-5 href=#__codelineno-3-5></a>
</span><span id=__span-3-6><a id=__codelineno-3-6 name=__codelineno-3-6 href=#__codelineno-3-6></a>else if backwardJumps &gt; 0 OR largeJumps &gt; 0:
</span><span id=__span-3-7><a id=__codelineno-3-7 name=__codelineno-3-7 href=#__codelineno-3-7></a> → &quot;Auffällige Segmentreihenfolge&quot;
</span><span id=__span-3-8><a id=__codelineno-3-8 name=__codelineno-3-8 href=#__codelineno-3-8></a>
</span><span id=__span-3-9><a id=__codelineno-3-9 name=__codelineno-3-9 href=#__codelineno-3-9></a>else:
</span><span id=__span-3-10><a id=__codelineno-3-10 name=__codelineno-3-10 href=#__codelineno-3-10></a> → &quot;wahrscheinlich korrekt (lineare Segmentfolge)&quot;
</span></code></pre></div> <h3 id=schritt-4-duplikat-gruppen-bilden-buildsimilaritygroups>Schritt 4 – Duplikat-Gruppen bilden (<code>buildSimilarityGroups</code>)<a class=headerlink href=#schritt-4-duplikat-gruppen-bilden-buildsimilaritygroups title="Permanent link">&para;</a></h3> <p>Alle Titel werden nach <strong>ähnlicher Laufzeit</strong> gruppiert (±90 Sekunden Toleranz). Gibt es mehrere Kandidaten mit ähnlicher Laufzeit, ist das ein klares Zeichen für Obfuskierung:</p> <div class="language-text highlight"><pre><span></span><code><span id=__span-4-1><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a>8 Titel mit ~148 Minuten Laufzeit → Duplikat-Gruppe
</span><span id=__span-4-2><a id=__codelineno-4-2 name=__codelineno-4-2 href=#__codelineno-4-2></a>→ obfuscationDetected = true
</span></code></pre></div> <h3 id=schritt-5-besten-kandidaten-empfehlen-scorecandidates>Schritt 5 – Besten Kandidaten empfehlen (<code>scoreCandidates</code>)<a class=headerlink href=#schritt-5-besten-kandidaten-empfehlen-scorecandidates title="Permanent link">&para;</a></h3> <p>Innerhalb der größten Duplikat-Gruppe werden alle Kandidaten sortiert nach:</p> <ol> <li><code>score</code> (höher = besser)</li> <li><code>sequenceCoherence</code> (Anteil linearer Segmentschritte)</li> <li>Laufzeit (länger = besser)</li> <li>Dateigröße (größer = besser als Tiebreaker)</li> </ol> <p>Der <strong>erste Kandidat</strong> der sortierten Liste ist die Empfehlung.</p> <h3 id=schritt-6-entscheidung-erzwingen-bei-mehreren-kandidaten>Schritt 6 – Entscheidung erzwingen bei mehreren Kandidaten<a class=headerlink href=#schritt-6-entscheidung-erzwingen-bei-mehreren-kandidaten title="Permanent link">&para;</a></h3> <p>Sobald nach <code>MIN_LENGTH_MINUTES</code> <strong>mehr als eine</strong> Playlist übrig bleibt, wird immer eine manuelle Auswahl verlangt:</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>candidateCount &gt; 1 → manualDecisionRequired = true
</span><span id=__span-5-2><a id=__codelineno-5-2 name=__codelineno-5-2 href=#__codelineno-5-2></a>candidateCount &lt;= 1 → manualDecisionRequired = false
</span></code></pre></div> <hr> <h2 id=wann-greift-der-benutzer-ein>Wann greift der Benutzer ein?<a class=headerlink href=#wann-greift-der-benutzer-ein title="Permanent link">&para;</a></h2> <div class="language-text highlight"><pre><span></span><code><span id=__span-6-1><a id=__codelineno-6-1 name=__codelineno-6-1 href=#__codelineno-6-1></a>obfuscationDetected = duplicateDurationGroups.length &gt; 0
</span><span id=__span-6-2><a id=__codelineno-6-2 name=__codelineno-6-2 href=#__codelineno-6-2></a>manualDecisionRequired = candidates.length &gt; 1
</span></code></pre></div> <table> <thead> <tr> <th>Ergebnis</th> <th>Nächster Pipeline-Zustand</th> <th>Aktion</th> </tr> </thead> <tbody> <tr> <td>Nur ein Kandidat nach Mindestlänge</td> <td><code>READY_TO_START</code></td> <td>Automatische Übernahme möglich</td> </tr> <tr> <td>Mehrere Kandidaten nach Mindestlänge</td> <td><code>WAITING_FOR_USER_DECISION</code></td> <td>Benutzer muss Playlist auswählen</td> </tr> </tbody> </table> <hr> <h2 id=benutzeroberflache-playlist-auswahl-dialog>Benutzeroberfläche: Playlist-Auswahl-Dialog<a class=headerlink href=#benutzeroberflache-playlist-auswahl-dialog title="Permanent link">&para;</a></h2> <p>Wenn <code>manualDecisionRequired = true</code>, öffnet sich der Playlist-Dialog <strong>nach</strong> dem Metadaten-Dialog:</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>┌───────────────────────────────────────────────────────────────────┐
</span><span id=__span-7-2><a id=__codelineno-7-2 name=__codelineno-7-2 href=#__codelineno-7-2></a>│ Playlist-Auswahl │
</span><span id=__span-7-3><a id=__codelineno-7-3 name=__codelineno-7-3 href=#__codelineno-7-3></a>├──────────┬──────────┬──────────┬────────────────────────────────┤
</span><span id=__span-7-4><a id=__codelineno-7-4 name=__codelineno-7-4 href=#__codelineno-7-4></a>│ Playlist │ Laufzeit │ Score │ Bewertung │
</span><span id=__span-7-5><a id=__codelineno-7-5 name=__codelineno-7-5 href=#__codelineno-7-5></a>├──────────┼──────────┼──────────┼────────────────────────────────┤
</span><span id=__span-7-6><a id=__codelineno-7-6 name=__codelineno-7-6 href=#__codelineno-7-6></a>│ ★ 00800 │ 2:28:05 │ +18 │ wahrscheinlich korrekt │
</span><span id=__span-7-7><a id=__codelineno-7-7 name=__codelineno-7-7 href=#__codelineno-7-7></a>│ │ │ │ (lineare Segmentfolge) │
</span><span id=__span-7-8><a id=__codelineno-7-8 name=__codelineno-7-8 href=#__codelineno-7-8></a>├──────────┼──────────┼──────────┼────────────────────────────────┤
</span><span id=__span-7-9><a id=__codelineno-7-9 name=__codelineno-7-9 href=#__codelineno-7-9></a>│ 00801 │ 2:28:12 │ −4 │ Auffällige Segmentreihenfolge │
</span><span id=__span-7-10><a id=__codelineno-7-10 name=__codelineno-7-10 href=#__codelineno-7-10></a>├──────────┼──────────┼──────────┼────────────────────────────────┤
</span><span id=__span-7-11><a id=__codelineno-7-11 name=__codelineno-7-11 href=#__codelineno-7-11></a>│ 00900 │ 2:28:05 │ −32 │ Fake-Struktur │
</span><span id=__span-7-12><a id=__codelineno-7-12 name=__codelineno-7-12 href=#__codelineno-7-12></a>│ │ │ │ (alternierendes Sprungmuster) │
</span><span id=__span-7-13><a id=__codelineno-7-13 name=__codelineno-7-13 href=#__codelineno-7-13></a>└──────────┴──────────┴──────────┴────────────────────────────────┘
</span><span id=__span-7-14><a id=__codelineno-7-14 name=__codelineno-7-14 href=#__codelineno-7-14></a> Hinweis: 847 Playlists insgesamt. 3 relevante Kandidaten (≥ 15 min).
</span><span id=__span-7-15><a id=__codelineno-7-15 name=__codelineno-7-15 href=#__codelineno-7-15></a> Empfehlung: 00800 (★)
</span></code></pre></div> <ul> <li><strong>★</strong> markiert die empfohlene Playlist (vorausgewählt)</li> <li>Nur Titel ≥ <code>makemkv_min_length_minutes</code> erscheinen in der Liste</li> <li>Der Benutzer wählt per Radio-Button und klickt "Bestätigen"</li> <li>Erst nach dieser Bestätigung wechselt die Pipeline zu <code>READY_TO_START</code></li> </ul> <hr> <h2 id=vollstandige-datenstruktur-analyzecontextplaylistanalysis>Vollständige Datenstruktur (<code>analyzeContext.playlistAnalysis</code>)<a class=headerlink href=#vollstandige-datenstruktur-analyzecontextplaylistanalysis title="Permanent link">&para;</a></h2> <div class="language-json highlight"><pre><span></span><code><span id=__span-8-1><a id=__codelineno-8-1 name=__codelineno-8-1 href=#__codelineno-8-1></a><span class=p>{</span>
</span><span id=__span-8-2><a id=__codelineno-8-2 name=__codelineno-8-2 href=#__codelineno-8-2></a><span class=w> </span><span class=nt>&quot;titles&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-8-3><a id=__codelineno-8-3 name=__codelineno-8-3 href=#__codelineno-8-3></a><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;titleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;playlistId&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;00800&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;durationSeconds&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>8885</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;durationLabel&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;2:28:05&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;chapters&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>28</span><span class=w> </span><span class=p>}</span>
</span><span id=__span-8-4><a id=__codelineno-8-4 name=__codelineno-8-4 href=#__codelineno-8-4></a><span class=w> </span><span class=p>],</span>
</span><span id=__span-8-5><a id=__codelineno-8-5 name=__codelineno-8-5 href=#__codelineno-8-5></a><span class=w> </span><span class=nt>&quot;candidates&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-8-6><a id=__codelineno-8-6 name=__codelineno-8-6 href=#__codelineno-8-6></a><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;titleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;playlistId&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;00800&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;durationSeconds&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>8885</span><span class=w> </span><span class=p>},</span>
</span><span id=__span-8-7><a id=__codelineno-8-7 name=__codelineno-8-7 href=#__codelineno-8-7></a><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;titleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>2</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;playlistId&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;00801&quot;</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;durationSeconds&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>8892</span><span class=w> </span><span class=p>}</span>
</span><span id=__span-8-8><a id=__codelineno-8-8 name=__codelineno-8-8 href=#__codelineno-8-8></a><span class=w> </span><span class=p>],</span>
</span><span id=__span-8-9><a id=__codelineno-8-9 name=__codelineno-8-9 href=#__codelineno-8-9></a><span class=w> </span><span class=nt>&quot;evaluatedCandidates&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-8-10><a id=__codelineno-8-10 name=__codelineno-8-10 href=#__codelineno-8-10></a><span class=w> </span><span class=p>{</span>
</span><span id=__span-8-11><a id=__codelineno-8-11 name=__codelineno-8-11 href=#__codelineno-8-11></a><span class=w> </span><span class=nt>&quot;titleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-8-12><a id=__codelineno-8-12 name=__codelineno-8-12 href=#__codelineno-8-12></a><span class=w> </span><span class=nt>&quot;playlistId&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;00800&quot;</span><span class=p>,</span>
</span><span id=__span-8-13><a id=__codelineno-8-13 name=__codelineno-8-13 href=#__codelineno-8-13></a><span class=w> </span><span class=nt>&quot;score&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>18</span><span class=p>,</span>
</span><span id=__span-8-14><a id=__codelineno-8-14 name=__codelineno-8-14 href=#__codelineno-8-14></a><span class=w> </span><span class=nt>&quot;sequenceCoherence&quot;</span><span class=p>:</span><span class=w> </span><span class=mf>0.95</span><span class=p>,</span>
</span><span id=__span-8-15><a id=__codelineno-8-15 name=__codelineno-8-15 href=#__codelineno-8-15></a><span class=w> </span><span class=nt>&quot;evaluationLabel&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;wahrscheinlich korrekt (lineare Segmentfolge)&quot;</span><span class=p>,</span>
</span><span id=__span-8-16><a id=__codelineno-8-16 name=__codelineno-8-16 href=#__codelineno-8-16></a><span class=w> </span><span class=nt>&quot;metrics&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-8-17><a id=__codelineno-8-17 name=__codelineno-8-17 href=#__codelineno-8-17></a><span class=w> </span><span class=nt>&quot;directSequenceSteps&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>12</span><span class=p>,</span>
</span><span id=__span-8-18><a id=__codelineno-8-18 name=__codelineno-8-18 href=#__codelineno-8-18></a><span class=w> </span><span class=nt>&quot;backwardJumps&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>0</span><span class=p>,</span>
</span><span id=__span-8-19><a id=__codelineno-8-19 name=__codelineno-8-19 href=#__codelineno-8-19></a><span class=w> </span><span class=nt>&quot;largeJumps&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-8-20><a id=__codelineno-8-20 name=__codelineno-8-20 href=#__codelineno-8-20></a><span class=w> </span><span class=nt>&quot;alternatingPairs&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>0</span>
</span><span id=__span-8-21><a id=__codelineno-8-21 name=__codelineno-8-21 href=#__codelineno-8-21></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-8-22><a id=__codelineno-8-22 name=__codelineno-8-22 href=#__codelineno-8-22></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-8-23><a id=__codelineno-8-23 name=__codelineno-8-23 href=#__codelineno-8-23></a><span class=w> </span><span class=p>],</span>
</span><span id=__span-8-24><a id=__codelineno-8-24 name=__codelineno-8-24 href=#__codelineno-8-24></a><span class=w> </span><span class=nt>&quot;duplicateDurationGroups&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-8-25><a id=__codelineno-8-25 name=__codelineno-8-25 href=#__codelineno-8-25></a><span class=w> </span><span class=p>[</span>
</span><span id=__span-8-26><a id=__codelineno-8-26 name=__codelineno-8-26 href=#__codelineno-8-26></a><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;titleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;playlistId&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;00800&quot;</span><span class=w> </span><span class=p>},</span>
</span><span id=__span-8-27><a id=__codelineno-8-27 name=__codelineno-8-27 href=#__codelineno-8-27></a><span class=w> </span><span class=p>{</span><span class=w> </span><span class=nt>&quot;titleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>2</span><span class=p>,</span><span class=w> </span><span class=nt>&quot;playlistId&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;00801&quot;</span><span class=w> </span><span class=p>}</span>
</span><span id=__span-8-28><a id=__codelineno-8-28 name=__codelineno-8-28 href=#__codelineno-8-28></a><span class=w> </span><span class=p>]</span>
</span><span id=__span-8-29><a id=__codelineno-8-29 name=__codelineno-8-29 href=#__codelineno-8-29></a><span class=w> </span><span class=p>],</span>
</span><span id=__span-8-30><a id=__codelineno-8-30 name=__codelineno-8-30 href=#__codelineno-8-30></a><span class=w> </span><span class=nt>&quot;recommendation&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-8-31><a id=__codelineno-8-31 name=__codelineno-8-31 href=#__codelineno-8-31></a><span class=w> </span><span class=nt>&quot;titleId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-8-32><a id=__codelineno-8-32 name=__codelineno-8-32 href=#__codelineno-8-32></a><span class=w> </span><span class=nt>&quot;playlistId&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;00800&quot;</span><span class=p>,</span>
</span><span id=__span-8-33><a id=__codelineno-8-33 name=__codelineno-8-33 href=#__codelineno-8-33></a><span class=w> </span><span class=nt>&quot;score&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>18</span><span class=p>,</span>
</span><span id=__span-8-34><a id=__codelineno-8-34 name=__codelineno-8-34 href=#__codelineno-8-34></a><span class=w> </span><span class=nt>&quot;reason&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Höchster Segment-Score in der größten Laufzeit-Gruppe&quot;</span>
</span><span id=__span-8-35><a id=__codelineno-8-35 name=__codelineno-8-35 href=#__codelineno-8-35></a><span class=w> </span><span class=p>},</span>
</span><span id=__span-8-36><a id=__codelineno-8-36 name=__codelineno-8-36 href=#__codelineno-8-36></a><span class=w> </span><span class=nt>&quot;obfuscationDetected&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span><span class=p>,</span>
</span><span id=__span-8-37><a id=__codelineno-8-37 name=__codelineno-8-37 href=#__codelineno-8-37></a><span class=w> </span><span class=nt>&quot;manualDecisionRequired&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>true</span>
</span><span id=__span-8-38><a id=__codelineno-8-38 name=__codelineno-8-38 href=#__codelineno-8-38></a><span class=p>}</span>
</span></code></pre></div> <hr> <h2 id=konfiguration>Konfiguration<a class=headerlink href=#konfiguration title="Permanent link">&para;</a></h2> <table> <thead> <tr> <th>Einstellung</th> <th>Standard</th> <th>Wirkung</th> </tr> </thead> <tbody> <tr> <td><code>makemkv_min_length_minutes</code></td> <td><code>15</code></td> <td>Titel kürzer als dieser Wert werden als Kandidaten ignoriert</td> </tr> </tbody> </table> <hr> <h2 id=tipps-bei-fehlempfehlung>Tipps bei Fehlempfehlung<a class=headerlink href=#tipps-bei-fehlempfehlung title="Permanent link">&para;</a></h2> <div class="admonition tip"> <p class=admonition-title>Falsche Playlist gewählt?</p> <p>Wenn das resultierende Video zerstückelt ist:</p> <ol> <li>Job in der <strong>History</strong> öffnen</li> <li><strong>Re-Encode</strong> starten – diesmal eine andere Playlist wählen</li> <li>Alternativ: Korrekte Playlist im <a href=https://www.makemkv.com/forum/ >MakeMKV-Forum</a> recherchieren</li> </ol> </div> <div class="admonition info"> <p class=admonition-title>Keine Segment-Daten verfügbar</p> <p>Bei DVDs oder älteren Blu-rays liefert MakeMKV manchmal keine Segmentinfos (TINFO-Feld 26 fehlt). In diesem Fall entfällt die Analyse und der erste Titel über der Mindestlänge wird automatisch verwendet.</p> </div> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Zurück zum Seitenanfang </button> </main> <footer class=md-footer> <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 class=md-social> <a href=https://github.com/YOUR_GITHUB_USERNAME/ripster target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </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": ["navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.expand", "navigation.indexes", "navigation.top", "search.highlight", "search.suggest", "content.code.copy", "content.code.annotate", "content.tabs.link", "toc.integrate"], "search": "../../assets/javascripts/workers/search.7a47a382.min.js", "tags": null, "translations": {"clipboard.copied": "In Zwischenablage kopiert", "clipboard.copy": "In Zwischenablage kopieren", "search.result.more.one": "1 weiteres Suchergebnis auf dieser Seite", "search.result.more.other": "# weitere Suchergebnisse auf dieser Seite", "search.result.none": "Keine Suchergebnisse", "search.result.one": "1 Suchergebnis", "search.result.other":Line truncated
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/playlist-analysis/ rel=canonical><link href=../encoding/ rel=prev><link href=../post-encode-scripts/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Playlist-Analyse - Ripster</title><link rel=stylesheet href=../../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#playlist-analyse class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=../.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Playlist-Analyse </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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 dLine truncated
+6 -55
View File
@@ -1,55 +1,6 @@
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/post-encode-scripts/ rel=canonical><link href=../playlist-analysis/ rel=prev><link href=../../api/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Post-Encode-Skripte - Ripster</title><link rel=stylesheet href=../../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#post-encode-skripte class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=../.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Post-Encode-Skripte </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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">Line truncated
</span><span id=__span-0-2><a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> ↓
</span><span id=__span-0-3><a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a>Skript 1 ausführen ← Fehler? → Abbruch
</span><span id=__span-0-4><a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> ↓
</span><span id=__span-0-5><a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a>Skript 2 ausführen ← Fehler? → Abbruch
</span><span id=__span-0-6><a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> ↓
</span><span id=__span-0-7><a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> ...
</span><span id=__span-0-8><a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> ↓
</span><span id=__span-0-9><a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a>FINISHED
</span></code></pre></div> <div class="admonition warning"> <p class=admonition-title>Abbruch bei Fehler</p> <p>Schlägt ein Skript fehl (Exit-Code ≠ 0), werden alle nachfolgenden Skripte <strong>nicht mehr ausgeführt</strong>. Der Job bleibt im Abschlusszustand <code>FINISHED</code>; der Fehler wird in Log/Status-Text und im <code>postEncodeScripts</code>-Summary festgehalten.</p> </div> <hr> <h2 id=skript-verwaltung>Skript-Verwaltung<a class=headerlink href=#skript-verwaltung title="Permanent link">&para;</a></h2> <p>Skripte werden über die <strong>Einstellungen-Seite</strong> angelegt und verwaltet. Sie stehen danach in jedem Encode-Review zur Auswahl.</p> <h3 id=skript-anlegen>Skript anlegen<a class=headerlink href=#skript-anlegen title="Permanent link">&para;</a></h3> <p>Navigiere zu <strong>Einstellungen → Skripte</strong> und klicke <strong>"Neues Skript"</strong>:</p> <table> <thead> <tr> <th>Feld</th> <th>Beschreibung</th> </tr> </thead> <tbody> <tr> <td><strong>Name</strong></td> <td>Anzeigename des Skripts (z. B. <code>Zu Plex verschieben</code>)</td> </tr> <tr> <td><strong>Befehl</strong></td> <td>Shell-Befehl oder Skriptpfad (z. B. <code>/home/michael/scripts/move-to-plex.sh</code>)</td> </tr> <tr> <td><strong>Beschreibung</strong></td> <td>Optionale Erklärung</td> </tr> </tbody> </table> <h3 id=verfugbare-umgebungsvariablen>Verfügbare Umgebungsvariablen<a class=headerlink href=#verfugbare-umgebungsvariablen title="Permanent link">&para;</a></h3> <p>Jedes Skript wird mit folgenden Umgebungsvariablen aufgerufen:</p> <table> <thead> <tr> <th>Variable</th> <th>Inhalt</th> <th>Beispiel</th> </tr> </thead> <tbody> <tr> <td><code>RIPSTER_OUTPUT_PATH</code></td> <td>Absoluter Pfad der encodierten Datei</td> <td><code>/mnt/movies/Inception (2010).mkv</code></td> </tr> <tr> <td><code>RIPSTER_JOB_ID</code></td> <td>Job-ID in der Datenbank</td> <td><code>42</code></td> </tr> <tr> <td><code>RIPSTER_TITLE</code></td> <td>Filmtitel</td> <td><code>Inception</code></td> </tr> <tr> <td><code>RIPSTER_YEAR</code></td> <td>Erscheinungsjahr</td> <td><code>2010</code></td> </tr> <tr> <td><code>RIPSTER_IMDB_ID</code></td> <td>IMDb-ID</td> <td><code>tt1375666</code></td> </tr> <tr> <td><code>RIPSTER_RAW_PATH</code></td> <td>Pfad zur Raw-MKV-Datei</td> <td><code>/mnt/raw/Inception-2010/t00.mkv</code></td> </tr> </tbody> </table> <h3 id=beispiel-skript-datei-nach-jellyfin-verschieben>Beispiel-Skript: Datei nach Jellyfin verschieben<a class=headerlink href=#beispiel-skript-datei-nach-jellyfin-verschieben title="Permanent link">&para;</a></h3> <div class="language-bash highlight"><pre><span></span><code><span id=__span-1-1><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=ch>#!/bin/bash</span>
</span><span id=__span-1-2><a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a><span class=c1># /home/michael/scripts/move-to-jellyfin.sh</span>
</span><span id=__span-1-3><a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a>
</span><span id=__span-1-4><a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a><span class=nv>TARGET_DIR</span><span class=o>=</span><span class=s2>&quot;/mnt/media/movies&quot;</span>
</span><span id=__span-1-5><a id=__codelineno-1-5 name=__codelineno-1-5 href=#__codelineno-1-5></a>mkdir<span class=w> </span>-p<span class=w> </span><span class=s2>&quot;</span><span class=nv>$TARGET_DIR</span><span class=s2>&quot;</span>
</span><span id=__span-1-6><a id=__codelineno-1-6 name=__codelineno-1-6 href=#__codelineno-1-6></a>mv<span class=w> </span><span class=s2>&quot;</span><span class=nv>$RIPSTER_OUTPUT_PATH</span><span class=s2>&quot;</span><span class=w> </span><span class=s2>&quot;</span><span class=nv>$TARGET_DIR</span><span class=s2>/&quot;</span>
</span><span id=__span-1-7><a id=__codelineno-1-7 name=__codelineno-1-7 href=#__codelineno-1-7></a><span class=nb>echo</span><span class=w> </span><span class=s2>&quot;Verschoben: </span><span class=nv>$RIPSTER_TITLE</span><span class=s2> nach </span><span class=nv>$TARGET_DIR</span><span class=s2>&quot;</span>
</span></code></pre></div> <h3 id=beispiel-skript-webhook-auslosen>Beispiel-Skript: Webhook auslösen<a class=headerlink href=#beispiel-skript-webhook-auslosen title="Permanent link">&para;</a></h3> <div class="language-bash 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=ch>#!/bin/bash</span>
</span><span id=__span-2-2><a id=__codelineno-2-2 name=__codelineno-2-2 href=#__codelineno-2-2></a><span class=c1># /home/michael/scripts/notify-webhook.sh</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>curl<span class=w> </span>-s<span class=w> </span>-X<span class=w> </span>POST<span class=w> </span>https://mein-webhook.example.com/ripster<span class=w> </span><span class=se>\</span>
</span><span id=__span-2-5><a id=__codelineno-2-5 name=__codelineno-2-5 href=#__codelineno-2-5></a><span class=w> </span>-H<span class=w> </span><span class=s2>&quot;Content-Type: application/json&quot;</span><span class=w> </span><span class=se>\</span>
</span><span id=__span-2-6><a id=__codelineno-2-6 name=__codelineno-2-6 href=#__codelineno-2-6></a><span class=w> </span>-d<span class=w> </span><span class=s2>&quot;{\&quot;title\&quot;: \&quot;</span><span class=nv>$RIPSTER_TITLE</span><span class=s2>\&quot;, \&quot;year\&quot;: \&quot;</span><span class=nv>$RIPSTER_YEAR</span><span class=s2>\&quot;, \&quot;path\&quot;: \&quot;</span><span class=nv>$RIPSTER_OUTPUT_PATH</span><span class=s2>\&quot;}&quot;</span>
</span></code></pre></div> <hr> <h2 id=skript-im-encode-review-auswahlen>Skript im Encode-Review auswählen<a class=headerlink href=#skript-im-encode-review-auswahlen title="Permanent link">&para;</a></h2> <p>Im <code>READY_TO_ENCODE</code>-Zustand zeigt das <strong>MediaInfoReviewPanel</strong> einen Skript-Abschnitt:</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>┌──────────────────────────────────────────────────────────┐
</span><span id=__span-3-2><a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a>│ Post-Encode-Skripte │
</span><span id=__span-3-3><a id=__codelineno-3-3 name=__codelineno-3-3 href=#__codelineno-3-3></a>├──────────────────────────────────────────────────────────┤
</span><span id=__span-3-4><a id=__codelineno-3-4 name=__codelineno-3-4 href=#__codelineno-3-4></a>│ Ausgewählte Skripte (Reihenfolge per Drag &amp; Drop): │
</span><span id=__span-3-5><a id=__codelineno-3-5 name=__codelineno-3-5 href=#__codelineno-3-5></a>│ ≡ 1. Zu Plex verschieben [Entfernen]│
</span><span id=__span-3-6><a id=__codelineno-3-6 name=__codelineno-3-6 href=#__codelineno-3-6></a>│ ≡ 2. Webhook auslösen [Entfernen]│
</span><span id=__span-3-7><a id=__codelineno-3-7 name=__codelineno-3-7 href=#__codelineno-3-7></a>├──────────────────────────────────────────────────────────┤
</span><span id=__span-3-8><a id=__codelineno-3-8 name=__codelineno-3-8 href=#__codelineno-3-8></a>│ Skript hinzufügen: [Zu Jellyfin verschieben ▾] [+ Hinzuf.]│
</span><span id=__span-3-9><a id=__codelineno-3-9 name=__codelineno-3-9 href=#__codelineno-3-9></a>└──────────────────────────────────────────────────────────┘
</span></code></pre></div> <ul> <li><strong>Reihenfolge</strong> per Drag &amp; Drop ändern</li> <li><strong>Hinzufügen</strong> aus der Dropdown-Liste aller konfigurierten Skripte</li> <li><strong>Entfernen</strong> einzelner Skripte aus der aktuellen Auswahl</li> <li>Skripte können pro Job unterschiedlich gewählt werden</li> </ul> <hr> <h2 id=skript-testen>Skript testen<a class=headerlink href=#skript-testen title="Permanent link">&para;</a></h2> <p>Über die Einstellungen kann jedes Skript mit einem Test-Job ausgeführt werden:</p> <div class="language-http highlight"><pre><span></span><code><span id=__span-4-1><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a><span class=err>POST /api/settings/scripts/:scriptId/test</span>
</span></code></pre></div> <p>Der Test-Aufruf befüllt die Umgebungsvariablen mit Platzhalter-Werten.</p> <hr> <h2 id=ausfuhrungs-ergebnis>Ausführungs-Ergebnis<a class=headerlink href=#ausfuhrungs-ergebnis title="Permanent link">&para;</a></h2> <p>Das Ergebnis der Skript-Ausführung wird im Job-Datensatz gespeichert und in der History angezeigt:</p> <div class="language-json highlight"><pre><span></span><code><span id=__span-5-1><a id=__codelineno-5-1 name=__codelineno-5-1 href=#__codelineno-5-1></a><span class=p>{</span>
</span><span id=__span-5-2><a id=__codelineno-5-2 name=__codelineno-5-2 href=#__codelineno-5-2></a><span class=w> </span><span class=nt>&quot;postEncodeScripts&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
</span><span id=__span-5-3><a id=__codelineno-5-3 name=__codelineno-5-3 href=#__codelineno-5-3></a><span class=w> </span><span class=nt>&quot;configured&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>2</span><span class=p>,</span>
</span><span id=__span-5-4><a id=__codelineno-5-4 name=__codelineno-5-4 href=#__codelineno-5-4></a><span class=w> </span><span class=nt>&quot;attempted&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>2</span><span class=p>,</span>
</span><span id=__span-5-5><a id=__codelineno-5-5 name=__codelineno-5-5 href=#__codelineno-5-5></a><span class=w> </span><span class=nt>&quot;succeeded&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>2</span><span class=p>,</span>
</span><span id=__span-5-6><a id=__codelineno-5-6 name=__codelineno-5-6 href=#__codelineno-5-6></a><span class=w> </span><span class=nt>&quot;failed&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>0</span><span class=p>,</span>
</span><span id=__span-5-7><a id=__codelineno-5-7 name=__codelineno-5-7 href=#__codelineno-5-7></a><span class=w> </span><span class=nt>&quot;skipped&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>0</span><span class=p>,</span>
</span><span id=__span-5-8><a id=__codelineno-5-8 name=__codelineno-5-8 href=#__codelineno-5-8></a><span class=w> </span><span class=nt>&quot;aborted&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>false</span><span class=p>,</span>
</span><span id=__span-5-9><a id=__codelineno-5-9 name=__codelineno-5-9 href=#__codelineno-5-9></a><span class=w> </span><span class=nt>&quot;results&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span>
</span><span id=__span-5-10><a id=__codelineno-5-10 name=__codelineno-5-10 href=#__codelineno-5-10></a><span class=w> </span><span class=p>{</span>
</span><span id=__span-5-11><a id=__codelineno-5-11 name=__codelineno-5-11 href=#__codelineno-5-11></a><span class=w> </span><span class=nt>&quot;scriptId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>1</span><span class=p>,</span>
</span><span id=__span-5-12><a id=__codelineno-5-12 name=__codelineno-5-12 href=#__codelineno-5-12></a><span class=w> </span><span class=nt>&quot;scriptName&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Zu Plex verschieben&quot;</span><span class=p>,</span>
</span><span id=__span-5-13><a id=__codelineno-5-13 name=__codelineno-5-13 href=#__codelineno-5-13></a><span class=w> </span><span class=nt>&quot;status&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;SUCCESS&quot;</span>
</span><span id=__span-5-14><a id=__codelineno-5-14 name=__codelineno-5-14 href=#__codelineno-5-14></a><span class=w> </span><span class=p>},</span>
</span><span id=__span-5-15><a id=__codelineno-5-15 name=__codelineno-5-15 href=#__codelineno-5-15></a><span class=w> </span><span class=p>{</span>
</span><span id=__span-5-16><a id=__codelineno-5-16 name=__codelineno-5-16 href=#__codelineno-5-16></a><span class=w> </span><span class=nt>&quot;scriptId&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>2</span><span class=p>,</span>
</span><span id=__span-5-17><a id=__codelineno-5-17 name=__codelineno-5-17 href=#__codelineno-5-17></a><span class=w> </span><span class=nt>&quot;scriptName&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;Webhook auslösen&quot;</span><span class=p>,</span>
</span><span id=__span-5-18><a id=__codelineno-5-18 name=__codelineno-5-18 href=#__codelineno-5-18></a><span class=w> </span><span class=nt>&quot;status&quot;</span><span class=p>:</span><span class=w> </span><span class=s2>&quot;SUCCESS&quot;</span>
</span><span id=__span-5-19><a id=__codelineno-5-19 name=__codelineno-5-19 href=#__codelineno-5-19></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-5-20><a id=__codelineno-5-20 name=__codelineno-5-20 href=#__codelineno-5-20></a><span class=w> </span><span class=p>]</span>
</span><span id=__span-5-21><a id=__codelineno-5-21 name=__codelineno-5-21 href=#__codelineno-5-21></a><span class=w> </span><span class=p>}</span>
</span><span id=__span-5-22><a id=__codelineno-5-22 name=__codelineno-5-22 href=#__codelineno-5-22></a><span class=p>}</span>
</span></code></pre></div> <table> <thead> <tr> <th>Feld</th> <th>Beschreibung</th> </tr> </thead> <tbody> <tr> <td><code>configured</code></td> <td>Anzahl ausgewählter Skripte</td> </tr> <tr> <td><code>attempted</code></td> <td>Anzahl tatsächlich gestarteter Skripte</td> </tr> <tr> <td><code>succeeded</code></td> <td>Erfolgreich ausgeführt (Exit-Code 0)</td> </tr> <tr> <td><code>failed</code></td> <td>Fehlgeschlagen</td> </tr> <tr> <td><code>skipped</code></td> <td>Nicht ausgeführt (wegen vorherigem Fehler)</td> </tr> <tr> <td><code>aborted</code></td> <td><code>true</code>, wenn die Kette abgebrochen wurde</td> </tr> </tbody> </table> <hr> <h2 id=api-referenz>API-Referenz<a class=headerlink href=#api-referenz title="Permanent link">&para;</a></h2> <p>Eine vollständige API-Dokumentation der Skript-Endpunkte findest du unter:</p> <p><a href=../../api/settings/#skript-verwaltung><span class=twemoji><svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13.22 19.03a.75.75 0 0 1 0-1.06L18.19 13H3.75a.75.75 0 0 1 0-1.5h14.44l-4.97-4.97a.749.749 0 0 1 .326-1.275.75.75 0 0 1 .734.215l6.25 6.25a.75.75 0 0 1 0 1.06l-6.25 6.25a.75.75 0 0 1-1.06 0"/></svg></span> Settings API – Skripte</a></p> </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> Zurück zum Seitenanfang </button> </main> <footer class=md-footer> <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 class=md-social> <a href=https://github.com/YOUR_GITHUB_USERNAME/ripster target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </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": ["navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.expand", "navigation.indexes", "navigation.top", "search.highlight", "search.suggest", "content.code.copy", "content.code.annotate", "content.tabs.link", "toc.integrate"], "search": "../../assets/javascripts/workers/search.7a47a382.min.js", "tags": null, "translations": {"clipboard.copied": "In Zwischenablage kopiert", "clipboard.copy": "In Zwischenablage kopieren", "search.result.more.one": "1 weiteres Suchergebnis auf dieser Seite", "search.result.more.other": "# weitere Suchergebnisse auf dieser Seite", "search.result.none": "Keine Suchergebnisse", "search.result.one": "1 Suchergebnis", "search.result.other": "# Suchergebnisse", "search.result.placeholder": "Suchbegriff eingebeLine truncated
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/post-encode-scripts/ rel=canonical><link href=../playlist-analysis/ rel=prev><link href=../../api/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Encode-Skripte (Pre & Post) - Ripster</title><link rel=stylesheet href=../../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#encode-skripte-pre-post class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=../.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Encode-Skripte (Pre & Post) </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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 Line truncated
</span><span id=__span-0-2><a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> -&gt; Pre-Encode Skripte/Ketten
</span><span id=__span-0-3><a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> -&gt; HandBrake Encoding
</span><span id=__span-0-4><a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> -&gt; Post-Encode Skripte/Ketten
</span><span id=__span-0-5><a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> -&gt; FINISHED oder ERROR
</span></code></pre></div> <hr> <h2 id=auswahl-im-review>Auswahl im Review<a class=headerlink href=#auswahl-im-review title="Permanent link">&para;</a></h2> <p>Im Review-Panel kannst du getrennt wählen:</p> <ul> <li><code>selectedPreEncodeScriptIds</code></li> <li><code>selectedPostEncodeScriptIds</code></li> <li><code>selectedPreEncodeChainIds</code></li> <li><code>selectedPostEncodeChainIds</code></li> </ul> <hr> <h2 id=fehlerverhalten>Fehlerverhalten<a class=headerlink href=#fehlerverhalten title="Permanent link">&para;</a></h2> <ul> <li>Pre-Encode-Fehler stoppen die Kette und führen zu <code>ERROR</code>.</li> <li>Post-Encode-Fehler stoppen die restlichen Post-Schritte; Job kann dennoch <code>FINISHED</code> sein (mit Fehlerzusatz im Status/Log).</li> </ul> <hr> <h2 id=verfugbare-umgebungsvariablen>Verfügbare Umgebungsvariablen<a class=headerlink href=#verfugbare-umgebungsvariablen title="Permanent link">&para;</a></h2> <p>Beim Script-Run werden gesetzt:</p> <ul> <li><code>RIPSTER_SCRIPT_RUN_AT</code></li> <li><code>RIPSTER_JOB_ID</code></li> <li><code>RIPSTER_JOB_TITLE</code></li> <li><code>RIPSTER_MODE</code></li> <li><code>RIPSTER_INPUT_PATH</code></li> <li><code>RIPSTER_OUTPUT_PATH</code></li> <li><code>RIPSTER_RAW_PATH</code></li> <li><code>RIPSTER_SCRIPT_ID</code></li> <li><code>RIPSTER_SCRIPT_NAME</code></li> <li><code>RIPSTER_SCRIPT_SOURCE</code></li> </ul> <hr> <h2 id=skript-ketten>Skript-Ketten<a class=headerlink href=#skript-ketten title="Permanent link">&para;</a></h2> <p>Ketten unterstützen zwei Step-Typen:</p> <ul> <li><code>script</code> (führt ein hinterlegtes Skript aus)</li> <li><code>wait</code> (wartet <code>waitSeconds</code>)</li> </ul> <p>Bei Fehler in einem Script-Step wird die Kette abgebrochen.</p> <hr> <h2 id=testlaufe>Testläufe<a class=headerlink href=#testlaufe title="Permanent link">&para;</a></h2> <ul> <li>Skript testen: <code>POST /api/settings/scripts/:id/test</code></li> <li>Kette testen: <code>POST /api/settings/script-chains/:id/test</code></li> </ul> <p>Ergebnisse enthalten Erfolg/Exit-Code, Laufzeit und stdout/stderr.</p> </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> Zurück zum Seitenanfang </button> </main> <footer class=md-footer> <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 class=md-social> <a href=https://github.com/YOUR_GITHUB_USERNAME/ripster target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-Line truncated
+15 -61
View File
@@ -1,61 +1,15 @@
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/workflow/ rel=canonical><link href=../ rel=prev><link href=../encoding/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Workflow & Zustände - Ripster</title><link rel=stylesheet href=../../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#workflow-zustande class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=../.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Workflow & Zustände </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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 0Line truncated
START(( )) --&gt; IDLE
IDLE --&gt;|Disc erkannt| DD[DISC_DETECTED]
DD --&gt;|Analyse starten| META[METADATA\nSELECTION]
META --&gt;|Metadaten übernommen| RTS[READY_TO\nSTART]
META --&gt;|vorhandenes RAW +\nPlaylist offen| WUD[WAITING_FOR\nUSER_DECISION]
RTS --&gt;|Auto-Start| RIP[RIPPING]
RTS --&gt;|Auto-Start mit RAW| MIC[MEDIAINFO\nCHECK]
RIP --&gt;|MKV fertig| MIC
RIP --&gt;|Fehler| ERR
RIP --&gt;|Abbruch| CAN([CANCELLED])
MIC --&gt;|Playlist offen (Backup)| WUD
WUD --&gt;|Playlist bestätigt| MIC
WUD --&gt;|Playlist bestätigt,\nnoch kein RAW| RTS
MIC --&gt; RTE[READY_TO\nENCODE]
RTE --&gt;|Encoding starten\n(bestätigt bei Bedarf automatisch)| ENC[ENCODING]
ENC --&gt;|inkl. Post-Skripte| FIN([FINISHED])
ENC --&gt;|Fehler| ERR
ENC --&gt;|Abbruch| CAN
ERR([ERROR]) --&gt;|Retry / Cancel| IDLE
CAN --&gt;|Retry / Neu-Analyse| IDLE
FIN --&gt;|Neue Disc| IDLE
style FIN fill:#e8f5e9,stroke:#66bb6a,color:#2e7d32
style ERR fill:#ffebee,stroke:#ef5350,color:#c62828
style CAN fill:#fff3e0,stroke:#fb8c00,color:#e65100
style WUD fill:#fff8e1,stroke:#ffa726,color:#e65100
style ENC fill:#f3e5f5,stroke:#ab47bc,color:#6a1b9a
style RIP fill:#e3f2fd,stroke:#42a5f5,color:#1565c0
style MIC fill:#e3f2fd,stroke:#42a5f5,color:#1565c0</code></pre> </div> <hr> <h2 id=ui-badge-bezeichnungen>UI-Badge-Bezeichnungen<a class=headerlink href=#ui-badge-bezeichnungen title="Permanent link">&para;</a></h2> <p>Die Status-Badges im Dashboard verwenden diese Labels:</p> <table> <thead> <tr> <th>State</th> <th>Badge-Label</th> </tr> </thead> <tbody> <tr> <td><code>IDLE</code></td> <td><code>Bereit</code></td> </tr> <tr> <td><code>DISC_DETECTED</code></td> <td><code>Medium erkannt</code></td> </tr> <tr> <td><code>METADATA_SELECTION</code></td> <td><code>Metadatenauswahl</code></td> </tr> <tr> <td><code>WAITING_FOR_USER_DECISION</code></td> <td><code>Warte auf Auswahl</code></td> </tr> <tr> <td><code>READY_TO_START</code></td> <td><code>Startbereit</code></td> </tr> <tr> <td><code>RIPPING</code></td> <td><code>Rippen</code></td> </tr> <tr> <td><code>MEDIAINFO_CHECK</code></td> <td><code>Mediainfo-Pruefung</code></td> </tr> <tr> <td><code>READY_TO_ENCODE</code></td> <td><code>Bereit zum Encodieren</code></td> </tr> <tr> <td><code>ENCODING</code></td> <td><code>Encodieren</code></td> </tr> <tr> <td><code>FINISHED</code></td> <td><code>Fertig</code></td> </tr> <tr> <td><code>CANCELLED</code></td> <td><code>Abgebrochen</code></td> </tr> <tr> <td><code>ERROR</code></td> <td><code>Fehler</code></td> </tr> <tr> <td>Queue (kein eigener State)</td> <td><code>In der Queue</code></td> </tr> </tbody> </table> <hr> <h2 id=zustandsbeschreibungen>Zustandsbeschreibungen<a class=headerlink href=#zustandsbeschreibungen title="Permanent link">&para;</a></h2> <h3 id=idle>IDLE<a class=headerlink href=#idle title="Permanent link">&para;</a></h3> <p><strong>Ausgangszustand.</strong> Ripster wartet auf eine Disc.</p> <ul> <li><code>diskDetectionService</code> pollt das Laufwerk im konfigurierten Intervall</li> <li>Bei Disc-Erkennung: automatischer Übergang zu <code>DISC_DETECTED</code></li> <li>WebSocket-Event: <code>DISC_DETECTED</code></li> </ul> <hr> <h3 id=disc_detected>DISC_DETECTED<a class=headerlink href=#disc_detected title="Permanent link">&para;</a></h3> <p><strong>Disc erkannt, wartet auf Benutzeraktion.</strong></p> <ul> <li>Dashboard-Badge: <strong>"Medium erkannt"</strong></li> <li>Status-Text: <strong>"Neue Disk erkannt"</strong></li> <li><strong>"Analyse starten"</strong>-Button wird aktiv</li> <li>Kein Prozess läuft noch</li> </ul> <p><strong>Übergang:</strong> Benutzer klickt "Analyse starten" → <code>METADATA_SELECTION</code></p> <hr> <h3 id=metadata_selection>METADATA_SELECTION<a class=headerlink href=#metadata_selection title="Permanent link">&para;</a></h3> <p><strong>Metadaten-Auswahl läuft.</strong></p> <ol> <li>Job wird erstellt (<code>status = METADATA_SELECTION</code>)</li> <li>OMDb-Vorsuche mit erkanntem Disc-Label</li> <li><code>MetadataSelectionDialog</code> öffnet sich mit vorgeladenen Ergebnissen</li> <li>Benutzer wählt Filmtitel (oder gibt manuell ein)</li> <li>Nach Bestätigung wird der Job automatisch für Start/Queue vorbereitet (<code>selectMetadata</code> + <code>startPreparedJob</code>)</li> </ol> <p><strong>Übergang (automatisch nach Metadaten-Bestätigung):</strong></p> <table> <thead> <tr> <th>Ergebnis</th> <th>Nächster Zustand</th> </tr> </thead> <tbody> <tr> <td>Kein verwertbares RAW vorhanden</td> <td><code>READY_TO_START</code> → automatisch <code>RIPPING</code> (oder Queue)</td> </tr> <tr> <td>Verwertbares RAW vorhanden</td> <td><code>READY_TO_START</code> → automatisch <code>MEDIAINFO_CHECK</code> (oder Queue)</td> </tr> <tr> <td>Vorhandenes RAW + offene Playlist-Entscheidung</td> <td><code>WAITING_FOR_USER_DECISION</code></td> </tr> </tbody> </table> <hr> <h3 id=waiting_for_user_decision>WAITING_FOR_USER_DECISION<a class=headerlink href=#waiting_for_user_decision title="Permanent link">&para;</a></h3> <p><strong>Playlist-Obfuskierung erkannt – manuelle Auswahl erforderlich.</strong></p> <div class="admonition info"> <p class=admonition-title>Neu seit „Skript Integration + UI Anpassungen"</p> <p>Dieser Zustand wurde eingeführt, um Blu-rays mit mehreren Playlists ähnlicher Länge korrekt zu behandeln.</p> </div> <ul> <li>Playlist-Auswahl-Dialog wird im Dashboard angezeigt</li> <li>Alle Kandidaten mit Score, Laufzeit und Bewertungslabel</li> <li>Empfohlene Playlist ist vorausgewählt</li> <li>Benutzer bestätigt mit <strong>"Playlist übernehmen"</strong></li> <li>Tritt häufig nach <code>MEDIAINFO_CHECK</code> auf (Backup-Analyse), seltener direkt nach <code>METADATA_SELECTION</code> bei vorhandenem RAW</li> </ul> <p><strong>Darstellung im Dashboard:</strong></p> <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>┌──────────────────────────────────────────────────────────┐
</span><span id=__span-0-2><a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a>│ Playlist-Auswahl erforderlich │
</span><span id=__span-0-3><a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a>│ Es wurden mehrere Titel mit ähnlicher Laufzeit gefunden. │
</span><span id=__span-0-4><a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a>├──────────┬──────────┬────────┬──────────────────────────┤
</span><span id=__span-0-5><a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a>│ Playlist │ Laufzeit │ Score │ Bewertung │
</span><span id=__span-0-6><a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a>├──────────┼──────────┼────────┼──────────────────────────┤
</span><span id=__span-0-7><a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a>│ ● 00800 │ 2:28:05 │ +18 │ wahrscheinlich korrekt │
</span><span id=__span-0-8><a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a>│ ○ 00801 │ 2:28:12 │ −4 │ Auffällige Segmentfolge │
</span><span id=__span-0-9><a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a>│ ○ 00900 │ 2:28:05 │ −32 │ Fake-Struktur │
</span><span id=__span-0-10><a id=__codelineno-0-10 name=__codelineno-0-10 href=#__codelineno-0-10></a>└──────────┴──────────┴────────┴──────────────────────────┘
</span><span id=__span-0-11><a id=__codelineno-0-11 name=__codelineno-0-11 href=#__codelineno-0-11></a> [Playlist übernehmen]
</span></code></pre></div> <p><strong>Übergang:</strong> <code>selectMetadata(jobId, { selectedPlaylist })</code> setzt die Pipeline automatisch fort:</p> <ul> <li>mit vorhandenem RAW nach <code>MEDIAINFO_CHECK</code></li> <li>ohne RAW über <code>READY_TO_START</code> weiter Richtung <code>RIPPING</code></li> </ul> <p>Mehr Details: <a href=../playlist-analysis/ >Playlist-Analyse</a></p> <hr> <h3 id=ready_to_start>READY_TO_START<a class=headerlink href=#ready_to_start title="Permanent link">&para;</a></h3> <p><strong>Übergangs-/Fallback-Zustand vor dem eigentlichen Start.</strong></p> <ul> <li>Wird nach Metadaten-Bestätigung kurz gesetzt</li> <li><code>startPreparedJob()</code> wird danach automatisch ausgeführt</li> <li>Wenn Parallel-Limit erreicht ist, wird der Start stattdessen in die Queue eingereiht</li> <li><strong>"Job starten"</strong> ist primär für Sonderfälle/Fallback sichtbar</li> </ul> <p><strong>Sonderfall – RAW-Datei bereits vorhanden:</strong> Wenn für diesen Job bereits ein verwertbares RAW unter <code>raw_dir</code> existiert, wird Ripping übersprungen und direkt <code>MEDIAINFO_CHECK</code> gestartet.</p> <p><strong>Übergang:</strong> <code>startPreparedJob(jobId)</code> → <code>RIPPING</code> oder direkt <code>MEDIAINFO_CHECK</code></p> <hr> <h3 id=ripping>RIPPING<a class=headerlink href=#ripping title="Permanent link">&para;</a></h3> <p><strong>MakeMKV rippt die Disc.</strong></p> <div class="tabbed-set tabbed-alternate" data-tabs=1:2><input checked=checked id=__tabbed_1_1 name=__tabbed_1 type=radio><input id=__tabbed_1_2 name=__tabbed_1 type=radio><div class=tabbed-labels><label for=__tabbed_1_1>MKV-Modus (Standard)</label><label for=__tabbed_1_2>Backup-Modus</label></div> <div class=tabbed-content> <div class=tabbed-block> <div class="language-bash highlight"><pre><span></span><code><span id=__span-1-1><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a>makemkvcon<span class=w> </span>mkv<span class=w> </span>disc:0<span class=w> </span>all<span class=w> </span>/path/to/raw/<span class=w> </span>--minlength<span class=o>=</span><span class=m>900</span><span class=w> </span>-r
</span></code></pre></div> <p>Erstellt MKV-Datei(en) direkt aus den gewählten Titeln.</p> </div> <div class=tabbed-block> <div class="language-bash highlight"><pre><span></span><code><span id=__span-2-1><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a>makemkvcon<span class=w> </span>backup<span class=w> </span>disc:0<span class=w> </span>/path/to/raw/backup/<span class=w> </span>--decrypt<span class=w> </span>-r
</span></code></pre></div> <p>Erstellt vollständiges Disc-Backup inkl. Menüs.</p> </div> </div> </div> <p><strong>Live-Updates</strong> aus MakeMKV-Ausgabe:</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>PRGV:2048,0,65536 → Fortschritt-Berechnung
</span><span id=__span-3-2><a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a>PRGT:5011,0,&quot;...&quot; → Aktueller Task-Name
</span></code></pre></div> <p><strong>Typische Dauer:</strong> DVD 20–45 min · Blu-ray 45–120 min</p> <hr> <h3 id=mediainfo_check>MEDIAINFO_CHECK<a class=headerlink href=#mediainfo_check title="Permanent link">&para;</a></h3> <p><strong>HandBrake-Scan und Encode-Plan-Erstellung.</strong></p> <p>Dieser Zustand umfasst je nach Quelle mehrere Phasen:</p> <ol> <li>Optional: Playlist-Auflösung bei Blu-ray-Backup (inkl. MakeMKV/HandBrake-Zuordnung)</li> <li><strong>HandBrake-Scan</strong> (<code>HandBrakeCLI --scan</code>) auf RAW-Input</li> <li><strong>Encode-Plan-Erstellung</strong> mit automatischer Track-Vorauswahl</li> </ol> <p>Kein Benutzereingriff – läuft automatisch durch.</p> <p><strong>Übergänge:</strong></p> <ul> <li>Eindeutige Quelle/Titelwahl möglich → <code>READY_TO_ENCODE</code></li> <li>Mehrdeutige Playlist erkannt → <code>WAITING_FOR_USER_DECISION</code></li> </ul> <hr> <h3 id=ready_to_encode>READY_TO_ENCODE<a class=headerlink href=#ready_to_encode title="Permanent link">&para;</a></h3> <p><strong>Encode-Plan bereit.</strong></p> <p>Das <code>MediaInfoReviewPanel</code> zeigt:</p> <ul> <li><strong>Titel-Auswahl</strong> (bei Discs mit mehreren langen Titeln)</li> <li><strong>Audio-Tracks</strong> mit Encoder-Vorschau (Copy/Transcode/Fallback)</li> <li><strong>Untertitel-Tracks</strong> mit Flags (Einbrennen, Forced, Default)</li> <li><strong>Post-Encode-Skripte</strong> – Auswahl und Reihenfolge der auszuführenden Skripte</li> </ul> <p>Im Frontend startet <strong>"Encoding starten"</strong> (bzw. <strong>"Backup + Encoding starten"</strong> im Pre-Rip-Modus) den nächsten Schritt. Falls die Review noch nicht bestätigt wurde, wird <code>confirmEncodeReview(...)</code> automatisch vor dem Start aufgerufen.</p> <p><strong>Übergang:</strong> <code>startPreparedJob(jobId)</code> → <code>ENCODING</code> (oder im Pre-Rip-Fall zuerst <code>RIPPING</code>)</p> <hr> <h3 id=encoding>ENCODING<a class=headerlink href=#encoding title="Permanent link">&para;</a></h3> <p><strong>HandBrake encodiert die Datei.</strong></p> <div class="language-bash highlight"><pre><span></span><code><span id=__span-4-1><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a>HandBrakeCLI<span class=w> </span><span class=se>\</span>
</span><span id=__span-4-2><a id=__codelineno-4-2 name=__codelineno-4-2 href=#__codelineno-4-2></a><span class=w> </span>-i<span class=w> </span>&lt;quelle&gt;<span class=w> </span>-o<span class=w> </span>&lt;ziel&gt;<span class=w> </span><span class=se>\</span>
</span><span id=__span-4-3><a id=__codelineno-4-3 name=__codelineno-4-3 href=#__codelineno-4-3></a><span class=w> </span>-t<span class=w> </span>&lt;titelId&gt;<span class=w> </span><span class=se>\</span>
</span><span id=__span-4-4><a id=__codelineno-4-4 name=__codelineno-4-4 href=#__codelineno-4-4></a><span class=w> </span>--preset<span class=w> </span><span class=s2>&quot;H.265 MKV 1080p30&quot;</span><span class=w> </span><span class=se>\</span>
</span><span id=__span-4-5><a id=__codelineno-4-5 name=__codelineno-4-5 href=#__codelineno-4-5></a><span class=w> </span>-a<span class=w> </span><span class=m>1</span>,2<span class=w> </span>-E<span class=w> </span>copy:ac3,av_aac<span class=w> </span><span class=se>\</span>
</span><span id=__span-4-6><a id=__codelineno-4-6 name=__codelineno-4-6 href=#__codelineno-4-6></a><span class=w> </span>-s<span class=w> </span><span class=m>1</span><span class=w> </span>--subtitle-default<span class=w> </span><span class=m>1</span>
</span></code></pre></div> <p><strong>Live-Updates</strong> aus HandBrake-stderr:</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>Encoding: task 1 of 1, 73.50 % (45.23 fps, avg 44.12 fps, ETA 00h12m34s)
</span></code></pre></div> <p>Post-Encode-Skripte werden innerhalb dieses Zustands sequenziell ausgeführt (kein separater Pipeline-State).</p> <div class="admonition note"> <p class=admonition-title>Skriptfehler</p> <p>Skriptfehler führen zum Abbruch der Skriptkette, der Job bleibt jedoch im Abschlusszustand <code>FINISHED</code> mit entsprechendem Hinweis im Status-Text/Log.</p> </div> <hr> <h3 id=finished>FINISHED<a class=headerlink href=#finished title="Permanent link">&para;</a></h3> <p><strong>Job erfolgreich abgeschlossen.</strong></p> <ul> <li>Ausgabedatei liegt im konfigurierten <code>movie_dir</code></li> <li>Job-Status in Datenbank: <code>FINISHED</code></li> <li>PushOver-Benachrichtigung (falls konfiguriert)</li> <li>WebSocket-Event: <code>PIPELINE_STATE_CHANGED</code> (State <code>FINISHED</code>)</li> </ul> <hr> <h3 id=cancelled>CANCELLED<a class=headerlink href=#cancelled title="Permanent link">&para;</a></h3> <p><strong>Job wurde vom Benutzer abgebrochen.</strong></p> <ul> <li>Entsteht bei aktivem Abbruch (<code>/api/pipeline/cancel</code>) während laufender Phase</li> <li>Job-Status in Datenbank: <code>CANCELLED</code></li> <li>Im Dashboard stehen danach u. a. <code>Retry Rippen</code>, <code>Review neu starten</code> oder <code>Encode neu starten</code> (kontextabhängig) zur Verfügung</li> </ul> <hr> <h3 id=error>ERROR<a class=headerlink href=#error title="Permanent link">&para;</a></h3> <p><strong>Fehler aufgetreten.</strong></p> <ul> <li>Fehlerdetails im Job-Datensatz gespeichert</li> <li>Fehler-Logs in History abrufbar</li> <li><strong>Retry</strong>: Neustart vom Fehlerzustand</li> <li><strong>Neu analysieren</strong>: Disc erneut als neuer Job starten</li> </ul> <hr> <h2 id=abbrechen-retry>Abbrechen &amp; Retry<a class=headerlink href=#abbrechen-retry title="Permanent link">&para;</a></h2> <h3 id=pipeline-abbrechen>Pipeline abbrechen<a class=headerlink href=#pipeline-abbrechen title="Permanent link">&para;</a></h3> <div class="language-http highlight"><pre><span></span><code><span id=__span-6-1><a id=__codelineno-6-1 name=__codelineno-6-1 href=#__codelineno-6-1></a><span class=err>POST /api/pipeline/cancel</span>
</span></code></pre></div> <ul> <li>SIGINT → graceful exit (Timeout: 10 s) → SIGKILL</li> <li>Laufender Job landet in <code>CANCELLED</code> (oder Queue-Eintrag wird entfernt, falls noch nicht gestartet)</li> </ul> <h3 id=job-wiederholen>Job wiederholen<a class=headerlink href=#job-wiederholen title="Permanent link">&para;</a></h3> <div class="language-http highlight"><pre><span></span><code><span id=__span-7-1><a id=__codelineno-7-1 name=__codelineno-7-1 href=#__codelineno-7-1></a><span class=err>POST /api/pipeline/retry/:jobId</span>
</span></code></pre></div> <ul> <li>Startet den Job neu in <code>RIPPING</code> (oder reiht den Retry in die Queue ein)</li> <li>Metadaten bleiben erhalten; Encode-/Scan-Daten werden neu erzeugt</li> </ul> <h3 id=re-encode>Re-Encode<a class=headerlink href=#re-encode title="Permanent link">&para;</a></h3> <div class="language-http highlight"><pre><span></span><code><span id=__span-8-1><a id=__codelineno-8-1 name=__codelineno-8-1 href=#__codelineno-8-1></a><span class=err>POST /api/pipeline/reencode/:jobId</span>
</span></code></pre></div> <ul> <li>Encodiert bestehende Raw-MKV neu</li> <li>Ermöglicht neue Track-Auswahl und andere Skripte</li> <li>Kein Ripping erforderlich</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> Zurück zum Seitenanfang </button> </main> <footer class=md-footer> <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 class=md-social> <a href=https://github.com/YOUR_GITHUB_USERNAME/ripster target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </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": ["navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.expand", "navigation.indexes", "navigation.top", "search.highlight", "search.suggest", "content.code.copy", "content.code.annotate", "content.tabs.link", "toc.integrate"], "search": "../../assets/javascripts/workers/search.7a47a382.min.js", "tags": null, "translations": {"clipboard.copied": "In Zwischenablage kopiert", "clipboard.copy": "In Zwischenablage kopieren", "search.result.more.one": "1 weiteres Suchergebnis auf dieser Seite", "search.result.more.other": "# weitere Suchergebnisse auf dieser Seite", "search.result.none": "Keine Suchergebnisse", "search.result.one": "1 Suchergebnis", "search.result.other": "# Suchergebnisse", "search.result.placeholder": "Suchbegriff eingeben", "search.result.term.missing": "Es fehlt", "select.version": "Version ausw\u00e4hlen"}, "version": {"provider": "mike"}}</script> <script src=../../assets/javascripts/bundle.e71a0d61.min.js></script> </body> </html>
<!doctype html><html lang=de class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding"><meta name=author content=Michael><link href=https://mboehmlaender.github.io/ripster/pipeline/workflow/ rel=canonical><link href=../ rel=prev><link href=../encoding/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Workflow & Zustände - Ripster</title><link rel=stylesheet href=../../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../stylesheets/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=deep-purple data-md-color-accent=purple> <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=#workflow-zustande class=md-skip> Zum Inhalt </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Kopfzeile> <a href=../.. title=Ripster class="md-header__button md-logo" aria-label=Ripster data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 14a2 2 0 0 1-2-2c0-1.11.89-2 2-2s2 .89 2 2a2 2 0 0 1-2 2m0-10a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8"/></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> Ripster </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Workflow & Zustände </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Dunkelmodus aktivieren" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Dunkelmodus aktivieren" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=deep-purple data-md-color-accent=purple aria-label="Hellmodus aktivieren" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Hellmodus aktivieren" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></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 0Line truncated
IDLE --&gt; DISC_DETECTED
DISC_DETECTED --&gt; ANALYZING
ANALYZING --&gt; METADATA_SELECTION
METADATA_SELECTION --&gt; READY_TO_START
READY_TO_START --&gt; RIPPING
READY_TO_START --&gt; MEDIAINFO_CHECK
MEDIAINFO_CHECK --&gt; WAITING_FOR_USER_DECISION
WAITING_FOR_USER_DECISION --&gt; MEDIAINFO_CHECK
MEDIAINFO_CHECK --&gt; READY_TO_ENCODE
READY_TO_ENCODE --&gt; ENCODING
ENCODING --&gt; FINISHED
ENCODING --&gt; ERROR
RIPPING --&gt; ERROR
RIPPING --&gt; CANCELLED</code></pre> <hr> <h2 id=state-liste>State-Liste<a class=headerlink href=#state-liste title="Permanent link">&para;</a></h2> <table> <thead> <tr> <th>State</th> <th>Bedeutung</th> </tr> </thead> <tbody> <tr> <td><code>IDLE</code></td> <td>Wartet auf Disc</td> </tr> <tr> <td><code>DISC_DETECTED</code></td> <td>Disc erkannt</td> </tr> <tr> <td><code>ANALYZING</code></td> <td>MakeMKV-Analyse läuft</td> </tr> <tr> <td><code>METADATA_SELECTION</code></td> <td>Benutzer wählt Metadaten</td> </tr> <tr> <td><code>WAITING_FOR_USER_DECISION</code></td> <td>Playlist-Auswahl nötig</td> </tr> <tr> <td><code>READY_TO_START</code></td> <td>Übergangszustand vor Start</td> </tr> <tr> <td><code>RIPPING</code></td> <td>MakeMKV-Rip läuft</td> </tr> <tr> <td><code>MEDIAINFO_CHECK</code></td> <td>Quelle/Tracks werden ausgewertet</td> </tr> <tr> <td><code>READY_TO_ENCODE</code></td> <td>Review ist bereit</td> </tr> <tr> <td><code>ENCODING</code></td> <td>HandBrake läuft</td> </tr> <tr> <td><code>FINISHED</code></td> <td>erfolgreich abgeschlossen</td> </tr> <tr> <td><code>CANCELLED</code></td> <td>abgebrochen</td> </tr> <tr> <td><code>ERROR</code></td> <td>fehlgeschlagen</td> </tr> </tbody> </table> <hr> <h2 id=typische-pfade>Typische Pfade<a class=headerlink href=#typische-pfade title="Permanent link">&para;</a></h2> <h3 id=standardfall-kein-vorhandenes-raw>Standardfall (kein vorhandenes RAW)<a class=headerlink href=#standardfall-kein-vorhandenes-raw title="Permanent link">&para;</a></h3> <ol> <li>Disc erkannt</li> <li>Analyse + Metadaten</li> <li><code>RIPPING</code></li> <li><code>MEDIAINFO_CHECK</code></li> <li><code>READY_TO_ENCODE</code></li> <li><code>ENCODING</code></li> <li><code>FINISHED</code></li> </ol> <h3 id=vorhandenes-raw>Vorhandenes RAW<a class=headerlink href=#vorhandenes-raw title="Permanent link">&para;</a></h3> <p><code>READY_TO_START</code> springt direkt zu <code>MEDIAINFO_CHECK</code> (kein neuer Rip).</p> <h3 id=mehrdeutige-blu-ray-playlist>Mehrdeutige Blu-ray-Playlist<a class=headerlink href=#mehrdeutige-blu-ray-playlist title="Permanent link">&para;</a></h3> <p><code>MEDIAINFO_CHECK</code> -&gt; <code>WAITING_FOR_USER_DECISION</code> bis Benutzer Playlist bestätigt.</p> <hr> <h2 id=queue-verhalten>Queue-Verhalten<a class=headerlink href=#queue-verhalten title="Permanent link">&para;</a></h2> <p>Wenn <code>pipeline_max_parallel_jobs</code> erreicht ist:</p> <ul> <li>Job-Aktionen werden als Queue-Einträge abgelegt</li> <li>Queue kann zusätzlich Nicht-Job-Einträge enthalten (<code>script</code>, <code>chain</code>, <code>wait</code>)</li> <li>Reihenfolge ist per API/UI änderbar</li> </ul> <hr> <h2 id=abbruch-retry-restart>Abbruch, Retry, Restart<a class=headerlink href=#abbruch-retry-restart title="Permanent link">&para;</a></h2> <ul> <li><code>cancel</code>: laufenden Job abbrechen oder Queue-Eintrag entfernen</li> <li><code>retry</code>: Fehler-/Abbruch-Job neu starten</li> <li><code>reencode</code>: aus vorhandenem RAW neu encodieren</li> <li><code>restart-review</code>: Review aus RAW neu aufbauen</li> <li><code>restart-encode</code>: Encoding mit letzter bestätigter Auswahl neu starten</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> Zurück zum Seitenanfang </button> </main> <footer class=md-footer> <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 class=md-social> <a href=https://github.com/YOUR_GITHUB_USERNAME/ripster target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 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="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.Line truncated