UNPKG

makemkv-auto-rip

Version:

Automatically rips DVDs & Blu-rays using the MakeMKV console, then saves them to unique folders. It can be used from the command line or via a web interface, and is cross-platform. It is also containerized, so it can be run on any system with Docker insta

511 lines (485 loc) 19.1 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Configuration Editor - MakeMKV Auto Rip</title> <link rel="stylesheet" href="/static/css/styles.css" /> <link rel="stylesheet" href="/static/css/config.css" /> </head> <body> <div class="container"> <header class="header"> <div class="header-top"> <h1>⚙️ Configuration Editor</h1> <div class="header-actions"> <a href="/" class="btn btn-secondary">← Back to Home</a> </div> </div> <p class="subtitle">Configure MakeMKV Auto Rip Settings</p> </header> <main class="config-main"> <div class="config-layout"> <!-- Navigation Sidebar --> <nav class="config-nav"> <h3>Categories</h3> <ul class="nav-menu" id="configNav"> <li class="nav-item"> <button class="nav-button active" data-section="paths" type="button" > 📁 Paths & Directories </button> </li> <li class="nav-item"> <button class="nav-button" data-section="drives" type="button"> 💿 Drive Operations </button> </li> <li class="nav-item"> <button class="nav-button" data-section="mount-detection" type="button" > 🔍 Mount Detection </button> </li> <li class="nav-item"> <button class="nav-button" data-section="ripping" type="button"> 🎯 Ripping Behavior </button> </li> <li class="nav-item"> <button class="nav-button" data-section="interface" type="button" > 🖥️ Interface Behavior </button> </li> <li class="nav-item"> <button class="nav-button" data-section="makemkv" type="button"> 🎬 MakeMKV Settings </button> </li> </ul> </nav> <!-- Configuration Content --> <div class="config-content"> <form id="configForm" class="config-form"> <!-- Paths Section --> <section class="config-section active" data-section="paths"> <h2>📁 Paths and Directories</h2> <div class="form-group"> <div class="checkbox-group"> <label class="checkbox-option"> <input type="checkbox" id="override_makemkv_dir" /> <span class="checkbox-label" >Override MakeMKV Installation Directory</span > </label> <small class="help-text"> Enable to specify a custom MakeMKV installation path (normally auto-detected) </small> </div> <div class="conditional-field" id="makemkv_dir_field"> <label for="makemkv_dir" >MakeMKV Installation Directory</label > <input type="text" id="makemkv_dir" name="paths.makemkv_dir" placeholder="e.g., C:/Program Files/MakeMKV" class="form-control" /> <small class="help-text"> Only set this if MakeMKV is installed in a non-standard location </small> </div> </div> <div class="form-group"> <label for="movie_rips_dir"> Movie Rips Directory <span class="required">*</span> </label> <input type="text" id="movie_rips_dir" name="paths.movie_rips_dir" placeholder="e.g., C:/Movies or ./media" class="form-control" required /> <small class="help-text"> Directory where ripped movies will be saved </small> </div> <div class="form-row"> <div class="form-group"> <label for="logging_enabled">Enable File Logging</label> <div class="radio-group"> <label class="radio-option"> <input type="radio" name="paths.logging.enabled" value="true" /> <span class="radio-label">Enabled</span> </label> <label class="radio-option"> <input type="radio" name="paths.logging.enabled" value="false" /> <span class="radio-label">Disabled</span> </label> </div> <small class="help-text"> Whether to save operation logs to files </small> </div> <div class="form-group"> <label for="time_format">Log Time Format</label> <select id="time_format" name="paths.logging.time_format" class="form-control" > <option value="12hr"> 12-hour format (e.g., 2:30 PM) </option> <option value="24hr">24-hour format (e.g., 14:30)</option> </select> <small class="help-text"> Time format for console and log timestamps </small> </div> </div> <div class="form-group" id="logging_dir_group"> <label for="logging_dir"> Log Directory <span class="required">*</span> </label> <input type="text" id="logging_dir" name="paths.logging.dir" placeholder="e.g., C:/Logs or ./logs" class="form-control" /> <small class="help-text"> Directory where log files will be saved </small> </div> </section> <!-- Drive Operations Section --> <section class="config-section" data-section="drives"> <h2>💿 Drive Operations</h2> <div class="form-row"> <div class="form-group"> <label for="auto_load">Automatically Load Drives</label> <div class="radio-group"> <label class="radio-option"> <input type="radio" name="drives.auto_load" value="true" /> <span class="radio-label">Enabled</span> </label> <label class="radio-option"> <input type="radio" name="drives.auto_load" value="false" /> <span class="radio-label">Disabled</span> </label> </div> <small class="help-text"> Automatically load/close optical drives before ripping </small> </div> <div class="form-group"> <label for="auto_eject">Automatically Eject Drives</label> <div class="radio-group"> <label class="radio-option"> <input type="radio" name="drives.auto_eject" value="true" /> <span class="radio-label">Enabled</span> </label> <label class="radio-option"> <input type="radio" name="drives.auto_eject" value="false" /> <span class="radio-label">Disabled</span> </label> </div> <small class="help-text"> Automatically eject drives after ripping completion </small> </div> </div> <div class="form-group"> <label for="load_delay">Drive Load Delay (seconds)</label> <input type="number" id="load_delay" name="drives.load_delay" min="0" max="60" placeholder="0" class="form-control" /> <small class="help-text"> Delay time when loading drives to allow for manual drive closing (0 to disable) </small> </div> </section> <!-- Mount Detection Section --> <section class="config-section" data-section="mount-detection"> <h2>🔍 Mount Detection</h2> <div class="form-row"> <div class="form-group"> <label for="wait_timeout" >Mount Wait Timeout (seconds)</label > <input type="number" id="wait_timeout" name="mount_detection.wait_timeout" min="0" max="300" placeholder="10" class="form-control" /> <small class="help-text"> Maximum time to wait for drives to mount media before starting rip (0 to disable) </small> </div> <div class="form-group"> <label for="poll_interval" >Polling Interval (seconds)</label > <input type="number" id="poll_interval" name="mount_detection.poll_interval" min="0.1" max="10" step="0.1" placeholder="1" class="form-control" /> <small class="help-text"> Polling interval to check for newly mounted drives </small> </div> </div> </section> <!-- Ripping Behavior Section --> <section class="config-section" data-section="ripping"> <h2>🎯 Ripping Behavior</h2> <div class="form-group"> <label for="rip_all_titles">Rip All Titles</label> <div class="radio-group"> <label class="radio-option"> <input type="radio" name="ripping.rip_all_titles" value="true" /> <span class="radio-label" >All titles above minimum length</span > </label> <label class="radio-option"> <input type="radio" name="ripping.rip_all_titles" value="false" /> <span class="radio-label">Longest title only</span> </label> </div> <small class="help-text"> Whether to rip all titles from disc or just the main/longest title </small> </div> <div class="form-group"> <label for="ripping_mode">Ripping Mode</label> <select id="ripping_mode" name="ripping.mode" class="form-control" > <option value="async">Parallel Processing</option> <option value="sync">Sequential Processing</option> </select> <small class="help-text"> Parallel processing is faster for destination SSDs, Sequential processing is better for HDDs </small> </div> </section> <!-- Interface Behavior Section --> <section class="config-section" data-section="interface"> <h2>🖥️ Interface Behavior</h2> <div class="form-group"> <label for="repeat_mode">Repeat Mode</label> <div class="radio-group"> <label class="radio-option"> <input type="radio" name="interface.repeat_mode" value="true" /> <span class="radio-label">Enabled</span> </label> <label class="radio-option"> <input type="radio" name="interface.repeat_mode" value="false" /> <span class="radio-label">Disabled</span> </label> </div> <small class="help-text"> After ripping, prompt again for another round instead of exiting </small> </div> </section> <!-- MakeMKV Settings Section --> <section class="config-section" data-section="makemkv"> <h2>🎬 MakeMKV Settings</h2> <div class="form-group"> <label for="fake_date">Fake System Date</label> <div class="form-row"> <div class="form-group"> <input type="date" id="fake_date_date" class="form-control" placeholder="YYYY-MM-DD" /> <small class="help-text" >Date (leave blank for real date)</small > </div> <div class="form-group"> <input type="time" id="fake_date_time" class="form-control" placeholder="HH:MM" /> <small class="help-text">Time (optional)</small> </div> <div class="form-group"> <button type="button" id="clear_fake_date" class="btn btn-secondary btn-small" > Clear Date </button> </div> </div> <input type="hidden" id="fake_date" name="makemkv.fake_date" /> <small class="help-text"> Temporarily change system date for MakeMKV operations only. Leave blank to use real system date. <br /> <strong>Note:</strong> Requires administrative privileges. System date is automatically restored after ripping operations complete. <br /> <strong>Docker:</strong> Not supported in Docker containers - change host system date manually if needed. </small> </div> </section> </form> </div> </div> <!-- Sticky Save Banner --> <div id="saveBanner" class="save-banner"> <div class="save-banner-content"> <div class="save-banner-text"> <span>Ready to save your changes?</span> </div> <div class="save-banner-actions"> <button type="button" class="btn btn-light btn-small" id="resetForm" > Cancel </button> <button type="submit" form="configForm" class="btn btn-success btn-small" > Save </button> </div> </div> </div> <!-- Loading Overlay --> <div id="loadingOverlay" class="loading-overlay" style="display: none"> <div class="loading-spinner"> <div class="spinner"></div> <p>Saving configuration...</p> </div> </div> </main> <footer class="footer"> <p> MakeMKV Auto Rip <span id="appVersion"></span> | <a href="https://github.com/Poisonite/MakeMKV-Auto-Rip" target="_blank" > GitHub </a> </p> </footer> </div> <script src="/static/js/config.js"></script> <script> // Fetch app version and update footer text fetch("/api/info") .then((r) => r.json()) .then((info) => { const el = document.getElementById("appVersion"); if (el && info && info.version) { el.textContent = `v${info.version}`; } }) .catch(() => { /* ignore */ }); </script> </body> </html>