@gentbajko/slopify 3.25.7 → 3.25.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ # Slopify 3.25.8
2
+
3
+ Released 17 October 2026.
4
+
5
+ - **Older projects' shorts follow a changed narration.** On a project made before Slopify kept track of each short's render, saving it again after levelling or softening the narration kept the old shorts as if they were current. Their renders now read out of date and are made again on this computer, with nothing paid.
@@ -0,0 +1,5 @@
1
+ # Slopify 3.25.9
2
+
3
+ Released 17 October 2026.
4
+
5
+ - **An older project's shorts render again.** Remaking the shorts of a project made before an earlier change to how Slopify recognises finished work failed with "The clip this short was cut from is no longer among the picked shorts". The shorts now render from the moments already picked.
@@ -1,4 +1,16 @@
1
1
  [
2
+ {
3
+ "id": "3.25.9",
4
+ "title": "Slopify 3.25.9",
5
+ "version": "3.25.9",
6
+ "date": "2026-10-17"
7
+ },
8
+ {
9
+ "id": "3.25.8",
10
+ "title": "Slopify 3.25.8",
11
+ "version": "3.25.8",
12
+ "date": "2026-10-17"
13
+ },
2
14
  {
3
15
  "id": "3.25.7",
4
16
  "title": "Slopify 3.25.7",
@@ -216,8 +216,8 @@ function planEdit(base, edit, prepared, inspected, keeping) {
216
216
  const fingerprints = Object.fromEntries(desired.map((row) => [row.key, row.fingerprint]));
217
217
  const outputs = proposedManifest.outputs.map((row) => {
218
218
  const next = desired.find((value) => value.key === row.workKey);
219
- const unchanged = next !== undefined &&
220
- old.find((value) => value.key === row.workKey)?.fingerprint === next.fingerprint;
219
+ const before = old.find((value) => value.key === row.workKey)?.fingerprint;
220
+ const unchanged = next !== undefined && before === next.fingerprint && !staleRender(base, row, before);
221
221
  const state = next === undefined
222
222
  ? row.state
223
223
  : prepared.outputs.includes(row) || (unchanged && row.state === "ready")
@@ -248,6 +248,15 @@ function planEdit(base, edit, prepared, inspected, keeping) {
248
248
  shortMoves: [...moves.entries()],
249
249
  };
250
250
  }
251
+ // A render a version from an older Slopify never recorded, made for another recipe than the
252
+ // one the version asks for: its narration was changed (levelled or softened) since, and saving
253
+ // the version again must not take the old file for the new render. Only renders: they are made
254
+ // on this computer and nothing paid is made from them.
255
+ function staleRender(base, row, before) {
256
+ return ((row.workKey === "export:video" || /^shorts:\d+:render$/.test(row.workKey)) &&
257
+ base.revision.fingerprints[row.workKey] === undefined &&
258
+ row.fingerprint !== before);
259
+ }
251
260
  function normalizeImages(content) {
252
261
  return {
253
262
  ...content,
@@ -317,12 +317,16 @@ async function render(deps, context, piece, snapshot, clip) {
317
317
  }
318
318
  // The clips the pick saved for this plan, with any range set by hand in place: the
319
319
  // selected pick whose fingerprint is the one the plan asks for.
320
- function savedClips(snapshot) {
320
+ export function savedClips(snapshot) {
321
321
  const recipe = snapshot.plan.recipes.find((one) => one.key === shortsPickKey);
322
- const row = snapshot.view.pieces.find((one) => one.key === shortsPickKey &&
323
- one.selected &&
324
- one.piece.state === "done" &&
325
- one.fingerprint === recipe?.fingerprint);
322
+ const done = snapshot.view.pieces.filter((one) => one.key === shortsPickKey && one.selected && one.piece.state === "done");
323
+ // A project from before an older fingerprint scheme keeps its pick under another
324
+ // fingerprint; the plan planned its clips from the version's one selected pick
325
+ // (`savedPicked` in `recipe-shorts.ts`), so the clips are that pick's.
326
+ const row = done.find((one) => one.fingerprint === recipe?.fingerprint) ??
327
+ (done.length === 1 && snapshot.plan.recipes.some((one) => /^shorts:\d+:/.test(one.key))
328
+ ? done[0]
329
+ : undefined);
326
330
  const picked = pickedShortsOf(row?.piece.payload);
327
331
  const shorts = snapshot.view.revision.config.shorts;
328
332
  if (picked === undefined || recipe === undefined || shorts === undefined)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gentbajko/slopify",
3
- "version": "3.25.7",
3
+ "version": "3.25.9",
4
4
  "description": "Turn a prompt into a finished video, locally, with your own provider keys",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Gent Bajko",