rotogod/web/index.html
m3ultra 96bba8e538 feat: browser upload (raw-body, 8g cap) + click-to-download exports
Makes the digalot.fyi/rotogod/ proxy actually usable away from the box:
⬆ uploads land in samples/uploads and open; output list links through
GET /api/download/{name}. nginx side: 8g body cap, request buffering off.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 13:30:49 +10:00

89 lines
3.0 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>ROTOGOD</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="static/style.css">
</head>
<body>
<header>
<h1>ROTO<span>GOD</span></h1>
<input id="path" placeholder="/absolute/path/to/clip.mp4" spellcheck="false">
<button id="load">Load</button>
<input type="file" id="file" accept="video/*,.mp4,.mov,.mkv,.webm" hidden>
<button id="upload" title="upload a clip from this device"></button>
<span id="engine" class="badge">engine: …</span>
<span id="toast"></span>
</header>
<main>
<div id="stage"><canvas id="cv" width="16" height="9"></canvas></div>
<aside>
<section>
<h2>Roto</h2>
<div id="rangeInfo" class="dim">range: </div>
<div class="row">
<button id="startRoto" class="wide">Start roto on in→out</button>
<button id="resetRoto" title="drop session"></button>
</div>
<div id="objects" class="row wrap"></div>
<div class="row">
<button id="addObj">+ object</button>
<span class="dim hint">L-click add · R/⌥-click subtract</span>
</div>
<div class="row">
<button id="track" class="wide">▶ Track range</button>
<button id="trackHere" title="re-propagate from current frame">▶ here</button>
</div>
<progress id="prog" value="0" max="1"></progress>
<div id="progText" class="dim"></div>
<label class="dim"><input type="checkbox" id="showOverlay" checked> show masks</label>
</section>
<section>
<h2>Export roto</h2>
<div class="row wrap">
<button class="exp" data-kind="prores">ProRes 4444 α</button>
<button class="exp" data-kind="webm">WebM α</button>
<button class="exp" data-kind="matte">Matte</button>
<button class="exp" data-kind="green">Greenscreen</button>
</div>
<label class="dim">feather <input id="feather" type="number" value="2" min="0" max="20"></label>
</section>
<section>
<h2>Scene cut</h2>
<div class="row">
<button id="trim" class="wide">Export in→out</button>
<label class="dim"><input type="checkbox" id="exactTrim" checked> exact</label>
</div>
</section>
<section>
<h2>Output</h2>
<div id="outlist" class="dim"></div>
</section>
</aside>
</main>
<footer>
<div id="transport">
<button id="prev10">«</button><button id="prev"></button>
<button id="play"></button>
<button id="next"></button><button id="next10">»</button>
<span class="gap"></span>
<button id="setIn">⇤ in <kbd>i</kbd></button>
<button id="setOut">out ⇥ <kbd>o</kbd></button>
<span id="frameLabel" class="dim"> / </span>
</div>
<div id="timeline">
<img id="thumbs" draggable="false" alt="">
<div id="shadeL" class="shade"></div>
<div id="shadeR" class="shade"></div>
<div id="playhead"></div>
</div>
<input id="scrub" type="range" min="0" max="0" value="0" step="1">
</footer>
<script src="static/app.js"></script>
</body>
</html>