Files
euzuandGitHub 91f6c57159 Fix/merge live and vod recording (#876)
feat(dvr)!: unify live and VOD/series recording into one recoverable DVR

Merge fix/merge_live_and_vod_recording into develop.

- One recording queue for scheduled live captures and VOD/series transfers,
  with a shared transition graph, provider-slot scheduling, resumable HTTP
  transfers (strong ETag / Last-Modified validation) and ffmpeg live capture.
- Crash-recoverable persistence: B+Tree repository with a journal-first
  recovery history; one file can be shared by several library entries.
- Admission checks quota and disk on request, at transfer start (real size)
  and before an entry attaches to a finished file; idempotent requests.
- REST is command-only; state reaches clients via owner-filtered WebSocket
  snapshots.
- Deleting a recording removes the file once no entry holds it; removing an
  entry keeps a finished file and cleans up orphaned partials.
- User ids derive from the configured username (web:/api:); the identity
  registry is gone.
- Spanish locale added; ru/ar completed; locale parity test.

BREAKING CHANGE: `video.download` is now `video.recording` (nested
`recording` keys move up, `download_priority`/`recording_priority` become
`priority`); old configs fail to load with a migration hint.
BREAKING CHANGE: `/api/v1/file/download*` and `/file/record` are removed in
favour of `/api/v1/recording/*`.
BREAKING CHANGE: `download.*` and `recording.write` permissions are replaced
by `recording.read|create|manage|delete`; tokens from before the change must
re-authenticate.
BREAKING CHANGE: the old recording queue does not migrate; existing
`identity_registry.json` is ignored.
2026-10-04 16:02:55 +02:00

66 lines
2.0 KiB
SCSS

// Task-state pill, shared by the DVR library and the transfer views.
//
// The four families map to what the state means to the user rather than
// giving every variant its own hue: pending, in flight, finished, and
// gone. Colours come from existing theme tokens, so a theme that
// redefines them redefines these too, and every one keeps a border as
// well as a fill so the state survives a colour-blind palette.
.tp__task-status {
display: inline-flex;
align-items: center;
justify-content: center;
white-space: nowrap;
padding: var(--padding-micro) var(--padding-mini);
border-radius: var(--tag-border-radius);
border: 1px solid var(--border-color);
color: var(--modest-text-color);
background-color: transparent;
font-size: var(--font-size-sm);
&--pending {
color: var(--tag-status-pending-color);
background-color: var(--tag-status-pending-background-color);
border-color: var(--tag-status-pending-border-color);
}
&--waiting {
color: var(--warn-color);
background-color: var(--warn-background-color);
border-color: var(--warn-color);
}
// In flight. Given the strongest contrast: it is the state an
// operator scans a long list for.
&--active {
color: var(--active-color);
background-color: var(--success-background-color);
border-color: var(--active-color);
font-weight: bold;
}
&--paused {
color: var(--modest-text-color);
border-color: var(--modest-text-color);
}
&--done {
color: var(--success-color);
background-color: var(--success-background-color);
border-color: var(--ok-color);
}
&--failed {
color: var(--error-color);
background-color: var(--error-background-color);
border-color: var(--error-color);
}
&--cancelled {
color: var(--modest-text-color);
border-color: var(--border-color);
// Struck through so a cancelled task reads as gone even where the
// colour difference from `--paused` is subtle.
text-decoration: line-through;
}
}