Files
Media-Server-Setup/UPCOMING.md

6.5 KiB
Raw Permalink Blame History

Upcoming — what a mil-sim community media stack still needs

Written 2026-11-01 from a conversation between techy and Claude. Three parts: the gap list as first drafted, techy's take on it, and the agreed direction. Living plan lives in CommunityDiscordMedia.md; current state in STATUS.md.

1. The gap list (first draft)

Measured against what mil-sim groups actually do with footage, the stack covers capture, storage, access and live viewing. The gaps cluster around the debrief workflow, moments, comms audio, and keeping the box healthy.

Debrief and review (the core mil-sim use)

  • Synced multi-POV playback. The timecode track makes it possible, but nothing plays it yet. A VOD mode of the live portal that opens every recording from one night and scrubs them in lockstep turns the archive into an after-action-review tool. The single biggest missing piece.
  • Ops as a first-class object. Titles are free text today. An op/training event that groups every streamer's recording, that night's clips, briefing files and finals → collections, per-op download bundle for editors, a Discord thread per op; the dock offers tonight's event instead of a typed title.
  • Markers. A "mark this" button in the dock, a Discord command, or an emoji reaction during the live post stamps the server clock into metadata → chapters, editor markers, the shortlist for the review session. Cheap: the clock already exists.
  • Twitch-style clips from the live recording. Segments are on disk while someone streams, so a !clip of the last 30–60 s is a server-side cut with no streamer action.

Audio

  • Separate comms track. Editors cutting to radio chatter want game audio and voice on separate tracks. RTMP carries one; SRT can carry several and OBS can send multiple audio tracks over it.
  • Voice server recording. Some units record TeamSpeak/Mumble as the authoritative comms log. Consent question before a technical one.

Standardisation

  • OBS starter kit. Downloadable scene collection + profile with the band, B-frames 0, bitrate caps, dock URL.
  • Callsign tags. The rename feature is per viewer; a server-side label ("1-1 Lead") on live panels and recordings.
  • Non-video intake. Briefing slides, map images, after-action notes have no drop point (clip intake is video only by design).

Health and operations

  • Disk monitoring and alerts. Nothing warns when disks fill, when the sweep writes a failure log, or when a stream drops. With hours of 1440p a night this is the most likely quiet death. Discord alert = small job.
  • Archive tier. The home archive puller is planned, not built; the 15-day hot window is the only window.
  • Backups. Authentik and Gitea databases are not dumped anywhere yet.

Audience

  • Public showcase. Everything is gated; recruitment needs a route for finals to go public (YouTube from finals).
  • Mobile. Jellyfin apps work; the live portal is desktop-only in practice.

Suggested top three: alerts (protect everything else), markers (cheap, feed everything downstream), synced multi-POV playback (what the archive is actually for).

2. techy's take

  • Synced multi-POV playback — yes. It means more metadata tracking, and we already have too many files: put the metadata in a database (Postgres or MariaDB), not more sidecars.
  • Ops come with the Discord bot. It has roll calls; we are waiting on the bot, its website and its database.
  • Markers — good. Likely just in the live window for now.
  • Live clips — nice idea, but we may instead build something like the live page for watching: multi-POV playback plus single-POV playback plus search, and replace Jellyfin entirely (it is only a half-baked fit). Decision for later.
  • Separate comms is coming-ish. We run mixed comms: once the bot exists it will listen to a voice channel after roll call. The Go Live button already excludes system audio, so it will carry game audio only. We also use in-game comms, so it will never be perfect.

3. Agreed direction (Claude's reply)

Everything lines up on one axis: the server clock. Recordings, markers, roll calls and comms audio are all stored as UTC instants and joined later, which is exactly what a synced player needs.

Database. Use the MariaDB that already runs for the bot rather than adding Postgres: one database to back up, and the bot's ops/roll-call tables land beside ours, so "this op → these recordings" is a query, not a convention. Keep the per-file sidecar as the self-describing fallback; the sweep writes both; a reconcile command rebuilds the tables from sidecars if the database is ever lost. Rough shape:

table holds owner
recordings path, streamer, title, start UTC (band or arrival), duration, fps, timecode source + drift, band removed, gaps, optional op id sweep
markers UTC instant, author, stream path or null (= everyone), kind, note — stored by time, not file offset, so a marker placed live attaches to the recording when published and to every other POV of that moment for free dumpd (portal), later the bot
clips file, owner, arrival time, converted or not sweep / dumpd
ops, roll_call the bot's; we only read them bot

Markers in the live window. A Mark button on the focused panel plus a hotkey, posting the current server time and the stream path to dumpd. Small, and it gives the future player its chapter list from day one. The Discord-command version comes with the bot and writes to the same table.

Replacing Jellyfin. The database makes it a clean later decision. A watch app built on the portal's code does single POV with search by op, streamer, date and marker, and multi-POV with lockstep scrubbing driven by the timecode. Until then Jellyfin keeps reading sidecars and nothing breaks.

Comms. Bot-captured Discord audio after roll call, stamped on receipt by the same box, lines up with everything else with no extra sync work. In-game comms stay in the game audio; fine for review.

Sequence.

  1. Schema + sweep inserts + marker endpoint + Mark button in the live portal (small; everything else reads from it).
  2. Write the table contract into the bot developer's brief (bot/AGENT.md) so the bot is designed against it now.
  3. Watch app (single + multi-POV + search) once the bot's ops data exists and the Jellyfin decision is made.

Not scheduled, still true: alerts (disk / sweep failures / dropped streams), backups of Authentik + Gitea databases, archive puller, OBS starter kit, callsign tags, non-video intake, public showcase, mobile.