fix(clip): a clip is held to its owner's storage cap, and its limits and failures say the server's truth
- The cut file is measured against what its owner has left, for a YouTube range (whose fetch never reads yt-dlp's size ceiling) and for a Plex clip (which fetches nothing), before the fetch and again before it is placed; a refusal leaves the asset pending for a Retry. - A silent Plex file is cut silent; a file the probe cannot read says so. - A second job on a failed or renamed clip gets the same YouTube diagnosis and the fetched title. - The "too long" refusal names the server's cap; a contract test holds the client's copies of the clip limits to clip.py; the shipped player clients are pinned against the installed yt-dlp. - One HDR transfer set and one rating_key lookup; job status words from JobStatus; the display-name guard sees subscript writes and the clip route; stale comments and types follow the clip job.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
// The range an ad-hoc clip is cut from, marked in a player: the rules the clip panel's handles, its
|
||||
// In / Out fields and the players' `[` / `]` keys all go by, so every way of marking keeps a range the
|
||||
// server takes (backend downloads/clip.py: at least MIN_CLIP_S, at most MAX_CLIP_S — the owner's cap).
|
||||
// server takes (backend downloads/clip.py: at least MIN_CLIP_S, at most MAX_CLIP_S — the owner's cap;
|
||||
// clipLimits.contract.test.ts holds the two copies equal).
|
||||
|
||||
const MIN_CLIP_S = 1;
|
||||
export const MAX_CLIP_S = 600;
|
||||
@@ -53,3 +54,13 @@ export function zoomWindow(r: ClipRange, duration: number): { from: number; to:
|
||||
const pad = Math.max(5, (r.end - r.start) * 0.25);
|
||||
return { from: Math.max(0, r.start - pad), to: Math.min(duration, r.end + pad) };
|
||||
}
|
||||
|
||||
/** The `[` key: In at the playhead `t`, opening a range there when none is marked yet. */
|
||||
export function markInAt(r: ClipRange | null, t: number, duration: number): ClipRange {
|
||||
return markIn(r ?? openAt(t, duration), t, duration);
|
||||
}
|
||||
|
||||
/** The `]` key: Out at the playhead `t`; with no range yet, one that ENDS there. */
|
||||
export function markOutAt(r: ClipRange | null, t: number, duration: number): ClipRange {
|
||||
return markOut(r ?? openAt(Math.max(0, t - DEFAULT_CLIP_S), duration), t, duration);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user