Commit graph

160 commits

Author SHA1 Message Date
eb248c690f fix(db): use DO blocks for idempotent ALTER TABLE (ADD CONSTRAINT IF NOT EXISTS is not valid PG syntax) 2026-05-18 19:48:11 -04:00
c662df94c4 fix(db): add CHECK constraints, UNIQUE, and asset_id index to sequences schema 2026-05-18 19:46:42 -04:00
b12d8c619a feat(db): add sequences and sequence_clips tables 2026-05-18 19:41:21 -04:00
0964645910 docs: add Phase 1 NLE Editor implementation plan 2026-05-18 19:34:53 -04:00
9032853629 docs: finalize spec with user decisions (auto-save, multi-sequence, 59.94fps, gap-ok) 2026-05-18 19:23:01 -04:00
67251a0dcd docs: add editor + growing file + feature expansion design spec 2026-05-18 19:14:00 -04:00
0b94153518 Replace inline auth script with shared auth-guard.js in tokens.html 2026-05-18 13:46:10 -04:00
3203832aa9 Replace inline auth script with shared auth-guard.js in users.html 2026-05-18 13:44:35 -04:00
88c0781767 Replace inline auth script with shared auth-guard.js in jobs.html 2026-05-18 13:43:22 -04:00
81b832dc70 Replace inline auth script with shared auth-guard.js in recorders.html 2026-05-18 13:41:52 -04:00
936867c0c3 Replace inline auth script with shared auth-guard.js on recorders, jobs, users, tokens pages: tokens.html 2026-05-18 13:38:27 -04:00
de3920dd4a Replace inline auth script with shared auth-guard.js on recorders, jobs, users, tokens pages: users.html 2026-05-18 13:38:26 -04:00
9dfefc5731 Replace inline auth script with shared auth-guard.js on recorders, jobs, users, tokens pages: jobs.html 2026-05-18 13:38:25 -04:00
f3fbb027f6 Replace inline auth script with shared auth-guard.js on recorders, jobs, users, tokens pages: recorders.html 2026-05-18 13:38:24 -04:00
e3128acb15 fix: use shared auth-guard.js on capture.html 2026-05-18 13:27:24 -04:00
d8766f18cc fix: use shared auth-guard.js on upload.html 2026-05-18 13:26:19 -04:00
a40232e2b5 fix: use shared auth-guard.js on settings.html 2026-05-18 13:25:03 -04:00
ebe8b3be59 fix: use shared auth-guard.js on index.html 2026-05-18 13:24:25 -04:00
cb63e4743d fix: /me returns guest user when AUTH_ENABLED is false so auth-guard never fires on dev 2026-05-18 13:21:37 -04:00
4f649b41a9 feat: add shared auth-guard.js with 401 → login redirect 2026-05-18 13:21:22 -04:00
725c3ed292 feat: rebuild settings.html with new shell layout 2026-05-18 13:08:19 -04:00
9ceb5db1e3 feat: add admin sidebar section and user footer widget 2026-05-18 13:08:04 -04:00
533250b1c3 feat: add admin sidebar section and user footer widget 2026-05-18 13:07:47 -04:00
ffffe8039e feat: add admin sidebar section and user footer widget 2026-05-18 13:07:40 -04:00
027e73467f feat: add admin sidebar section and user footer widget 2026-05-18 13:06:57 -04:00
95fa1b83b6 feat: add admin sidebar section and user footer widget 2026-05-18 13:06:40 -04:00
4213c8a7b3 feat: auth system — CSS page transitions, API helpers, users/tokens pages 2026-05-18 13:00:31 -04:00
c7d8be9f28 feat: auth system — CSS page transitions, API helpers, users/tokens pages 2026-05-18 12:59:36 -04:00
2d21d4d44d feat: auth system — CSS page transitions, API helpers, users/tokens pages 2026-05-18 12:58:24 -04:00
d0f9848717 feat: auth system — CSS page transitions, API helpers, users/tokens pages 2026-05-18 12:57:50 -04:00
28a4b24911 feat(mam-api): wire users, groups, and tokens routes into main app 2026-05-18 12:51:14 -04:00
1e4c92c2df feat(mam-api): add personal API token routes 2026-05-18 12:50:58 -04:00
d23ca9be73 feat(mam-api): add groups admin CRUD routes with member management 2026-05-18 12:50:49 -04:00
5ed604136c feat(mam-api): add users admin CRUD routes 2026-05-18 12:50:33 -04:00
f93feb6e40 feat(mam-api): add auth middleware with session and Bearer token support 2026-05-18 12:50:21 -04:00
f57ed1b498 feat(mam-api): add auth middleware with session and Bearer token support 2026-05-18 12:45:15 -04:00
2d8c44c529 feat(mam-api): add groups and API tokens schema patch 2026-05-18 12:45:06 -04:00
3154cce37c fix: ETag case mismatch in multipart upload complete route
api.js sends parts as { partNumber, ETag } (uppercase) but upload.js
was reading p.etag (lowercase), resulting in undefined ETag passed to
S3 CompleteMultipartUpload → InvalidPart error on all large file uploads.

Also handle both casings defensively.
2026-05-16 18:56:38 -04:00
17646c1155 fix(jobs): read from BullMQ queues instead of empty DB table
GET /api/v1/jobs now queries the proxy, thumbnail, and conform BullMQ
queues directly and returns normalized job objects with id, type,
status, progress, asset_id, timestamps, and error fields.

Also adds DELETE /:id to remove completed/failed jobs from the queue,
supporting the clearCompleted action in jobs.html.

The PostgreSQL jobs table is still used only for conform job creation
(POST /conform) to preserve that workflow.
2026-05-16 17:38:53 -04:00
44b59742b8 redesign: jobs.html — filter tabs, type chips, inline progress, detail panel 2026-05-16 17:02:39 -04:00
7aae1d2738 feat: redesign capture.html with new design system 2026-05-16 16:48:25 -04:00
f7a96677ef feat: redesign recorders.html with new design system 2026-05-16 13:57:20 -04:00
cf93b2f378 feat: redesign upload.html and recorders.html: upload.html 2026-05-16 13:06:10 -04:00
c6cca63595 feat: redesign index.html, upload.html, recorders.html: index.html 2026-05-16 13:04:45 -04:00
c0d3d0590b feat: full GUI redesign — broadcast control register aesthetic: common.css 2026-05-16 13:02:33 -04:00
f5abf359fb fix(nginx): use Docker embedded DNS resolver to avoid startup DNS failure
nginx resolves upstream hostnames at config load time, which fails when
sibling containers haven't registered with the Docker DNS yet. Using
resolver 127.0.0.11 with set $upstream defers resolution to request
time, preventing the "host not found in upstream" startup crash.
2026-05-16 08:44:50 -04:00
af9c9dbae4 fix(db): parse DATABASE_URL in pool.js instead of individual DB_* vars
pool.js was using DB_HOST/DB_USER/etc which were never set.
The docker-compose.yml passes DATABASE_URL. Parse that if present,
fall back to individual vars for local dev.
2026-05-16 08:39:47 -04:00
3c97999ea3 chore: use env-var port bindings — no hardcoded host ports
All host ports are now configurable via .env variables with sensible
defaults. This prevents collisions when deploying alongside existing
services on TrueNAS or any other host.
2026-05-16 08:27:25 -04:00
0a5b4d6191 feat(ui): SRT/RTMP listener/caller mode UI in recorders
- SRT: mode selector (Listener / Caller)
  - Listener: listen_port field + live connection info banner
  - Caller: source URL field
- RTMP: mode selector (Listener / Caller)
  - Listener: listen_port + stream_key fields + live connection info banner
  - Caller: source URL field
- Connection info banners update live as port/key fields change
- handleCreateRecorder builds correct source_config per mode
- Card meta display handles listener config (shows port, not url)
- updateSrtModeFields / updateRtmpModeFields helpers for dynamic show/hide
2026-05-16 08:23:24 -04:00
7aa07c6708 feat(docker): expose SRT (9000/udp) and RTMP (1935/tcp) ports on capture service 2026-05-16 08:21:21 -04:00