gooseworks 0.5.8 → 0.5.9-dev.53.c1bd6be2

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.
Files changed (69) hide show
  1. package/dist/kit/core/progress.d.ts +23 -3
  2. package/dist/kit/core/progress.d.ts.map +1 -1
  3. package/dist/kit/core/progress.js +62 -18
  4. package/dist/kit/core/progress.js.map +1 -1
  5. package/dist/kit/core/run.d.ts +5 -1
  6. package/dist/kit/core/run.d.ts.map +1 -1
  7. package/dist/kit/core/run.js +17 -4
  8. package/dist/kit/core/run.js.map +1 -1
  9. package/dist/kit/core/style.d.ts +1 -0
  10. package/dist/kit/core/style.d.ts.map +1 -1
  11. package/dist/kit/maker/cues.d.ts +67 -0
  12. package/dist/kit/maker/cues.d.ts.map +1 -0
  13. package/dist/kit/maker/cues.js +204 -0
  14. package/dist/kit/maker/cues.js.map +1 -0
  15. package/dist/kit/maker/encode.d.ts +5 -0
  16. package/dist/kit/maker/encode.d.ts.map +1 -1
  17. package/dist/kit/maker/encode.js +7 -1
  18. package/dist/kit/maker/encode.js.map +1 -1
  19. package/dist/kit/maker/facts.d.ts +46 -0
  20. package/dist/kit/maker/facts.d.ts.map +1 -0
  21. package/dist/kit/maker/facts.js +159 -0
  22. package/dist/kit/maker/facts.js.map +1 -0
  23. package/dist/kit/maker/inputs.d.ts +48 -3
  24. package/dist/kit/maker/inputs.d.ts.map +1 -1
  25. package/dist/kit/maker/inputs.js +151 -22
  26. package/dist/kit/maker/inputs.js.map +1 -1
  27. package/dist/kit/maker/make.d.ts +20 -1
  28. package/dist/kit/maker/make.d.ts.map +1 -1
  29. package/dist/kit/maker/make.js +125 -19
  30. package/dist/kit/maker/make.js.map +1 -1
  31. package/dist/kit/maker/page.d.ts.map +1 -1
  32. package/dist/kit/maker/page.js +49 -1
  33. package/dist/kit/maker/page.js.map +1 -1
  34. package/dist/kit/maker/parts/html-frames/1.2.0/part.json +1083 -0
  35. package/dist/kit/maker/parts/html-frames/src/part.d.ts.map +1 -1
  36. package/dist/kit/maker/parts/html-frames/src/part.js +4 -1
  37. package/dist/kit/maker/parts/html-frames/src/part.js.map +1 -1
  38. package/dist/kit/maker/runtime.d.ts.map +1 -1
  39. package/dist/kit/maker/runtime.js +54 -7
  40. package/dist/kit/maker/runtime.js.map +1 -1
  41. package/dist/kit/maker/timing.d.ts +74 -0
  42. package/dist/kit/maker/timing.d.ts.map +1 -0
  43. package/dist/kit/maker/timing.js +152 -0
  44. package/dist/kit/maker/timing.js.map +1 -0
  45. package/dist/kit/maker/under.d.ts +126 -0
  46. package/dist/kit/maker/under.d.ts.map +1 -0
  47. package/dist/kit/maker/under.js +299 -0
  48. package/dist/kit/maker/under.js.map +1 -0
  49. package/dist/skills/master-skill.d.ts +3 -3
  50. package/dist/skills/master-skill.d.ts.map +1 -1
  51. package/dist/skills/master-skill.js +20 -18
  52. package/dist/skills/master-skill.js.map +1 -1
  53. package/dist/skills/routes.js +2 -2
  54. package/dist/skills/routes.js.map +1 -1
  55. package/dist/skills/server-entry-skills.d.ts +6 -6
  56. package/dist/skills/server-entry-skills.d.ts.map +1 -1
  57. package/dist/skills/server-entry-skills.js +84 -55
  58. package/dist/skills/server-entry-skills.js.map +1 -1
  59. package/package.json +3 -3
  60. package/skills/goose-ads/SKILL.md +6 -6
  61. package/skills/goose-product-photos/SKILL.md +6 -6
  62. package/skills/goose-video/SKILL.md +29 -595
  63. package/skills/goose-video-local/SKILL.md +3 -1572
  64. package/skills/gooseworks/SKILL.md +6 -6
  65. package/skills/make-custom-video/SKILL.md +25 -672
  66. package/skills/manifest.json +7 -7
  67. package/skills/routes.json +1 -1
  68. package/dist/kit/maker/parts/html-frames/1.1.0/part.json +0 -199
  69. package/dist/skills/production-video-skills.json +0 -5
@@ -0,0 +1,67 @@
1
+ import type { KitTools } from '../part-interface';
2
+ /** The bundled UI sounds, as assets/sfx/<name>.wav in the part's folder. */
3
+ export declare const CUE_SOUNDS: readonly ["tick", "tap", "pop", "chime", "whoosh", "swoosh", "notify", "click"];
4
+ export type CueSound = (typeof CUE_SOUNDS)[number];
5
+ /** Sample rate of the bank and of the mix. */
6
+ export declare const CUE_RATE = 48000;
7
+ /** The mix never peaks above this (-1 dBFS); a louder mix is turned down as a whole. */
8
+ export declare const CUE_CEILING = 0.891;
9
+ /** One cue as the page marked it. */
10
+ export interface Cue {
11
+ sound: CueSound;
12
+ at_s: number;
13
+ gain: number;
14
+ max_s: number | null;
15
+ }
16
+ /** One cue as it was laid: the frame and sample it starts on. */
17
+ export interface PlacedCue extends Cue {
18
+ frame: number;
19
+ sample: number;
20
+ }
21
+ /** The cues in the page's start report. The page runtime already refused bad ones; this keeps only well-formed entries. */
22
+ export declare function cuesOf(report: unknown): Cue[];
23
+ /** PCM audio: one Float32Array per channel, samples in -1..1. */
24
+ export interface Pcm {
25
+ rate: number;
26
+ channels: Float32Array[];
27
+ }
28
+ /** Reads a 16-bit PCM WAV file (any chunk order; extra chunks skipped). */
29
+ export declare function readWav(data: Uint8Array): Pcm | null;
30
+ /** A bank sound as one channel, its leading silence stripped. */
31
+ export declare function bankSound(pcm: Pcm): Float32Array;
32
+ /** The sample a frame starts on. */
33
+ export declare function frameSample(frame: number, fps: number): number;
34
+ /**
35
+ * Lays every cue at the start of the first frame drawn at or after its time, on top of `bed`
36
+ * (stereo, at CUE_RATE) or silence, `frames / fps` seconds long. A cue is cut
37
+ * at max_s (with a short fade) and at the end of the video. When the mix would
38
+ * peak above CUE_CEILING it is turned down as a whole.
39
+ */
40
+ export declare function mixCues(opts: {
41
+ cues: Cue[];
42
+ bank: ReadonlyMap<CueSound, Float32Array>;
43
+ fps: number;
44
+ frames: number;
45
+ bed?: Float32Array[] | null;
46
+ }): {
47
+ channels: [Float32Array, Float32Array];
48
+ placed: PlacedCue[];
49
+ gain: number;
50
+ };
51
+ /** 16-bit PCM WAV bytes (no dither, so the same samples give the same bytes). */
52
+ export declare function wavBytes(channels: Float32Array[], rate?: number): Uint8Array;
53
+ /** The sound of the video drawn over, as 16-bit stereo PCM at CUE_RATE, as long as the picture. */
54
+ export declare function bedArgs(opts: {
55
+ under: string;
56
+ seconds: number;
57
+ out: string;
58
+ }): string[];
59
+ /** The finished picture (copied as it is) with the cue mix as its AAC track. */
60
+ export declare function muxArgs(opts: {
61
+ tools: Pick<KitTools, 'encodeArgs'>;
62
+ picture: string;
63
+ audio: string;
64
+ seconds: number;
65
+ out: string;
66
+ }): string[];
67
+ //# sourceMappingURL=cues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cues.d.ts","sourceRoot":"","sources":["../../../src/kit/maker/cues.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,4EAA4E;AAC5E,eAAO,MAAM,UAAU,iFAAkF,CAAC;AAE1G,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,8CAA8C;AAC9C,eAAO,MAAM,QAAQ,QAAS,CAAC;AAE/B,wFAAwF;AACxF,eAAO,MAAM,WAAW,QAAQ,CAAC;AAQjC,qCAAqC;AACrC,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,iEAAiE;AACjE,MAAM,WAAW,SAAU,SAAQ,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,2HAA2H;AAC3H,wBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG,EAAE,CAgB7C;AAED,iEAAiE;AACjE,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,GAAG,GAAG,IAAI,CAyBpD;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY,CAOhD;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAC5B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;CAC7B,GAAG;IAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAwChF;AAED,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,IAAI,GAAE,MAAiB,GAAG,UAAU,CA6BtF;AAED,mGAAmG;AACnG,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAWvF;AAED,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAa7I"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CUE_CEILING = exports.CUE_RATE = exports.CUE_SOUNDS = void 0;
4
+ exports.cuesOf = cuesOf;
5
+ exports.readWav = readWav;
6
+ exports.bankSound = bankSound;
7
+ exports.frameSample = frameSample;
8
+ exports.mixCues = mixCues;
9
+ exports.wavBytes = wavBytes;
10
+ exports.bedArgs = bedArgs;
11
+ exports.muxArgs = muxArgs;
12
+ /** The bundled UI sounds, as assets/sfx/<name>.wav in the part's folder. */
13
+ exports.CUE_SOUNDS = ['tick', 'tap', 'pop', 'chime', 'whoosh', 'swoosh', 'notify', 'click'];
14
+ /** Sample rate of the bank and of the mix. */
15
+ exports.CUE_RATE = 48_000;
16
+ /** The mix never peaks above this (-1 dBFS); a louder mix is turned down as a whole. */
17
+ exports.CUE_CEILING = 0.891;
18
+ /** A cue cut short by max_s fades out over this long, so the cut does not click. */
19
+ const CUT_FADE_S = 0.005;
20
+ /** A sample this quiet or quieter counts as silence when the bank's leading silence is stripped. */
21
+ const SILENCE = 1 / 2048;
22
+ function isSound(value) {
23
+ return typeof value === 'string' && exports.CUE_SOUNDS.includes(value);
24
+ }
25
+ /** The cues in the page's start report. The page runtime already refused bad ones; this keeps only well-formed entries. */
26
+ function cuesOf(report) {
27
+ const raw = report && typeof report === 'object' ? report.cues : undefined;
28
+ if (!Array.isArray(raw))
29
+ return [];
30
+ const cues = [];
31
+ for (const item of raw.slice(0, 500)) {
32
+ if (!item || typeof item !== 'object')
33
+ continue;
34
+ const { sound, at_s, gain, max_s } = item;
35
+ if (!isSound(sound) || typeof at_s !== 'number' || !Number.isFinite(at_s) || at_s < 0)
36
+ continue;
37
+ cues.push({
38
+ sound,
39
+ at_s,
40
+ gain: typeof gain === 'number' && Number.isFinite(gain) && gain >= 0 && gain <= 4 ? gain : 1,
41
+ max_s: typeof max_s === 'number' && Number.isFinite(max_s) && max_s > 0 && max_s <= 10 ? max_s : null,
42
+ });
43
+ }
44
+ return cues;
45
+ }
46
+ /** Reads a 16-bit PCM WAV file (any chunk order; extra chunks skipped). */
47
+ function readWav(data) {
48
+ if (data.length < 12)
49
+ return null;
50
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
51
+ const tag = (at) => String.fromCharCode(data[at], data[at + 1], data[at + 2], data[at + 3]);
52
+ if (tag(0) !== 'RIFF' || tag(8) !== 'WAVE')
53
+ return null;
54
+ let format = null;
55
+ let body = null;
56
+ for (let at = 12; at + 8 <= data.length;) {
57
+ const id = tag(at);
58
+ const size = view.getUint32(at + 4, true);
59
+ if (id === 'fmt ' && size >= 16) {
60
+ format = { code: view.getUint16(at + 8, true), channels: view.getUint16(at + 10, true), rate: view.getUint32(at + 12, true), bits: view.getUint16(at + 22, true) };
61
+ }
62
+ else if (id === 'data') {
63
+ body = { at: at + 8, size: Math.min(size, data.length - at - 8) };
64
+ }
65
+ at += 8 + size + (size % 2);
66
+ }
67
+ // 1 = PCM; 0xfffe = WAVE_FORMAT_EXTENSIBLE, which ffmpeg writes for some layouts (still 16-bit PCM here).
68
+ if (!format || !body || (format.code !== 1 && format.code !== 0xfffe) || format.bits !== 16 || format.channels < 1 || format.channels > 2)
69
+ return null;
70
+ const frames = Math.floor(body.size / (2 * format.channels));
71
+ const channels = Array.from({ length: format.channels }, () => new Float32Array(frames));
72
+ for (let i = 0; i < frames; i++) {
73
+ for (let c = 0; c < format.channels; c++)
74
+ channels[c][i] = view.getInt16(body.at + (i * format.channels + c) * 2, true) / 32768;
75
+ }
76
+ return { rate: format.rate, channels };
77
+ }
78
+ /** A bank sound as one channel, its leading silence stripped. */
79
+ function bankSound(pcm) {
80
+ const length = pcm.channels[0].length;
81
+ const mono = new Float32Array(length);
82
+ for (const channel of pcm.channels)
83
+ for (let i = 0; i < length; i++)
84
+ mono[i] += channel[i] / pcm.channels.length;
85
+ let start = 0;
86
+ while (start < length && Math.abs(mono[start]) <= SILENCE)
87
+ start++;
88
+ return mono.subarray(start);
89
+ }
90
+ /** The sample a frame starts on. */
91
+ function frameSample(frame, fps) {
92
+ return Math.round((frame * exports.CUE_RATE) / fps);
93
+ }
94
+ /**
95
+ * Lays every cue at the start of the first frame drawn at or after its time, on top of `bed`
96
+ * (stereo, at CUE_RATE) or silence, `frames / fps` seconds long. A cue is cut
97
+ * at max_s (with a short fade) and at the end of the video. When the mix would
98
+ * peak above CUE_CEILING it is turned down as a whole.
99
+ */
100
+ function mixCues(opts) {
101
+ const length = frameSample(opts.frames, opts.fps);
102
+ const left = new Float32Array(length);
103
+ const right = new Float32Array(length);
104
+ if (opts.bed && opts.bed.length) {
105
+ const l = opts.bed[0];
106
+ const r = opts.bed[1] ?? opts.bed[0];
107
+ left.set(l.subarray(0, Math.min(length, l.length)));
108
+ right.set(r.subarray(0, Math.min(length, r.length)));
109
+ }
110
+ const placed = [];
111
+ const fade = Math.max(1, Math.round(CUT_FADE_S * exports.CUE_RATE));
112
+ for (const cue of opts.cues) {
113
+ const sound = opts.bank.get(cue.sound);
114
+ if (!sound || !sound.length)
115
+ continue;
116
+ // The first frame drawn at or after at_s: where a change the page makes at at_s first shows.
117
+ // A little slack keeps a time written as a frame's start (0.1 at 30 fps) on that frame.
118
+ const frame = Math.min(opts.frames - 1, Math.max(0, Math.ceil(cue.at_s * opts.fps - 1e-6)));
119
+ const sample = frameSample(frame, opts.fps);
120
+ let take = Math.min(sound.length, length - sample);
121
+ const cut = cue.max_s !== null && Math.round(cue.max_s * exports.CUE_RATE) < take;
122
+ if (cut)
123
+ take = Math.round(cue.max_s * exports.CUE_RATE);
124
+ for (let i = 0; i < take; i++) {
125
+ const tail = take - i;
126
+ const v = sound[i] * cue.gain * (cut && tail <= fade ? tail / fade : 1);
127
+ left[sample + i] += v;
128
+ right[sample + i] += v;
129
+ }
130
+ placed.push({ ...cue, frame, sample });
131
+ }
132
+ let peak = 0;
133
+ for (let i = 0; i < length; i++)
134
+ peak = Math.max(peak, Math.abs(left[i]), Math.abs(right[i]));
135
+ const gain = peak > exports.CUE_CEILING ? exports.CUE_CEILING / peak : 1;
136
+ if (gain !== 1) {
137
+ for (let i = 0; i < length; i++) {
138
+ left[i] *= gain;
139
+ right[i] *= gain;
140
+ }
141
+ }
142
+ return { channels: [left, right], placed, gain };
143
+ }
144
+ /** 16-bit PCM WAV bytes (no dither, so the same samples give the same bytes). */
145
+ function wavBytes(channels, rate = exports.CUE_RATE) {
146
+ const frames = channels[0]?.length ?? 0;
147
+ const count = channels.length;
148
+ const size = frames * count * 2;
149
+ const data = new Uint8Array(44 + size);
150
+ const view = new DataView(data.buffer);
151
+ const put = (at, text) => {
152
+ for (let i = 0; i < 4; i++)
153
+ data[at + i] = text.charCodeAt(i);
154
+ };
155
+ put(0, 'RIFF');
156
+ view.setUint32(4, 36 + size, true);
157
+ put(8, 'WAVE');
158
+ put(12, 'fmt ');
159
+ view.setUint32(16, 16, true);
160
+ view.setUint16(20, 1, true);
161
+ view.setUint16(22, count, true);
162
+ view.setUint32(24, rate, true);
163
+ view.setUint32(28, rate * count * 2, true);
164
+ view.setUint16(32, count * 2, true);
165
+ view.setUint16(34, 16, true);
166
+ put(36, 'data');
167
+ view.setUint32(40, size, true);
168
+ for (let i = 0; i < frames; i++) {
169
+ for (let c = 0; c < count; c++) {
170
+ const v = Math.max(-1, Math.min(1, channels[c][i]));
171
+ view.setInt16(44 + (i * count + c) * 2, Math.round(v * 32767), true);
172
+ }
173
+ }
174
+ return data;
175
+ }
176
+ /** The sound of the video drawn over, as 16-bit stereo PCM at CUE_RATE, as long as the picture. */
177
+ function bedArgs(opts) {
178
+ return [
179
+ '-hide_banner', '-nostdin', '-loglevel', 'error', '-y',
180
+ '-i', opts.under,
181
+ '-map', '0:a:0', '-vn',
182
+ '-t', opts.seconds.toFixed(6),
183
+ '-ac', '2', '-ar', String(exports.CUE_RATE),
184
+ '-c:a', 'pcm_s16le',
185
+ '-fflags', '+bitexact', '-flags', '+bitexact', '-map_metadata', '-1',
186
+ opts.out,
187
+ ];
188
+ }
189
+ /** The finished picture (copied as it is) with the cue mix as its AAC track. */
190
+ function muxArgs(opts) {
191
+ return [
192
+ '-hide_banner', '-nostdin', '-loglevel', 'error', '-y',
193
+ '-i', opts.picture,
194
+ '-i', opts.audio,
195
+ '-map', '0:v:0', '-map', '1:a:0',
196
+ '-c:v', 'copy',
197
+ ...opts.tools.encodeArgs('aac'),
198
+ '-ac', '2',
199
+ '-t', opts.seconds.toFixed(6),
200
+ '-movflags', '+faststart',
201
+ opts.out,
202
+ ];
203
+ }
204
+ //# sourceMappingURL=cues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cues.js","sourceRoot":"","sources":["../../../src/kit/maker/cues.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,11 @@ import type { KitTools } from '../part-interface';
2
2
  /** Frames per segment: about 2 seconds at 30 fps. */
3
3
  export declare const SEGMENT_FRAMES = 60;
4
4
  export declare const FRAME_PATTERN = "f%06d.png";
5
+ /**
6
+ * The 1.2.0 size rule: every final H.264 encode caps its rate, appended right
7
+ * after the kit's h264-master settings, so a busy page cannot make a huge file.
8
+ */
9
+ export declare const MASTER_RATE_CAP: string[];
5
10
  export declare function frameName(index: number): string;
6
11
  /**
7
12
  * One segment of frames to H.264. The kit's encoder settings come first (they
@@ -1 +1 @@
1
- {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../../src/kit/maker/encode.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,qDAAqD;AACrD,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,MAAM,EAAE,CAgBX;AAED,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CASlE;AAED,4CAA4C;AAC5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIlF"}
1
+ {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../../src/kit/maker/encode.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,qDAAqD;AACrD,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,eAAe,UAAyC,CAAC;AAEtE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,MAAM,EAAE,CAiBX;AAED,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CASlE;AAED,4CAA4C;AAC5C,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIlF"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FRAME_PATTERN = exports.SEGMENT_FRAMES = void 0;
3
+ exports.MASTER_RATE_CAP = exports.FRAME_PATTERN = exports.SEGMENT_FRAMES = void 0;
4
4
  exports.frameName = frameName;
5
5
  exports.segmentArgs = segmentArgs;
6
6
  exports.concatList = concatList;
@@ -9,6 +9,11 @@ exports.pngSize = pngSize;
9
9
  /** Frames per segment: about 2 seconds at 30 fps. */
10
10
  exports.SEGMENT_FRAMES = 60;
11
11
  exports.FRAME_PATTERN = 'f%06d.png';
12
+ /**
13
+ * The 1.2.0 size rule: every final H.264 encode caps its rate, appended right
14
+ * after the kit's h264-master settings, so a busy page cannot make a huge file.
15
+ */
16
+ exports.MASTER_RATE_CAP = ['-maxrate', '16M', '-bufsize', '32M'];
12
17
  function frameName(index) {
13
18
  return `f${String(index).padStart(6, '0')}.png`;
14
19
  }
@@ -26,6 +31,7 @@ function segmentArgs(opts) {
26
31
  '-frames:v', String(opts.count),
27
32
  '-vf', 'scale=out_color_matrix=bt709:out_range=tv,format=yuv420p',
28
33
  ...opts.tools.encodeArgs('h264-master'),
34
+ ...exports.MASTER_RATE_CAP,
29
35
  '-c:v', 'libx264',
30
36
  '-pix_fmt', 'yuv420p',
31
37
  '-colorspace', 'bt709', '-color_primaries', 'bt709', '-color_trc', 'bt709', '-color_range', 'tv',
@@ -1 +1 @@
1
- {"version":3,"file":"encode.js","sourceRoot":"","sources":["../../../src/kit/maker/encode.ts"],"names":[],"mappings":";;;AAUA,8BAEC;AAOD,kCAuBC;AAGD,gCAEC;AAED,gCASC;AAGD,0BAIC;AA5DD,qDAAqD;AACxC,QAAA,cAAc,GAAG,EAAE,CAAC;AAEpB,QAAA,aAAa,GAAG,WAAW,CAAC;AAEzC,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,IAO3B;IACC,OAAO;QACL,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI;QACtD,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,qBAAa,EAAE;QAC1C,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,KAAK,EAAE,0DAA0D;QACjE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;QACvC,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;QACrB,aAAa,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI;QAChG,KAAK;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,GAAG;KACT,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,SAAgB,UAAU,CAAC,QAAkB;IAC3C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,SAAgB,UAAU,CAAC,QAAgB,EAAE,GAAW;IACtD,OAAO;QACL,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI;QACtD,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ;QAC5C,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI;QAC7C,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,SAAgB,OAAO,CAAC,IAAgB;IACtC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClH,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"encode.js","sourceRoot":"","sources":["../../../src/kit/maker/encode.ts"],"names":[],"mappings":";;;AAgBA,8BAEC;AAOD,kCAwBC;AAGD,gCAEC;AAED,gCASC;AAGD,0BAIC;AAnED,qDAAqD;AACxC,QAAA,cAAc,GAAG,EAAE,CAAC;AAEpB,QAAA,aAAa,GAAG,WAAW,CAAC;AAEzC;;;GAGG;AACU,QAAA,eAAe,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AAEtE,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,IAO3B;IACC,OAAO;QACL,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI;QACtD,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,qBAAa,EAAE;QAC1C,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,KAAK,EAAE,0DAA0D;QACjE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;QACvC,GAAG,uBAAe;QAClB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;QACrB,aAAa,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI;QAChG,KAAK;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,GAAG;KACT,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,SAAgB,UAAU,CAAC,QAAkB;IAC3C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,SAAgB,UAAU,CAAC,QAAgB,EAAE,GAAW;IACtD,OAAO;QACL,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI;QACtD,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ;QAC5C,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI;QAC7C,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,SAAgB,OAAO,CAAC,IAAgB;IACtC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClH,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;AACnE,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { KitTools } from '../part-interface';
2
+ import type { PictureGeometry } from './images';
3
+ /** A box as fractions (0..1) of the picture as shown. */
4
+ export interface SubjectBox {
5
+ x: number;
6
+ y: number;
7
+ w: number;
8
+ h: number;
9
+ /** The x-centre of the subject's top half: centre a bottle on this, not on its shadow. */
10
+ top_cx: number;
11
+ }
12
+ export interface PictureFacts {
13
+ /** More than 4% of the picture is see-through: a cutout. */
14
+ alpha: boolean;
15
+ /** The colour of an even, opaque border (a studio backdrop), as #rrggbb; null for a photo or a cutout. */
16
+ plate: string | null;
17
+ /** The most common foreground colour (not the plate, near-white or near-black), as #rrggbb; null when there is none. */
18
+ accent: string | null;
19
+ /** Mean brightness of the opaque pixels, 0 (black) to 1 (white). */
20
+ luminance: number;
21
+ /** Size of the picture as the page loads it, in pixels. */
22
+ width: number;
23
+ height: number;
24
+ /** Where the subject is, for a cutout or a picture on a plain backdrop; null for a photo. */
25
+ subject: SubjectBox | null;
26
+ }
27
+ /** The measuring copy is this many pixels on each side (stretched to a square: boxes come out as fractions). */
28
+ export declare const FACTS_SIZE = 128;
29
+ /**
30
+ * Facts from a square RGBA copy of the picture (`n` x `n`, as shown), and the
31
+ * size the page loads it at. Pure, so it is tested on hand-made pixels.
32
+ */
33
+ export declare function pictureFacts(rgba: Uint8Array, n: number, size: {
34
+ width: number;
35
+ height: number;
36
+ }): PictureFacts;
37
+ /**
38
+ * Measures one picture from its checked bytes with the kit's ffmpeg. `scratch`
39
+ * is a file path the RGBA copy is written to and removed from. Returns null
40
+ * when ffmpeg cannot read it; the page then has no facts for that picture.
41
+ */
42
+ export declare function measurePicture(tools: Pick<KitTools, 'exec'>, data: Uint8Array, shape: PictureGeometry, size: {
43
+ width: number;
44
+ height: number;
45
+ }, scratch: string): Promise<PictureFacts | null>;
46
+ //# sourceMappingURL=facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../../src/kit/maker/facts.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,0GAA0G;IAC1G,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wHAAwH;IACxH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,6FAA6F;IAC7F,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;CAC5B;AAED,gHAAgH;AAChH,eAAO,MAAM,UAAU,MAAM,CAAC;AAuB9B;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAuD/G;AAyCD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC7B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgB9B"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FACTS_SIZE = void 0;
4
+ exports.pictureFacts = pictureFacts;
5
+ exports.measurePicture = measurePicture;
6
+ // Picture facts (html-frames 1.2.0 `facts: true`): how each picture the page
7
+ // gets should be presented, measured here in Node because a file:// page may
8
+ // not read a picture's pixels (its canvas is tainted). A port of the app's
9
+ // hyperframe imageFacts (video-lab/blocks/hyperframe/images.ts) and its
10
+ // product palette, plus the subject box the old product renderers centred on.
11
+ // The kit's ffmpeg decodes a small RGBA copy, turned by the EXIF orientation as
12
+ // the browser shows it; the sums below run on those bytes. Bundled into the part.
13
+ const promises_1 = require("node:fs/promises");
14
+ /** The measuring copy is this many pixels on each side (stretched to a square: boxes come out as fractions). */
15
+ exports.FACTS_SIZE = 128;
16
+ /** Border width the plate is read from: 3 px of the app's 96, kept as a share. */
17
+ const BORDER = Math.max(1, Math.round((3 / 96) * exports.FACTS_SIZE));
18
+ /** ffmpeg filters that turn stored pixels the way each EXIF orientation shows them (as page.ts stages them). */
19
+ const ORIENT = {
20
+ 1: [],
21
+ 2: ['hflip'],
22
+ 3: ['hflip', 'vflip'],
23
+ 4: ['vflip'],
24
+ 5: ['transpose=0'],
25
+ 6: ['transpose=1'],
26
+ 7: ['transpose=3'],
27
+ 8: ['transpose=2'],
28
+ };
29
+ function hex(r, g, b) {
30
+ return '#' + [r, g, b].map((v) => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0')).join('');
31
+ }
32
+ const round = (value, places = 4) => Math.round(value * 10 ** places) / 10 ** places;
33
+ /**
34
+ * Facts from a square RGBA copy of the picture (`n` x `n`, as shown), and the
35
+ * size the page loads it at. Pure, so it is tested on hand-made pixels.
36
+ */
37
+ function pictureFacts(rgba, n, size) {
38
+ const at = (x, y) => (y * n + x) * 4;
39
+ let seeThrough = 0;
40
+ let lumSum = 0;
41
+ let lumCount = 0;
42
+ const border = [];
43
+ for (let y = 0; y < n; y++) {
44
+ for (let x = 0; x < n; x++) {
45
+ const i = at(x, y);
46
+ const a = rgba[i + 3];
47
+ if (a < 200)
48
+ seeThrough++;
49
+ if (a >= 128) {
50
+ lumSum += 0.2126 * rgba[i] + 0.7152 * rgba[i + 1] + 0.0722 * rgba[i + 2];
51
+ lumCount++;
52
+ }
53
+ if (x < BORDER || y < BORDER || x >= n - BORDER || y >= n - BORDER)
54
+ border.push([rgba[i], rgba[i + 1], rgba[i + 2], a]);
55
+ }
56
+ }
57
+ const alpha = seeThrough / (n * n) > 0.04;
58
+ const opaque = border.filter((p) => p[3] >= 200);
59
+ const avg = [0, 1, 2].map((k) => opaque.reduce((s, p) => s + p[k], 0) / Math.max(1, opaque.length));
60
+ const spread = Math.max(...[0, 1, 2].map((k) => Math.sqrt(opaque.reduce((s, p) => s + (p[k] - avg[k]) ** 2, 0) / Math.max(1, opaque.length))));
61
+ const even = !alpha && opaque.length > border.length * 0.9 && spread < 14;
62
+ const plate = even ? hex(avg[0], avg[1], avg[2]) : null;
63
+ // Foreground: opaque, away from the plate, not a white highlight or black.
64
+ const near = (i) => even && Math.abs(rgba[i] - avg[0]) + Math.abs(rgba[i + 1] - avg[1]) + Math.abs(rgba[i + 2] - avg[2]) < 40;
65
+ const buckets = new Map();
66
+ for (let i = 0; i < rgba.length; i += 4) {
67
+ const [r, g, b, a] = [rgba[i], rgba[i + 1], rgba[i + 2], rgba[i + 3]];
68
+ if (a < 200 || near(i))
69
+ continue;
70
+ const max = Math.max(r, g, b);
71
+ const min = Math.min(r, g, b);
72
+ if ((max > 238 && min > 225) || max < 22)
73
+ continue;
74
+ const key = ((r >> 5) << 6) | ((g >> 5) << 3) | (b >> 5);
75
+ const bucket = buckets.get(key) ?? { n: 0, r: 0, g: 0, b: 0 };
76
+ bucket.n++;
77
+ bucket.r += r;
78
+ bucket.g += g;
79
+ bucket.b += b;
80
+ buckets.set(key, bucket);
81
+ }
82
+ // Ties go to the lower bucket key, so the answer never depends on the order pixels were seen in.
83
+ const top = [...buckets.entries()].sort((a, b) => b[1].n - a[1].n || a[0] - b[0])[0]?.[1];
84
+ const accent = top && top.n >= n * n * 0.005 ? hex(top.r / top.n, top.g / top.n, top.b / top.n) : null;
85
+ return {
86
+ alpha,
87
+ plate,
88
+ accent,
89
+ luminance: round(lumCount ? lumSum / lumCount / 255 : 0, 3),
90
+ width: size.width,
91
+ height: size.height,
92
+ subject: alpha || even ? subjectOf(rgba, n, alpha ? (i) => rgba[i + 3] >= 128 : (i) => rgba[i + 3] >= 128 && !near(i)) : null,
93
+ };
94
+ }
95
+ /** The box of the subject's pixels; a lone pixel (JPEG noise on a backdrop) does not count. */
96
+ function subjectOf(rgba, n, inSubject) {
97
+ const mask = new Uint8Array(n * n);
98
+ for (let p = 0; p < n * n; p++)
99
+ mask[p] = inSubject(p * 4) ? 1 : 0;
100
+ const kept = (x, y) => {
101
+ const p = y * n + x;
102
+ if (!mask[p])
103
+ return false;
104
+ return (x > 0 && mask[p - 1] === 1) || (x < n - 1 && mask[p + 1] === 1) || (y > 0 && mask[p - n] === 1) || (y < n - 1 && mask[p + n] === 1);
105
+ };
106
+ let [x0, y0, x1, y1] = [n, n, -1, -1];
107
+ for (let y = 0; y < n; y++) {
108
+ for (let x = 0; x < n; x++) {
109
+ if (!kept(x, y))
110
+ continue;
111
+ x0 = Math.min(x0, x);
112
+ x1 = Math.max(x1, x);
113
+ y0 = Math.min(y0, y);
114
+ y1 = Math.max(y1, y);
115
+ }
116
+ }
117
+ if (x1 < 0)
118
+ return null;
119
+ // The top half of the subject's rows: its own left and right edges give the centre.
120
+ const half = y0 + Math.max(1, Math.ceil((y1 - y0 + 1) / 2));
121
+ let [tx0, tx1] = [n, -1];
122
+ for (let y = y0; y < half; y++) {
123
+ for (let x = 0; x < n; x++) {
124
+ if (!kept(x, y))
125
+ continue;
126
+ tx0 = Math.min(tx0, x);
127
+ tx1 = Math.max(tx1, x);
128
+ }
129
+ }
130
+ return {
131
+ x: round(x0 / n),
132
+ y: round(y0 / n),
133
+ w: round((x1 + 1 - x0) / n),
134
+ h: round((y1 + 1 - y0) / n),
135
+ top_cx: round(tx1 < 0 ? (x0 + x1 + 1) / 2 / n : (tx0 + tx1 + 1) / 2 / n),
136
+ };
137
+ }
138
+ /**
139
+ * Measures one picture from its checked bytes with the kit's ffmpeg. `scratch`
140
+ * is a file path the RGBA copy is written to and removed from. Returns null
141
+ * when ffmpeg cannot read it; the page then has no facts for that picture.
142
+ */
143
+ async function measurePicture(tools, data, shape, size, scratch) {
144
+ const filters = [...ORIENT[shape.orientation], 'format=rgba', `scale=${exports.FACTS_SIZE}:${exports.FACTS_SIZE}:flags=area`, 'setsar=1', 'format=rgba'];
145
+ try {
146
+ await tools.exec('ffmpeg', ['-hide_banner', '-y', '-loglevel', 'error', '-noautorotate', '-f', `${shape.format}_pipe`, '-i', 'pipe:0', '-frames:v', '1', '-vf', filters.join(','), '-f', 'rawvideo', '-pix_fmt', 'rgba', '-threads', '1', scratch], { stdin: data });
147
+ const rgba = await (0, promises_1.readFile)(scratch);
148
+ if (rgba.length !== exports.FACTS_SIZE * exports.FACTS_SIZE * 4)
149
+ return null;
150
+ return pictureFacts(rgba, exports.FACTS_SIZE, size);
151
+ }
152
+ catch {
153
+ return null;
154
+ }
155
+ finally {
156
+ await (0, promises_1.rm)(scratch, { force: true }).catch(() => undefined);
157
+ }
158
+ }
159
+ //# sourceMappingURL=facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.js","sourceRoot":"","sources":["../../../src/kit/maker/facts.ts"],"names":[],"mappings":"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"}