@gentbajko/slopify 3.25.2 → 3.25.3
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.
- package/dist/extension/slopify-studio-chrome.zip +0 -0
- package/dist/extension/slopify-studio-firefox.zip +0 -0
- package/dist/patch-notes/3.25.3.md +5 -0
- package/dist/patch-notes/index.json +6 -0
- package/dist/slices/rebuild/recipe-exports.js +11 -3
- package/dist/slices/rebuild/recipe-softening.js +20 -12
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Slopify 3.25.3
|
|
2
|
+
|
|
3
|
+
Released 17 October 2026.
|
|
4
|
+
|
|
5
|
+
- **Older projects keep their description and shorts when you turn softening on.** A project made before late September still asked for its YouTube description and shorts' pick again when Soften breaths or Soften S sounds was turned on. It now keeps them, like newer projects.
|
|
@@ -53,9 +53,17 @@ unsoftened = () => []) {
|
|
|
53
53
|
}, audio.keys);
|
|
54
54
|
const timedNow = timed ? timingOf(audio.timeline) : undefined;
|
|
55
55
|
// A finished timing made before the narration was softened is kept: softening moves no word.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
// A timing is finished when a done piece or an output of it has the fingerprint (a project
|
|
57
|
+
// from before an older fingerprint scheme carries different ones on the two).
|
|
58
|
+
const doneTiming = (fingerprint) => {
|
|
59
|
+
const past = context.history ?? context.manifest;
|
|
60
|
+
return (past.pieces.some((row) => row.key === "subtitles:timing" &&
|
|
61
|
+
row.piece.state === "done" &&
|
|
62
|
+
row.fingerprint === fingerprint) ||
|
|
63
|
+
past.outputs.some((row) => row.workKey === "subtitles:timing" &&
|
|
64
|
+
row.fingerprint === fingerprint &&
|
|
65
|
+
(row.state === "ready" || row.state === "outdated")));
|
|
66
|
+
};
|
|
59
67
|
const timing = timedNow === undefined || doneTiming(timedNow.fingerprint)
|
|
60
68
|
? timedNow
|
|
61
69
|
: (unsoftened()
|
|
@@ -23,19 +23,27 @@ export function unsoftenedTimelines(context, text) {
|
|
|
23
23
|
const entries = plain.timeline;
|
|
24
24
|
const timeline = entries.map((entry, at) => {
|
|
25
25
|
const key = plain.keys[at];
|
|
26
|
-
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
// Found by its fingerprint, as an output or as the finished piece that made it: once the
|
|
27
|
+
// softened version is saved, the join it will make again is marked outdated, and on a
|
|
28
|
+
// project from before an older fingerprint scheme its outputs carry another fingerprint
|
|
29
|
+
// than its pieces.
|
|
30
|
+
const fingerprint = entry.audio[0];
|
|
31
|
+
const output = past.outputs.find((row) => row.workKey === key &&
|
|
32
|
+
row.fingerprint === fingerprint &&
|
|
31
33
|
(row.state === "ready" || row.state === "outdated"));
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
const piece = past.pieces.find((row) => row.key === key &&
|
|
35
|
+
row.fingerprint === fingerprint &&
|
|
36
|
+
row.piece.state === "done" &&
|
|
37
|
+
row.assetId !== null);
|
|
38
|
+
const assetId = output?.assetId ?? piece?.assetId ?? undefined;
|
|
39
|
+
if (assetId === undefined || assetId === null)
|
|
40
|
+
return undefined;
|
|
41
|
+
const made = output ?? past.outputs.find((row) => row.workKey === key && row.assetId === assetId);
|
|
42
|
+
return {
|
|
43
|
+
audio: [fingerprint, assetId],
|
|
44
|
+
transcript: entry.transcript,
|
|
45
|
+
durationMs: made?.output.durationMs ?? null,
|
|
46
|
+
};
|
|
39
47
|
});
|
|
40
48
|
return timeline.every((entry) => entry !== undefined) && timeline.length > 0 ? [timeline] : [];
|
|
41
49
|
});
|