mirror of
https://github.com/euzu/tuliprox.git
synced 2026-10-11 18:32:24 +02:00
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.
66 lines
2.0 KiB
SCSS
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;
|
|
}
|
|
}
|