NextNVR/public/index.html
cclohmar 6346d5fbe1 fix: skip in-progress .part segments and enable MP4 faststart
- /api/recordings no longer lists rec_*.part.mp4 files: FFmpeg has not
  written the moov atom yet, so they can never play. The in-progress
  segment was always the newest entry at the top of the list.
- Record new segments with -movflags +faststart so the MP4 index is at
  the front. iOS/Safari otherwise tail-seeks the moov and stalls.
- Add playsinline to the playback video for inline iOS playback.
- Add scripts/remux-faststart.sh to convert the existing archive
  (dry-run by default, atomic, preserves mtime for retention).
2026-10-20 08:10:09 +01:00

76 lines
3.2 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">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="nextnvr-role" content="">
<title>NextNVR</title>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<header class="topbar">
<h1>🎥 NextNVR</h1>
<nav id="tabs">
<button data-tab="live" class="tab active">Live Wall</button>
<button data-tab="playback" class="tab">Playback</button>
<button data-tab="settings" class="tab">Settings</button>
</nav>
<span id="status-dot" class="status offline" title="Server status">●</span>
</header>
<div id="storage-alert" class="storage-alert hidden"></div>
<main id="content">
<!-- Live Wall: 4×2 grid + focus overlay -->
<section id="tab-live" class="tab-panel active">
<div id="grid" class="grid-4x2"></div>
<div id="focus-overlay" class="focus-overlay hidden">
<div class="focus-bar">
<button id="focus-close">✕ Close</button>
</div>
<iframe id="focus-frame" class="focus-frame" allow="autoplay"></iframe>
</div>
</section>
<!-- Playback: clip browser -->
<section id="tab-playback" class="tab-panel">
<div class="playback-controls">
<select id="pb-camera"><option value="">— Select Camera —</option></select>
<div class="preset-group">
<button class="preset active" data-preset="today">Today</button>
<button class="preset" data-preset="yesterday">Yesterday</button>
<button class="preset" data-preset="week">Last 7 Days</button>
<button class="preset" data-preset="custom">Custom ▾</button>
</div>
<div id="pb-custom-range" class="hidden" style="display:flex;gap:8px;align-items:center">
<input type="date" id="pb-from">
<span>→</span>
<input type="date" id="pb-to">
</div>
<button id="pb-load" class="btn-primary">Load Clips</button>
</div>
<div id="pb-clips" class="clip-grid"></div>
<div id="pb-player" class="clip-player hidden">
<video id="pb-video" controls playsinline></video>
<div style="display:flex;gap:8px;margin-top:12px">
<button id="pb-download" class="btn-primary">⬇ Download</button>
<button id="pb-close">✕ Close</button>
</div>
</div>
</section>
<!-- Settings: camera configuration & onboarding -->
<section id="tab-settings" class="tab-panel">
<div class="settings-toolbar">
<button id="btn-scan" class="btn-primary">🔍 Scan Network (ONVIF)</button>
<button id="btn-save" class="btn-success">💾 Save Configuration</button>
<span id="settings-status"></span>
</div>
<div id="camera-cards"></div>
<div id="scan-results" class="scan-results hidden"></div>
</section>
</main>
<script src="/app.js"></script>
</body>
</html>