diff mrjunejune/src/tools/hls_player/index.html @ 242:543df0fe7168

[tools] Add full HLS player support
author MrJuneJune <me@mrjunejune.com>
date Mon, 03 Aug 2026 13:14:41 -0700
parents
children 60a876c4587a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrjunejune/src/tools/hls_player/index.html	Mon Aug 03 13:14:41 2026 -0700
@@ -0,0 +1,94 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    {{/parts/base_head.html}}
+    <title>HLS Player - MrJuneJune</title>
+    <link rel="stylesheet" href="/tools/hls_player/index.css" />
+    <script src="/public/hls.min.js" defer></script>
+    <script src="/tools/hls_player/hls-player.js" defer></script>
+  </head>
+  <body>
+    {{/parts/header.html}}
+    <main>
+      <h1>Online HLS Player</h1>
+      <p>Load an HLS playlist from a URL, or try the sample stream bundled with this site.</p>
+
+      <form id="hlsForm" class="hls-form">
+        <label for="hlsUrl">Playlist URL</label>
+        <div class="hls-url-row">
+          <input
+            id="hlsUrl"
+            name="url"
+            type="text"
+            inputmode="url"
+            value="/public/hls-sample/h264-ts-stream.m3u8"
+            placeholder="https://example.com/stream.m3u8"
+            required
+          />
+          <button type="submit">Load</button>
+          <button id="sampleButton" type="button">Sample</button>
+        </div>
+      </form>
+
+      <fieldset class="hls-local-picker">
+        <legend>Local HLS</legend>
+        <p>Select the playlist together with every init and segment file it references.</p>
+        <div class="hls-local-actions">
+          <label class="hls-file-button">
+            Choose HLS files
+            <input
+              id="hlsFiles"
+              type="file"
+              accept=".m3u8,.m4s,.mp4,.ts,.aac,.vtt,.key,application/vnd.apple.mpegurl"
+              multiple
+            />
+          </label>
+          <label class="hls-file-button">
+            Choose HLS folder
+            <input
+              id="hlsFolder"
+              type="file"
+              webkitdirectory
+              multiple
+            />
+          </label>
+        </div>
+      </fieldset>
+
+      <div class="hls-player-shell">
+        <video id="hlsVideo" controls playsinline preload="metadata"></video>
+        <p id="hlsStatus" class="hls-status" role="status" aria-live="polite">Ready to load a playlist.</p>
+      </div>
+
+      <dl id="hlsDetails" class="hls-details" hidden>
+        <div>
+          <dt>Playback</dt>
+          <dd data-detail="mode">-</dd>
+        </div>
+        <div>
+          <dt>Segments</dt>
+          <dd data-detail="segments">-</dd>
+        </div>
+        <div>
+          <dt>Duration</dt>
+          <dd data-detail="duration">-</dd>
+        </div>
+        <div>
+          <dt>Codec</dt>
+          <dd data-detail="codecs">-</dd>
+        </div>
+      </dl>
+
+      <section class="hls-notes">
+        <h2>Notes</h2>
+        <ul>
+          <li>Remote playlists must allow cross-origin requests.</li>
+          <li>Local loading stays in your browser; selected files are not uploaded.</li>
+          <li>Chrome, Edge, and Firefox support MPEG-TS, fragmented MP4, live, and adaptive HLS through hls.js.</li>
+          <li>Safari uses native HLS playback when available.</li>
+        </ul>
+      </section>
+    </main>
+    {{/parts/footer.html}}
+  </body>
+</html>