= CRS Concepts The [[c3tracker:|C3 Ticket Tracker]] enables the (semi-)automated recording, editing & release of multilingual videos. In order to complete a release successfully, certain project settings must be configured and a few of the state transitions must be operated manually: == User Roles User accounts can have different roles depending on what the user should be able to do: * `User` - can cut and edit tickets * `Restricted` - can only use already defined actions and can't define new actions * `Superuser` - can edit profiles and (re)import fahrplan * `Admin` more details on https://github.com/crs-tools/tracker/blob/master/src/Config/AccessControl.php {{ .:pasted:20250619-180931.png?width=600}} == Ticket types and hierarchy One of the really good features of the C3 tracker is that propertyies are inherited through the hierarchy: * Project settings (Conference or Series) * Meta ticket (Parent with Fahrplan-ID & -Metadata) * Recording ticket (Language, etc) - Main encoding ticket (MP4) - additional encoding tickets, e.g. WebM, MP3, Opus, SD formats, etc. == Ticket states and pipeline For each ticket type, the tracker has a predefined set of states, which can be enabled and disabled on an per project basis. Here is an example workflow with only one manual `checking` step: {{drawio>c3tracker:states}} This allows quite flexible pipelines, which are described in more detail in [[setup]] – for now lets focus on a typical one: {{drawio>c3tracker:setup-central-storage.png}} Let's look into the steps done by worker scripts === Recording ==== Worker A: Recording Scheduler [[https://github.com/crs-tools/crs-scripts/blob/master/scripts/script-A-recording-scheduler.pl|script-A-recording-scheduler.pl]] Schedules and transitions tickets from `scheduled` via `recording` to `recorded`, optionally filters by room. Skips opt-out events, but does not perform any real task besides transitioning the recording ticket. - **Inputs**: CRS ticket in `scheduled` state - **Outputs**: Ticket moved to `recording` or skipped - **Notes**: Uses `CRS_ROOM`, `Record.StartedBefore`, and `Record.EndedBefore` filters The actual recording is done by a [[bundlewrap]] configured systemd unit on the encoder which writes TS-Schnipsel to `/video/capture///`, which are rsynced to storage. The "Schipsel" file names include the room name and recording timestamp as follows: -YYYY-MM-DD_HH-MM-SS. ==== Worker B: Create virtual project files [[https://github.com/crs-tools/crs-scripts/blob/master/scripts/script-B-mount4cut.pl|script-B-mount4cut.pl]] Mounts raw video segments via FUSE. Checks and sets cut marks, stores metadata like duration and framerate. - **Inputs**: Ticket in `recording` → `preparing` state - **Outputs**: FUSE mount created and cut marks optionally stored - **Notes**: Supports DV and TS formats ==== Manual task by VOC crew: Cut see [[operation:cutting]] The cutting process requires the operator to set start and end marks, using MLT-Video-Editor like Shotcut/Kdenlive but tooling accepts frame numbers via CLI. If your player does not show frame numbers you can approximate with the formula `seconds * 25` assumed you have 25 frames per second. Note that this means you cut per second not per frame! {{c3_tracker_-_schnitt_mit_kdenlive.mp4}} * [[https://www.youtube.com/watch?v=K-KHbAcTo9I|Usage video YT link]] (german) * TODO: [[events:cccamp15:pp]] integrieren ==== Worker C: Finalise recording ticket [[https://github.com/crs-tools/crs-scripts/blob/master/scripts/script-C-cut-postprocessor.pl|script-C-cut-postprocessor.pl]] Validates cut marks, adds intro/outro clips if defined, and calculates cut durations. Fails tickets with incomplete data. - **Inputs**: Ticket in `cut` state - **Outputs**: Ticket in `finialized` state, updated with durations and metadata - **Notes**: Verifies intro/outro file paths and presence Naming for intro and outro, all in `/video/intros//`: * Intro `.ts` * Outro: `outro.ts` === Encoding ===== Worker D: Encoding [[https://github.com/crs-tools/crs-scripts/blob/master/scripts/script-D-encoding.pl|script-D-encoding.pl]] Runs encoding tasks from job XML. Skips if Voctomix is detected. Supports VAAPI acceleration and logs execution times. - **Inputs**: Ticket in `ready to encode` state, XML jobfile with ffmpeg commands - **Outputs**: Encoded media file(s), ticket state updated to `encoded` - **Notes**: Uses CRS::Executor and task-type detection ===== Worker E: Postencoding [[https://github.com/crs-tools/crs-scripts/blob/master/scripts/script-E-postencoding-auphonic.pl|script-E-postencoding-auphonic.pl]] Runs audio processing and remuxing. Can optionally delegate to Auphonic for audio leveling and rendering. - **Inputs**: Ticket in `encoded` state - **Outputs**: Ticket in `postencoded` state, media file (MP4, …) with updated audio tracks and metadata - **Notes**: Supports audio hash checking and production reuse ==== Manual task by VOC crew: Check see [[operation:checking]] ===== Worker F: Upload from Encoder (local) to Releasing host [[https://github.com/crs-tools/crs-scripts/blob/master/scripts/script-F-postprocessing-upload.pl|script-F-postprocessing-upload.pl]] Uploads processed files to the target via ssh from encoder/storage to [[intern:server:releasing.c3voc.de]]. Can skip uploads based on host config. - **Inputs**: Ticket in `postprocessing` state - **Outputs**: Files pushed to publishing target - **Notes**: Validates file presence, honors opt-out and skip-hosts ==== Publishing https://github.com/voc/voctopublish {{drawio>c3tracker:publishing.png}}