One source of truth for the branded player on desktop (archive) and
mobile. The ArchivePlayer class moves out of app.js into player.js
(name kept; app.js still does `new ArchivePlayer`); the .pjs styles
move out of style.css into player.css. Both archive.html and mobile.html
load the shared module before their own script.
The shared player gains two additive, backward-compatible options:
- live: timeline hidden, only pause/play + fullscreen (mobile Live).
- autohide:false: control bar always visible (touch); desktop keeps
autohide (default true), so desktop archive behaves exactly as before.
Fullscreen is now self-contained (no global toggleFullscreen dep) so it
works on mobile too, with an iOS <video> fallback.
mobile.js drops its duplicated Player class and uses ArchivePlayer.
Verified on .79: /archive 200 loads player.{js,css}; app.js has no
class def; mobile (Host :8443) loads the shared module.
VERSION 0.0.154 -> 0.0.155
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the split mobile UI (live = round pause button, archive = native
<video controls>) with one branded player for both modes, ported from the
desktop ArchivePlayer (.pjs) and kept self-contained in the mobile bundle
so the live desktop is untouched.
- Live: branded player with pause/play + fullscreen only (no seekbar).
- Archive: branded player with full seek (transcode virtual timeline,
seek = restart transcode with -ss) + playback speed (0.5/1/2/5x).
- H.264 server transcode path unchanged; touch-friendly always-on bar.
Verified end-to-end on .79: live.mp4 200 video/mp4, play.mp4 200,
duration_s present for the seek timeline.
VERSION 0.0.153 -> 0.0.154
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move mode selection (Live / Архив) into a top hamburger side-drawer
instead of the bottom bar. Header now shows the ☰ button + current mode
title. Live view has a single pause/play button (no seek bar); Archive
keeps native controls for seeking (перемотка).
VERSION 0.0.151 -> 0.0.152
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the two-tab bottom bar (Live / Архив) with a single centered
toggle button. It switches the mode either/or: shows the current mode
with a swap glyph (⇆), tap flips Live ⇄ Архив.
VERSION 0.0.150 -> 0.0.151
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A new mobile dashboard is served on a second host port (8443) mapped to the
same backend, so the recorder/supervisor is not duplicated. main.py detects
the mobile port via the Host header and serves mobile.html instead of the
desktop index. The mobile SPA has two modes: Live (one camera with a selector)
and Archive (camera + date + segment list). Video is delivered as server-side
H.264 (live.mp4 / play.mp4 transcode) so a plain <video> plays on any phone.
Bottom tab bar, dark theme, safe-area aware.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>