@omnimedia/omnitool
Version:
open source video processing tools
131 lines (125 loc) • 4.28 kB
JavaScript
import { ssg, html } from "@e280/scute";
const title = "omnitool";
const domain = "omnitool.omniclip.app";
const favicon = "/assets/favicon.png";
export default ssg.page(import.meta.url, async (orb) => ({
title,
// favicon,
dark: true,
css: "demo/demo.css",
js: "demo/demo.bundle.min.js",
head: html `
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Share+Tech&family=Space+Grotesk:wght@400;600&display=swap" rel="stylesheet">
`,
socialCard: {
title,
description: "video processing toolkit",
themeColor: "#3cff9c",
siteName: domain,
image: `https://${domain}${favicon}`,
},
body: html `
<section>
<header class="hero">
<div>
<h1>Omnitool <small>v${orb.packageVersion()}</small></h1>
<p>Developer demos for decoding, preview, waveform, playback, and export.</p>
</div>
</header>
<div class="demo-grid">
<article class="demo-card" data-demo="transcode">
<header>
<h2>Transcode Test</h2>
<p>Full decode + composite + encode pipeline.</p>
</header>
<div class="demo-controls">
<input type="file" accept="video/*" />
<button data-action="run">Run Transcode</button>
</div>
<div class="demo-progress">
<progress class="progress"></progress>
<span class="status">idle</span>
</div>
<div class="demo-preview"></div>
</article>
<article class="demo-card" data-demo="filmstrip">
<header>
<h2>Filmstrip</h2>
<p>Thumbnail sampling across a time range.</p>
</header>
<div class="demo-controls">
<input type="file" accept="video/*" />
<button data-action="run">Generate Filmstrip</button>
</div>
<div class="filmstrip-controls">
<label>viewable range</label>
<input type="range" min="0" max="100" step="1" value="10" class="range">
<div class="range-view"></div>
<label>range size</label>
<input type="range" class="range-size" min="0.1" max="10" step="0.1" value="0.5">
<label>frequency</label>
<input type="range" class="frequency" min="0.1" max="120" step="0.1" value="10">
<div class="frequency-view">10 (fps)</div>
</div>
<div class="filmstrip"></div>
</article>
<article class="demo-card" data-demo="waveform">
<header>
<h2>Waveform</h2>
<p>Audio peak rendering with adjustable width.</p>
</header>
<div class="demo-controls">
<input type="file" accept="audio/*,video/*" />
<button data-action="run">Build Waveform</button>
</div>
<div class="waveform-controls">
<label>width</label>
<input class="width" type="range" min="100" max="1000000" value="1000" step="100" />
</div>
<div class="waveform-canvas"></div>
</article>
<article class="demo-card" data-demo="playback">
<header>
<h2>Timeline Playback</h2>
<p>Build timeline and run the playback engine.</p>
</header>
<div class="demo-controls">
<input type="file" accept="video/*,audio/*,image/*" />
</div>
<div class="player-canvas"></div>
<div class="player">
<div class="timeline">
<div class="track">
<div class="playhead"></div>
</div>
<input class="scrub" type="range" min="0" max="0" step="1" value="0">
</div>
<div class="timecode">0:00.000 / 0:00.000</div>
<div class="controls">
<button class=play disabled>play</button>
<button class=stop disabled>stop</button>
</div>
</div>
</article>
<article class="demo-card" data-demo="export">
<header>
<h2>Timeline Export</h2>
<p>Build timeline and export a render.</p>
</header>
<div class="demo-controls">
<input type="file" accept="video/*,audio/*,image/*" />
<button data-action="export" disabled>Export</button>
</div>
<div class="demo-progress">
<progress class="progress"></progress>
<span class="status">idle</span>
</div>
<div class="demo-preview"></div>
</article>
</div>
</section>
`,
}));
//# sourceMappingURL=index.html.js.map