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:
@@ -170,10 +170,11 @@ const youtubeReasons = [
|
||||
backend("youtube/client.py").match(/^YouTubeRefusal = Literal\[([^\]]*)\]/m)?.[1] ?? ""
|
||||
).matchAll(/"(\w+)"/g),
|
||||
].map((m) => m[1]!);
|
||||
// A clip the server will not cut → `clip.errors.<reason>`: every `ClipError("<reason>")` in the backend.
|
||||
// A clip the server will not cut → `clip.errors.<reason>`: every `ClipError("<reason>"…)` in the backend
|
||||
// (a reason may carry its numbers after it: `ClipError("too_long", limit_s=…)`).
|
||||
const clipReasons = [
|
||||
...new Set(
|
||||
appSources().flatMap((src) => [...src.matchAll(/ClipError\("(\w+)"\)/g)].map((m) => m[1]!)),
|
||||
appSources().flatMap((src) => [...src.matchAll(/ClipError\("(\w+)"[,)]/g)].map((m) => m[1]!)),
|
||||
),
|
||||
];
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"bad_source": "This video can’t be clipped.",
|
||||
"bad_range": "The clip’s start or end isn’t valid.",
|
||||
"too_short": "A clip is at least a second long.",
|
||||
"too_long": "A clip is at most 10 minutes long.",
|
||||
"too_long": "A clip is at most {{minutes}} minutes long.",
|
||||
"bad_audio": "That audio track isn’t available.",
|
||||
"bad_crop": "The crop frame isn’t valid. Make it bigger, or go back to the whole picture.",
|
||||
"not_found": "This item is no longer in the library.",
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"bad_source": "Ebből a videóból nem lehet klipet vágni.",
|
||||
"bad_range": "A klip eleje vagy vége érvénytelen.",
|
||||
"too_short": "A klip legalább egy másodperc.",
|
||||
"too_long": "A klip legfeljebb 10 perc lehet.",
|
||||
"too_long": "A klip legfeljebb {{minutes}} perc lehet.",
|
||||
"bad_audio": "Ez a hangsáv nem érhető el.",
|
||||
"bad_crop": "A kivágókeret érvénytelen. Nagyítsd meg, vagy térj vissza a teljes képre.",
|
||||
"not_found": "Ez az elem már nincs a könyvtárban.",
|
||||
|
||||
Reference in New Issue
Block a user