Feature: 049 — Video Management
Created: 2026-05-29
Status: Draft
Depends on: spec.md (feature specification)
Video Management introduces videos as first-class content Objects in the CCMS. This UX spec covers how users create, manage, preview, link, and deliver video Objects — including subtitle and language variant workflows — within the existing Authoring and Admin portals.
Key UX principle: Videos must feel like any other Object in the system. The interface reuses existing patterns (Object List, Properties panel, Preview panel, Create Object Dialog) and extends them only where video-specific controls are necessary (inline player, subtitle management, format validation feedback).
Entry point: Author View → "+ Create" button (or Folder Explorer context menu)
The existing CreateObjectDialog is extended to support the "Video" object type. No new dialog is introduced.
┌────────────────────────────────────────────────────────────────┐
│ Create Object [✕] │
├────────────────────────────────────────────────────────────────┤
│ │
│ Name: [________________________________] │
│ │
│ Type: [Video ▾] │
│ ← Populated from Object Type Definitions │
│ │
│ Template: [Standard Video ▾] │
│ ← Filtered by selected type │
│ │
│ Location: [/Manuals/Safety/Videos ▾] │
│ ← Folder picker (current folder pre-selected) │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ ⓘ After creation you can upload a video file and │ │
│ │ manage subtitles from the Properties panel. │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ [Cancel] [Create] │
└────────────────────────────────────────────────────────────────┘
Behaviour:
Selection flow after creation:
Object created → appears in Object List → auto-selected
→ Properties panel shows "Video" type badge + upload prompt
→ Preview panel shows empty state: "No video file uploaded yet"
Video Objects appear in the standard Object List alongside all other objects. They are visually distinguished by:
┌────────────────────────────────────────────────────────────────────────┐
│ Name │ Type │ Status │ Modified │ Author │
├────────────────────────────────────────────────────────────────────────┤
│ 🎬 safety-demo.mp4 │ Video │ Draft │ May 28 │ J. Smith │
│ 🎬 assembly-guide.webm │ Video │ Released │ May 20 │ A. Lee │
│ 📄 install-steps.dita │ DITA │ Checked In │ May 27 │ J. Smith │
│ 🖼 wiring-diagram.svg │ Graphic │ Released │ May 15 │ B. Chen │
└────────────────────────────────────────────────────────────────────────┘
When a Video Object is selected, the Properties panel (Zone B) shows standard metadata sections plus video-specific sections.
┌──────────────────────────────────────────────────────────┐
│ PROPERTIES │
├──────────────────────────────────────────────────────────┤
│ │
│ ── General ── │
│ Title: [Safety Demonstration Video ] │
│ Object Type: Video │
│ Status: Draft │
│ Language: EN (Source) │
│ │
│ ── Metadata ── │
│ [Standard metadata fields per workspace config] │
│ │
│ ── Video File ── │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 📁 safety-demo.mp4 │ │
│ │ Format: MP4 (H.264) │ Size: 142 MB │ │
│ │ Duration: 04:32 │ Resolution: 1920×1080 │ │
│ │ │ │
│ │ [Replace Video] [Download] │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ── OR (no file uploaded yet) ── │
│ ┌──────────────────────────────────────────────────┐ │
│ │ [Drag & drop video file here] │ │
│ │ │ │
│ │ or [Browse...] │ │
│ │ │ │
│ │ Accepted: MP4, WebM (max 2 GB) │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ── Subtitles ── │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Language │ File │ Status │ Actions │ │
│ │ EN (source) │ en.vtt │ Current │ ↓ ✏ 🗑 │ │
│ │ DE │ de.srt │ ⚠ Stale │ ↓ ✏ 🗑 │ │
│ │ FR │ — │ Missing │ + Add │ │
│ │ │ │
│ │ [+ Add Subtitle] │ │
│ └──────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────┘
Video File section behaviours:
Subtitles section behaviours:
Current — subtitle matches the latest video revision⚠ Stale — source video updated since subtitle was last edited (FR-009)Missing — language variant exists but no subtitle file uploadedTriggered by: "+ Add Subtitle" button in Properties panel
┌────────────────────────────────────────────────────────────┐
│ Add Subtitle [✕] │
├────────────────────────────────────────────────────────────┤
│ │
│ Language: [German (DE) ▾] │
│ ← Dropdown: configured language variants │
│ │
│ File: [________________________________] [Browse] │
│ ← Drag-and-drop zone also supported │
│ │
│ Accepted formats: SRT, VTT │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ⚠ Validation Results (shown after file selected): │ │
│ │ │ │
│ │ ✓ Format: Valid VTT │ │
│ │ ✓ Encoding: UTF-8 │ │
│ │ ⚠ Warning: 2 timing overlaps detected (lines 14, │ │
│ │ 28). These may cause display issues. │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ [Cancel] [Upload] │
└────────────────────────────────────────────────────────────┘
Behaviour:
Route: /ws/:workspaceId/object-authoring?objectId=...
When a Video Object is opened in the Object Authoring page, a video-specific adapter renders instead of the XML editor.
┌────────────────────────────────────────────────────────────────┐
│ [Object Authoring Shell] │
│ ─ "Safety Demonstration Video" / breadcrumb │
│ ─ Action bar: [Save] [Check Out] [Check In] [Close] │
├────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ ▶ VIDEO PLAYER │ │ │
│ │ │ (inline) │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ ▶ ■ ─────────●──────────── 01:32 / 04:32 │ │ │
│ │ │ [CC] [Language: EN ▾] [⛶ Full] │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ── Below Player ── │
│ ┌────────────────────┬─────────────────────────────────────┐ │
│ │ VIDEO DETAILS │ SUBTITLES MANAGEMENT │ │
│ │ ────────────── │ ───────────────────── │ │
│ │ File: safety.mp4 │ [Same as Properties subtitle │ │
│ │ Format: MP4 │ section — see §2.3] │ │
│ │ Duration: 04:32 │ │ │
│ │ Resolution: 1080p │ [+ Add Subtitle] │ │
│ │ Size: 142 MB │ [Upload New Version] │ │
│ │ │ │ │
│ │ [Replace Video] │ │ │
│ │ [Download] │ │ │
│ └────────────────────┴─────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘
Player controls:
Check-out / Check-in:
When a Video Object is selected in the Object List, the Preview panel (Zone C) renders an inline video player.
┌──────────────────────────────────────────────────────────┐
│ PREVIEW │
├──────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ▶ VIDEO PLAYER │ │
│ │ (aspect-ratio preserved) │ │
│ │ │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ▶ ■ ──────●────────────── 00:45 / 04:32 │ │
│ │ [CC ▾] [Lang: EN ▾] [⛶ Full] │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ── Video Info (below player) ── │
│ Duration: 04:32 │ Format: MP4 │ 1920×1080 │
│ Subtitles: EN ✓, DE ✓, FR (missing) │
│ │
└──────────────────────────────────────────────────────────┘
States:
Language variant switcher:
Context: User is editing a DITA topic in the XML Editor (Object Authoring page, DITA adapter)
Entry point: Editor toolbar → "Insert Reference" → "Video" (or from a content-assist / auto-complete)
┌────────────────────────────────────────────────────────────┐
│ Insert Video Reference [✕] │
├────────────────────────────────────────────────────────────┤
│ │
│ 🔍 Search video Objects: [________________________] │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Results: │ │
│ │ 🎬 Safety Demonstration Video │ Released │ EN │ │
│ │ 🎬 Assembly Guide │ Released │ EN, DE │ │
│ │ 🎬 Wiring Overview │ Draft │ EN │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ Selected: Safety Demonstration Video │
│ │
│ Display: [○ Embedded player ● Link ○ Thumbnail+link] │
│ │
│ ── Post-MVP (disabled, greyed out) ── │
│ Start time: [__:__] End time: [__:__] │
│ ⓘ Timestamp references available in a future release │
│ │
│ [Cancel] [Insert] │
└────────────────────────────────────────────────────────────┘
Behaviour:
<video> element with data attribute pointing to the Object ID is inserted at cursor positionAfter insertion (in XML editor):
<video>
<media-source value="object://abc-123-def"/>
<video-poster value="object://abc-123-def/poster"/>
<desc>Safety Demonstration Video</desc>
</video>
The editor renders this as a visual placeholder block showing the video title and a thumbnail (not a live player — full playback is in Preview).
When a topic containing a video reference is previewed, the video renders inline.
┌──────────────────────────────────────────────────────────────┐
│ TOPIC PREVIEW │
├──────────────────────────────────────────────────────────────┤
│ │
│ ## Step 3: Connect the Wiring Harness │
│ │
│ Route the harness through the left channel and │
│ secure with the provided clips. │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ▶ INLINE VIDEO PLAYER │ │
│ │ (Safety Demonstration Video) │ │
│ │ │ │
│ │ ──────────●───────────── 00:00 / 04:32 │ │
│ │ [CC ▾] [Lang: EN ▾] [⛶ Full] │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ Ensure the connector clicks into place before │
│ proceeding to the next step. │
│ │
└──────────────────────────────────────────────────────────────┘
Broken reference state:
┌────────────────────────────────────────────────────────────┐
│ ⚠ Video reference broken │
│ "Safety Demonstration Video" has been deleted/obsoleted. │
│ [Open referencing topic to fix] │
└────────────────────────────────────────────────────────────┘
Large video files require clear progress indication and early validation feedback.
Upload flow (in Properties panel or Object Authoring page):
Step 1: File selected
┌──────────────────────────────────────────────────────────┐
│ 📁 safety-demo.mp4 (142 MB) │
│ Validating format... │
└──────────────────────────────────────────────────────────┘
Step 2: Validation passed, upload in progress
┌──────────────────────────────────────────────────────────┐
│ 📁 safety-demo.mp4 (142 MB) │
│ ████████████░░░░░░░░░░░░░░ 45% 67 MB / 142 MB │
│ Estimated: ~2 min remaining │
│ [Cancel Upload] │
└──────────────────────────────────────────────────────────┘
Step 3: Upload complete, metadata extraction
┌──────────────────────────────────────────────────────────┐
│ ✓ safety-demo.mp4 uploaded successfully │
│ Extracting video metadata... │
│ Duration: 04:32 │ Resolution: 1920×1080 │ H.264 │
└──────────────────────────────────────────────────────────┘
Validation error examples:
┌──────────────────────────────────────────────────────────┐
│ ✗ Upload failed: Unsupported format │
│ "recording.avi" is not an accepted format. │
│ Accepted formats: MP4, WebM │
│ [Try Again] │
└──────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────┐
│ ✗ Upload failed: File too large │
│ "full-training.mp4" (4.2 GB) exceeds the maximum │
│ upload size of 2 GB for this workspace. │
│ [Try Again] │
└──────────────────────────────────────────────────────────┘
When a user progresses a Video Object to "Approved" or "Released" status and no subtitle/caption file exists for the source language, a non-blocking warning is shown (FR-019).
┌────────────────────────────────────────────────────────────┐
│ ⚠ Accessibility Notice [✕] │
├────────────────────────────────────────────────────────────┤
│ │
│ This video has no subtitle or caption file for the │
│ source language (EN). │
│ │
│ Videos without captions may not meet accessibility │
│ requirements for all audiences. │
│ │
│ [Add Subtitles Now] [Proceed Without Subtitles] │
│ │
└────────────────────────────────────────────────────────────┘
When a source video is updated to a new revision, all existing subtitles are flagged as stale (FR-009). The notification appears:
In Properties panel (Subtitles section):
┌──────────────────────────────────────────────────────────┐
│ ⚠ Source video updated — 2 subtitle files may be │
│ out of date and need review. │
│ │
│ Language │ File │ Status │ Actions │
│ DE │ de.srt │ ⚠ Needs Review │ ↓ ✏ 🗑 [✓ OK] │
│ FR │ fr.vtt │ ⚠ Needs Review │ ↓ ✏ 🗑 [✓ OK] │
└──────────────────────────────────────────────────────────┘
Route: /c/:customerId/ws/:workspaceId/object-types
The existing Object Types page is used to configure the "Video" object type. No new admin page is required.
┌──────────────────────────────────────────────────────────────────┐
│ HIERARCHY TREE │
│ ────────────── │
│ ▾ Document │
│ ├── DITA Topic │
│ ├── DITA Map │
│ └── Markdown │
│ ▾ Graphic │
│ ├── SVG │
│ └── Raster Image │
│ ▾ Video ← NEW ENTRY │
│ ├── Standard Video │
│ │ └── [Templates: Standard, Tutorial, Safety Demo] │
│ └── Animated Illustration │
│ └── [Templates: Short Loop, Explainer] │
│ ▸ Resource │
└──────────────────────────────────────────────────────────────────┘
Video type settings (when selected in tree):
┌──────────────────────────────────────────────────────────────┐
│ Video — Type Settings │
├──────────────────────────────────────────────────────────────┤
│ │
│ Accepted Formats: [✓ MP4] [✓ WebM] [☐ MOV] [☐ MKV] │
│ ← Workspace-configurable per FR-002 │
│ │
│ Maximum File Size: [2048 ] MB │
│ ← Workspace override (system default │
│ shown as placeholder) │
│ │
│ Subtitle Formats: [✓ SRT] [✓ VTT] │
│ │
│ Require Subtitles for Release: [☐] │
│ ← When checked, warning becomes blocking for Release only │
│ │
│ [Save Settings] │
│ │
└──────────────────────────────────────────────────────────────┘
Route: /c/:customerId/ws/:workspaceId/settings
A "Video" section is added to the existing Workspace Settings page.
┌──────────────────────────────────────────────────────────────┐
│ ── VIDEO SETTINGS ── │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Max Upload Size: [2048 ] MB │ │
│ │ System default: 2048 MB │ │
│ │ │ │
│ │ Accepted Video Formats: [MP4, WebM ] (editable) │ │
│ │ │ │
│ │ Accepted Subtitle Formats: [SRT, VTT ] (editable) │ │
│ │ │ │
│ │ [Save] │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
When a consumer views delivered content through the CDP that contains a video reference, they see:
┌──────────────────────────────────────────────────────────────┐
│ [Delivered Topic Content] │
├──────────────────────────────────────────────────────────────┤
│ │
│ Step 3: Connect the Wiring Harness │
│ │
│ Route the harness through the left channel... │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ ▶ VIDEO PLAYER │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ──────────────────────────── 00:00 / 04:32 │ │
│ │ [▶] [CC: English ▾] [Quality ▾] [⛶ Full] │ │
│ │ │ │
│ │ Available subtitles: EN │ DE │ FR │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ Ensure the connector clicks into place... │
│ │
└──────────────────────────────────────────────────────────────┘
Consumer interactions:
The CDP resolves which video to serve based on the consumer's language:
Consumer language = DE
1. Does a DE language variant with a dubbed video exist?
→ YES: Serve the DE video file
→ NO: Continue to step 2
2. Does the source video have DE subtitles?
→ YES: Serve the source (EN) video + DE subtitle track (auto-selected)
→ NO: Serve the source (EN) video with no subtitles pre-selected
This resolution is transparent to the consumer — they always see a playable video with the best available localization.
User in /authoring
→ Clicks "+ Create"
→ CreateObjectDialog: selects "Video" type, names it, selects folder
→ Clicks "Create" → Object created in Draft
→ Object selected in list → Properties panel loads
→ User sees "Video File" section with upload zone
→ Drags video file onto upload zone
→ Client validates: format check (MP4? ✓), size check (142MB < 2GB? ✓)
→ Upload begins → progress bar shown (45%... 67%... 100%)
→ Server extracts metadata (duration, resolution, codec)
→ Properties panel refreshes: file info card shown
→ Preview panel refreshes: video player ready
User selects video Object in Object List
→ Properties panel → Subtitles section
→ Clicks "+ Add Subtitle"
→ Subtitle Upload Dialog opens
→ Selects language: "German (DE)"
→ Browses/drops subtitle file: "de.srt"
→ Client validates syntax → results shown (✓ valid, ⚠ 1 timing overlap)
→ User clicks "Upload"
→ File stored as asset of DE language variant
→ Subtitles table refreshes: DE row shows "de.srt" with "Current" status
→ Preview panel: [CC] dropdown now includes "DE" option
User editing a DITA topic in Object Authoring (XML Editor)
→ Toolbar → "Insert Reference" → "Video"
→ Insert Video Reference dialog opens
→ Types search: "safety"
→ Results show: "Safety Demonstration Video" (Released, EN)
→ Selects it → Display mode: "Embedded player"
→ Clicks "Insert"
→ DITA <video> element inserted at cursor
→ Editor shows visual placeholder: [🎬 Safety Demonstration Video]
→ User switches to Preview tab
→ Preview renders inline video player at the reference position
Reviewer navigates to video Object in /authoring
→ Selects the video Object → Preview panel loads
→ Video player renders with poster frame
→ Reviewer clicks play → video plays
→ Clicks [CC ▾] → selects "DE" subtitles
→ German subtitles overlay on video
→ Reviewer switches [Language ▾] → selects "FR"
→ Player reloads with French dubbed video (if available)
→ OR: stays on source video, switches subtitle track to FR
→ Reviewer satisfied → navigates to Properties → progresses to "Approved"
→ No accessibility warning (subtitles exist) → status updated
Author checks out video Object
→ Uploads a new video revision (re-recorded safety demo)
→ System creates new revision
→ System flags all existing subtitles as "⚠ Needs Review"
→ Properties panel shows warning banner: "2 subtitle files may be out of date"
→ Author notifies translator (or handles via workflow)
→ Translator uploads updated DE subtitle file
→ DE row changes from "⚠ Needs Review" to "Current"
→ Author reviews FR subtitle, confirms still valid
→ Clicks [✓ OK] on FR row → status changes to "Current"
Content manager obsoletes a video Object
→ System scans for cross-references to this Object
→ Finds 3 topics referencing it
→ System flags broken references (FR-015)
→ In each referencing topic's Properties or Change History:
→ "⚠ 1 broken reference: video Object obsoleted"
→ Author opens topic → sees broken reference indicator in XML editor
→ Removes or replaces the video reference
→ Saves → broken reference warning clears
User opens search (Dashboard or any search-enabled panel)
→ Types: "safety"
→ Results include:
📄 Safety Procedures Manual (DITA Map)
🎬 Safety Demonstration Video (Video) ← Video object in results
📄 Safety Checklist (DITA Topic)
→ User applies filter: Type = "Video"
→ Results narrow to only video Objects:
🎬 Safety Demonstration Video
🎬 Safety Equipment Overview
Video management does not introduce new capabilities (per spec clarification). It reuses existing object-editing capabilities:
ErrorState component patternuseFetch / useMutate (no raw fetch)