fragment-tools 0.1.13 → 0.1.15

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 (184) hide show
  1. package/.prettierignore +1 -2
  2. package/.prettierrc +23 -7
  3. package/README.md +28 -9
  4. package/bin/index.js +70 -10
  5. package/package.json +14 -6
  6. package/src/cli/build.js +125 -0
  7. package/src/cli/create.js +238 -0
  8. package/src/cli/createConfig.js +82 -0
  9. package/src/cli/createFragmentFile.js +70 -0
  10. package/src/cli/getEntries.js +85 -0
  11. package/src/cli/log.js +36 -24
  12. package/src/cli/plugins/check-dependencies.js +88 -42
  13. package/src/cli/plugins/hot-shader-replacement.js +408 -0
  14. package/src/cli/plugins/hot-sketch-reload.js +21 -25
  15. package/src/cli/plugins/save.js +101 -0
  16. package/src/cli/preview.js +55 -0
  17. package/src/cli/prompts.js +260 -0
  18. package/src/cli/run.js +131 -0
  19. package/src/cli/templates/blank/index.js +33 -0
  20. package/src/cli/templates/blank/meta.json +4 -0
  21. package/src/cli/templates/default/index.js +39 -0
  22. package/src/cli/templates/default/meta.json +5 -0
  23. package/src/cli/templates/fragment-gl/index.js +37 -0
  24. package/src/cli/templates/fragment-gl/meta.json +4 -0
  25. package/src/cli/templates/p5/index.js +32 -0
  26. package/src/cli/templates/p5/meta.json +5 -0
  27. package/src/cli/templates/p5-webgl/fragment.fs +14 -0
  28. package/src/cli/templates/p5-webgl/index.js +67 -0
  29. package/src/cli/templates/p5-webgl/meta.json +5 -0
  30. package/src/cli/templates/three-fragment/fragment.fs +10 -0
  31. package/src/cli/templates/three-fragment/index.js +95 -0
  32. package/src/cli/templates/three-fragment/meta.json +5 -0
  33. package/src/cli/templates/three-orthographic/index.js +55 -0
  34. package/src/cli/templates/three-orthographic/meta.json +5 -0
  35. package/src/cli/templates/three-perspective/index.js +52 -0
  36. package/src/cli/templates/three-perspective/meta.json +5 -0
  37. package/src/cli/utils.js +70 -0
  38. package/src/cli/ws.js +87 -78
  39. package/src/client/app/App.svelte +3 -3
  40. package/src/client/app/client.js +55 -39
  41. package/src/client/app/components/IconCross.svelte +18 -18
  42. package/src/client/app/components/Init.svelte +40 -8
  43. package/src/client/app/components/KeyBinding.svelte +22 -22
  44. package/src/client/app/helpers.js +42 -0
  45. package/src/client/app/hooks.js +20 -0
  46. package/src/client/app/inputs/Input.js +9 -9
  47. package/src/client/app/inputs/Keyboard.js +13 -15
  48. package/src/client/app/inputs/MIDI.js +14 -15
  49. package/src/client/app/inputs/Mouse.js +1 -1
  50. package/src/client/app/inputs/Webcam.js +89 -88
  51. package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +41 -21
  52. package/src/client/app/lib/canvas-recorder/FrameRecorder.js +7 -6
  53. package/src/client/app/lib/canvas-recorder/H264Recorder.js +45 -0
  54. package/src/client/app/lib/canvas-recorder/MP4Recorder.js +7 -9
  55. package/src/client/app/lib/canvas-recorder/WebMRecorder.js +3 -4
  56. package/src/client/app/lib/canvas-recorder/mp4.js +1649 -15
  57. package/src/client/app/lib/canvas-recorder/utils.js +33 -17
  58. package/src/client/app/lib/gl/Geometry.js +11 -8
  59. package/src/client/app/lib/gl/Program.js +38 -19
  60. package/src/client/app/lib/gl/Renderer.js +163 -156
  61. package/src/client/app/lib/gl/Texture.js +113 -85
  62. package/src/client/app/lib/gl/index.js +12 -12
  63. package/src/client/app/lib/gl/utils.js +1 -3
  64. package/src/client/app/lib/helpers/frameDebounce.js +30 -30
  65. package/src/client/app/lib/loader/index.js +10 -10
  66. package/src/client/app/lib/loader/loadImage.js +15 -15
  67. package/src/client/app/lib/loader/loadScript.js +1 -1
  68. package/src/client/app/lib/paper-sizes.js +75 -76
  69. package/src/client/app/lib/presets.js +25 -5
  70. package/src/client/app/lib/tempo/Analyser.js +18 -17
  71. package/src/client/app/lib/tempo/Range.js +15 -12
  72. package/src/client/app/lib/tempo/index.js +34 -27
  73. package/src/client/app/modules/AudioAnalyser/Range.svelte +69 -72
  74. package/src/client/app/modules/AudioAnalyser/Spectrum.svelte +20 -19
  75. package/src/client/app/modules/AudioAnalyser.svelte +52 -35
  76. package/src/client/app/modules/Console/ConsoleLine.svelte +193 -172
  77. package/src/client/app/modules/Console.svelte +76 -74
  78. package/src/client/app/modules/Exports.svelte +62 -43
  79. package/src/client/app/modules/MidiPanel.svelte +100 -101
  80. package/src/client/app/modules/Monitor.svelte +57 -57
  81. package/src/client/app/modules/Params.svelte +128 -103
  82. package/src/client/app/renderers/2DRenderer.js +3 -3
  83. package/src/client/app/renderers/FragmentRenderer.js +30 -23
  84. package/src/client/app/renderers/P5GLRenderer.js +144 -0
  85. package/src/client/app/renderers/P5Renderer.js +10 -7
  86. package/src/client/app/renderers/THREERenderer.js +136 -94
  87. package/src/client/app/stores/audioAnalysis.js +3 -4
  88. package/src/client/app/stores/console.js +9 -10
  89. package/src/client/app/stores/errors.js +1 -1
  90. package/src/client/app/stores/exports.js +36 -20
  91. package/src/client/app/stores/index.js +2 -2
  92. package/src/client/app/stores/layout.js +143 -138
  93. package/src/client/app/stores/multisampling.js +4 -4
  94. package/src/client/app/stores/props.js +76 -13
  95. package/src/client/app/stores/renderers.js +26 -15
  96. package/src/client/app/stores/rendering.js +108 -89
  97. package/src/client/app/stores/sketches.js +7 -9
  98. package/src/client/app/stores/time.js +18 -18
  99. package/src/client/app/stores/utils.js +95 -38
  100. package/src/client/app/transitions/fade.js +3 -3
  101. package/src/client/app/transitions/index.js +6 -7
  102. package/src/client/app/transitions/splitX.js +2 -2
  103. package/src/client/app/transitions/splitY.js +2 -2
  104. package/src/client/app/triggers/Keyboard.js +88 -79
  105. package/src/client/app/triggers/MIDI.js +110 -84
  106. package/src/client/app/triggers/Mouse.js +73 -65
  107. package/src/client/app/triggers/Trigger.js +59 -58
  108. package/src/client/app/triggers/index.js +7 -7
  109. package/src/client/app/triggers/shared.js +5 -5
  110. package/src/client/app/ui/Build.svelte +70 -71
  111. package/src/client/app/ui/ErrorOverlay.svelte +118 -104
  112. package/src/client/app/ui/Field.svelte +393 -258
  113. package/src/client/app/ui/FieldGroup.svelte +106 -94
  114. package/src/client/app/ui/FieldSection.svelte +127 -116
  115. package/src/client/app/ui/FieldSpace.svelte +29 -30
  116. package/src/client/app/ui/FieldTrigger.svelte +256 -244
  117. package/src/client/app/ui/FieldTriggers.svelte +46 -46
  118. package/src/client/app/ui/FloatingParams.svelte +29 -30
  119. package/src/client/app/ui/Layout.svelte +31 -32
  120. package/src/client/app/ui/LayoutColumn.svelte +4 -4
  121. package/src/client/app/ui/LayoutComponent.svelte +239 -225
  122. package/src/client/app/ui/LayoutResizer.svelte +195 -176
  123. package/src/client/app/ui/LayoutRoot.svelte +6 -6
  124. package/src/client/app/ui/LayoutRow.svelte +4 -4
  125. package/src/client/app/ui/LayoutToolbar.svelte +191 -194
  126. package/src/client/app/ui/Module.svelte +134 -135
  127. package/src/client/app/ui/ModuleHeaderAction.svelte +81 -78
  128. package/src/client/app/ui/ModuleHeaderButton.svelte +12 -12
  129. package/src/client/app/ui/ModuleHeaderSelect.svelte +47 -37
  130. package/src/client/app/ui/ModuleRenderer.svelte +26 -27
  131. package/src/client/app/ui/OutputRenderer.svelte +112 -105
  132. package/src/client/app/ui/ParamsMultisampling.svelte +96 -95
  133. package/src/client/app/ui/ParamsOutput.svelte +130 -113
  134. package/src/client/app/ui/Preview.svelte +7 -8
  135. package/src/client/app/ui/SelectChevrons.svelte +27 -15
  136. package/src/client/app/ui/SketchRenderer.svelte +780 -667
  137. package/src/client/app/ui/SketchSelect.svelte +50 -44
  138. package/src/client/app/ui/fields/ButtonInput.svelte +61 -48
  139. package/src/client/app/ui/fields/CheckboxInput.svelte +67 -61
  140. package/src/client/app/ui/fields/ColorInput.svelte +294 -238
  141. package/src/client/app/ui/fields/FieldInputRow.svelte +8 -8
  142. package/src/client/app/ui/fields/ImageInput.svelte +123 -121
  143. package/src/client/app/ui/fields/Input.svelte +100 -111
  144. package/src/client/app/ui/fields/IntervalInput.svelte +268 -0
  145. package/src/client/app/ui/fields/ListInput.svelte +96 -96
  146. package/src/client/app/ui/fields/NumberInput.svelte +120 -116
  147. package/src/client/app/ui/fields/ProgressInput.svelte +99 -73
  148. package/src/client/app/ui/fields/Select.svelte +137 -124
  149. package/src/client/app/ui/fields/TextInput.svelte +10 -11
  150. package/src/client/app/ui/fields/VectorInput.svelte +86 -82
  151. package/src/client/app/utils/canvas.utils.js +189 -208
  152. package/src/client/app/utils/color.utils.js +138 -101
  153. package/src/client/app/utils/fields.utils.js +131 -0
  154. package/src/client/app/utils/file.utils.js +209 -37
  155. package/src/client/app/utils/glsl.utils.js +2 -2
  156. package/src/client/app/utils/glslErrors.js +49 -31
  157. package/src/client/app/utils/index.js +32 -29
  158. package/src/client/app/utils/math.utils.js +14 -10
  159. package/src/client/index.html +16 -16
  160. package/src/client/main.js +4 -4
  161. package/src/client/public/css/global.css +26 -16
  162. package/src/cli/db.js +0 -17
  163. package/src/cli/index.js +0 -198
  164. package/src/cli/plugins/db.js +0 -12
  165. package/src/cli/plugins/hot-shader-reload.js +0 -86
  166. package/src/cli/plugins/screenshot.js +0 -46
  167. package/src/cli/server.js +0 -153
  168. package/src/cli/templates/2d.js +0 -15
  169. package/src/cli/templates/blank.js +0 -13
  170. package/src/cli/templates/fragment.js +0 -18
  171. package/src/cli/templates/index.js +0 -27
  172. package/src/cli/templates/p5.js +0 -13
  173. package/src/cli/templates/three-fragment.js +0 -53
  174. package/src/cli/templates/three-orthographic.js +0 -23
  175. package/src/cli/templates/three-perspective.js +0 -20
  176. package/src/client/app/lib/canvas-recorder/FFMPEGRecorder.js +0 -56
  177. package/src/client/app/utils/props.utils.js +0 -51
  178. package/src/client/public/fonts/Inter-Bold.woff2 +0 -0
  179. package/src/client/public/fonts/Inter-Italic.woff2 +0 -0
  180. package/src/client/public/fonts/Inter-Regular.woff2 +0 -0
  181. package/src/client/public/fonts/Inter-SemiBold.woff2 +0 -0
  182. package/src/client/public/js/ffmpeg.min.js +0 -2
  183. package/src/client/public/js/ffmpeg.min.js.map +0 -1
  184. /package/src/cli/templates/{fragment.fs → fragment-gl/fragment.fs} +0 -0
@@ -2,236 +2,217 @@
2
2
  https://github.com/mattdesl/canvas-sketch/blob/24f6bb2bbdfdfd72a698a0b8a0962ad843fb7688/lib/save.js
3
3
  */
4
4
 
5
- import { changeDpiDataUrl } from "changedpi";
6
- import { get } from "svelte/store";
7
- import { exports } from "../stores";
8
- import { VIDEO_FORMATS } from "../stores/exports";
9
- import { downloadBlob, createBlobFromDataURL } from "./file.utils";
10
- import WebMRecorder from "../lib/canvas-recorder/WebMRecorder";
11
- import MP4Recorder from "../lib/canvas-recorder/MP4Recorder";
12
- import GIFRecorder from "../lib/canvas-recorder/GIFRecorder";
13
- import FrameRecorder from "../lib/canvas-recorder/FrameRecorder";
14
- import { exportCanvas } from "../lib/canvas-recorder/utils";
15
- import { map } from "./math.utils";
16
-
17
- export async function saveDataURL(dataURL, options, blob) {
18
- async function saveInBrowser() {
19
- if (!blob) {
20
- blob = await createBlobFromDataURL(dataURL);
21
- }
22
-
23
- await downloadBlob(blob, options);
24
- }
25
-
26
- async function onError(err) {
27
- if (typeof options.onError === "function") {
28
- options.onError(err);
29
- }
30
-
31
- await saveInBrowser();
32
- }
33
-
34
- try {
35
- if (__DEV__) {
36
- const body = {
37
- dataURL: dataURL.split(',')[1], // remove extension,
38
- ...options,
39
- };
40
- const response = await fetch('/save', {
41
- method: "POST",
42
- body: JSON.stringify(body),
43
- headers: {
44
- 'Accept': 'application/json',
45
- 'Content-Type': 'application/json'
46
- },
47
- });
48
- const { filepath, error } = await response.json();
49
-
50
- if (response.ok && filepath) {
51
- console.log(`[fragment] Saved ${filepath}`);
52
- } else {
53
- onError(error);
54
- }
55
- } else {
56
- await saveInBrowser();
57
- }
58
- } catch(error) {
59
- onError(error);
60
- }
61
- };
62
-
63
- export async function createDataURLFromBlob(blob) {
64
- return new Promise((resolve, reject) => {
65
- const reader = new FileReader();
66
-
67
- reader.onerror = (err) => {
68
- reject(err);
69
- };
70
-
71
- reader.onload = (e) => {
72
- resolve(e.target.result);
73
- };
5
+ import { get } from 'svelte/store';
6
+ import { exports } from '../stores';
7
+ import { VIDEO_FORMATS } from '../stores/exports';
8
+ import WebMRecorder from '../lib/canvas-recorder/WebMRecorder';
9
+ import MP4Recorder from '../lib/canvas-recorder/MP4Recorder';
10
+ import GIFRecorder from '../lib/canvas-recorder/GIFRecorder';
11
+ import FrameRecorder from '../lib/canvas-recorder/FrameRecorder';
12
+ import { exportCanvas } from '../lib/canvas-recorder/utils';
13
+ import { map } from './math.utils';
14
+ import { createDataURLFromBlob, saveFiles } from './file.utils';
74
15
 
75
- reader.readAsDataURL(blob);
76
- });
16
+ function getFilenameParams() {
17
+ const now = new Date();
18
+
19
+ const year = now.toLocaleString('default', { year: 'numeric' });
20
+ const month = now
21
+ .toLocaleString('default', { month: 'numeric' })
22
+ .padStart(2, `0`);
23
+ const day = now
24
+ .toLocaleString('default', { day: 'numeric' })
25
+ .padStart(2, '0');
26
+ const hours = now
27
+ .toLocaleString('default', { hour: 'numeric', hour12: false })
28
+ .split(' ')[0];
29
+ const minutes = now
30
+ .toLocaleString('default', { minute: 'numeric' })
31
+ .padStart(2, `0`);
32
+ const seconds = now
33
+ .toLocaleString('default', { second: 'numeric' })
34
+ .padStart(2, `0`);
35
+
36
+ const timestamp = `${year}.${month}.${day}-${hours}.${minutes}.${seconds}`;
37
+
38
+ return {
39
+ year,
40
+ month,
41
+ day,
42
+ hours,
43
+ minutes,
44
+ seconds,
45
+ timestamp,
46
+ };
77
47
  }
78
48
 
79
- export async function saveBlob(blob, options) {
80
- const dataURL = await createDataURLFromBlob(blob);
81
-
82
- return saveDataURL(dataURL, options, blob);
83
- };
49
+ export const defaultFilenamePattern = ({ index, filename, timestamp }) => {
50
+ let name = `${filename}.${timestamp}`;
84
51
 
85
- function getFilenameParams() {
86
- const now = new Date();
87
-
88
- const year = now.toLocaleString('default', { year: 'numeric' });
89
- const month = now.toLocaleString('default', { month: 'numeric' }).padStart(2, `0`);
90
- const day = now.toLocaleString('default', { day: 'numeric' });
91
- const hours = now.toLocaleString('default', { hour: 'numeric' }).split(' ')[0];
92
- const minutes = now.toLocaleString('default', { minute: 'numeric' }).padStart(2, `0`);
93
- const seconds = now.toLocaleString('default', { second: 'numeric' }).padStart(2, `0`);
94
-
95
- const timestamp = `${year}.${month}.${day}-${hours}.${minutes}.${seconds}`;
96
-
97
- return {
98
- year,
99
- month,
100
- day,
101
- hours,
102
- minutes,
103
- seconds,
104
- timestamp,
105
- };
106
- }
52
+ if (!isNaN(index)) {
53
+ name += `-${index}`;
54
+ }
107
55
 
108
- export const defaultFilenamePattern = ({
109
- filename,
110
- timestamp,
111
- }) => {
112
- return `${filename}.${timestamp}`;
56
+ return name;
113
57
  };
114
58
 
115
- export async function screenshotCanvas(canvas, {
116
- filename = "",
117
- pattern = defaultFilenamePattern,
118
- params = {},
119
- }) {
120
- const { imageEncoding, imageQuality, pixelsPerInch } = get(exports);
121
- let { extension, dataURL } = exportCanvas(canvas, {
122
- encoding: `image/${imageEncoding}`,
123
- encodingQuality: map(imageQuality, 1, 100, 0, 1),
124
- });
125
-
126
- let patternParams = getFilenameParams();
127
- let name = pattern({ filename, ...params, ...patternParams });
128
-
129
- if (imageEncoding !== "webp" && pixelsPerInch !== 72) {
130
- dataURL = changeDpiDataUrl(dataURL, pixelsPerInch);
131
- }
132
-
133
- await saveDataURL(dataURL, {
134
- filename: `${name}${extension}`,
135
- onError: () => {
136
- console.error(`[fragment] Error while saving screenshot.`);
137
- }
138
- });
59
+ /**
60
+ *
61
+ * @param {HTMLCanvasElement} canvas
62
+ * @param {string} sketchKey
63
+ * @param {Sketch} sketch
64
+ * @param {number} [index]
65
+ * @param {Promise<string[]>}
66
+ */
67
+ export async function screenshotCanvas(
68
+ canvas,
69
+ {
70
+ filename = '',
71
+ index,
72
+ pattern = defaultFilenamePattern,
73
+ exportDir,
74
+ params = {},
75
+ },
76
+ ) {
77
+ const { imageEncoding, imageQuality, pixelsPerInch } = get(exports);
78
+ let { extension, dataURL } = exportCanvas(canvas, {
79
+ encoding: `image/${imageEncoding}`,
80
+ encodingQuality: map(imageQuality, 1, 100, 0, 1),
81
+ pixelsPerInch,
82
+ });
83
+
84
+ let patternParams = getFilenameParams();
85
+ let name = pattern({ filename, index, ...params, ...patternParams });
86
+
87
+ const files = [
88
+ {
89
+ filename: `${name}${extension}`,
90
+ exportDir,
91
+ data: dataURL,
92
+ encoding: 'base64',
93
+ },
94
+ ];
95
+
96
+ try {
97
+ await saveFiles(files);
98
+ } catch (error) {
99
+ console.error(`[fragment] Error while saving screenshot.`);
100
+ console.log(error);
101
+ }
139
102
  }
140
103
 
141
104
  function recordCanvasWebM(canvas, options) {
142
- let recorder = new WebMRecorder(canvas, options);
143
- recorder.start();
105
+ let recorder = new WebMRecorder(canvas, options);
106
+ recorder.start();
144
107
 
145
- return recorder;
108
+ return recorder;
146
109
  }
147
110
 
148
111
  function recordCanvasMp4(canvas, options) {
149
- let recorder = new MP4Recorder(canvas, options);
150
- recorder.start();
112
+ let recorder = new MP4Recorder(canvas, options);
113
+ recorder.start();
151
114
 
152
- return recorder;
115
+ return recorder;
153
116
  }
154
117
 
155
118
  function recordCanvasGIF(canvas, options) {
156
- let recorder = new GIFRecorder(canvas, options);
157
- recorder.start();
119
+ let recorder = new GIFRecorder(canvas, options);
120
+ recorder.start();
158
121
 
159
- return recorder;
122
+ return recorder;
160
123
  }
161
124
 
162
125
  function recordCanvasFrames(canvas, options) {
163
- let recorder = new FrameRecorder(canvas, options);
164
- recorder.start();
126
+ let recorder = new FrameRecorder(canvas, options);
127
+ recorder.start();
165
128
 
166
- return recorder;
129
+ return recorder;
167
130
  }
168
131
 
169
- export function recordCanvas(canvas, {
170
- filename = 'output',
171
- format = 'mp4',
172
- framerate = 25,
173
- duration = Infinity,
174
- quality = 100,
175
- pattern = defaultFilenamePattern,
176
- imageEncoding,
177
- onStart = () => {},
178
- onTick = () => {},
179
- onComplete = () => {}
180
- } = {}) {
181
- let patternParams = getFilenameParams();
182
- let name = pattern({ filename, ...patternParams });
183
-
184
- function complete(result) {
185
- if (Array.isArray(result)) {
186
- const frmt = format === VIDEO_FORMATS.FRAMES ? imageEncoding : format;
187
-
188
- for (let i = 0; i < result.length; i++) {
189
- const index = `${i}`.padStart(`${result.length}`.length, '0');
190
- saveBlob(result[i], {
191
- filename: `${name}-${index}.${frmt}`,
192
- onError: () => {
193
- console.log(`[fragment] Error while saving record.`);
194
- }
195
- });
196
- }
197
- } else {
198
- saveBlob(result, {
199
- filename: `${name}.${format}`,
200
- onError: () => {
201
- console.log(`[fragment] Error while saving record.`);
202
- }
203
- });
204
- }
205
- onComplete();
206
- }
207
-
208
- const options = {
209
- framerate,
210
- duration,
211
- quality,
212
- onStart,
213
- onTick,
214
- onComplete: complete,
215
- };
216
-
217
- let recorder;
218
-
219
- if (format === VIDEO_FORMATS.WEBM) {
220
- recorder = recordCanvasWebM(canvas, options);
221
- } else if (format === VIDEO_FORMATS.MP4) {
222
- recorder = recordCanvasMp4(canvas, options);
223
- } else if (format === VIDEO_FORMATS.GIF) {
224
- recorder = recordCanvasGIF(canvas, options);
225
- } else if (format === VIDEO_FORMATS.FRAMES) {
226
- recorder = recordCanvasFrames(canvas, {
227
- ...options,
228
- imageEncoding,
229
- });
230
- }
231
-
232
- if (!recorder) {
233
- console.error(`Cannot find matching recorder`);
234
- }
235
-
236
- return recorder;
237
- };
132
+ export function recordCanvas(
133
+ canvas,
134
+ {
135
+ filename = 'output',
136
+ format = 'mp4',
137
+ framerate = 25,
138
+ duration = Infinity,
139
+ quality = 100,
140
+ pattern = defaultFilenamePattern,
141
+ exportDir,
142
+ imageEncoding,
143
+ onStart = () => {},
144
+ onTick = () => {},
145
+ onComplete = () => {},
146
+ params = {},
147
+ } = {},
148
+ ) {
149
+ let patternParams = getFilenameParams();
150
+ let name = pattern({ filename, ...patternParams });
151
+
152
+ async function complete(result) {
153
+ const files = [];
154
+
155
+ if (Array.isArray(result)) {
156
+ const frmt =
157
+ format === VIDEO_FORMATS.FRAMES ? imageEncoding : format;
158
+
159
+ for (let i = 0; i < result.length; i++) {
160
+ const index = `${i}`.padStart(`${result.length}`.length, '0');
161
+ const filename = `${name}-${index}.${frmt}`;
162
+ const blob = result[i];
163
+ const data = await createDataURLFromBlob(blob);
164
+
165
+ files.push({
166
+ filename,
167
+ data,
168
+ blob: exportDir,
169
+ encoding: 'base64',
170
+ });
171
+ }
172
+ } else {
173
+ const blob = result;
174
+ const data = await createDataURLFromBlob(blob);
175
+
176
+ files.push({
177
+ filename: `${name}.${format}`,
178
+ data,
179
+ blob,
180
+ encoding: 'base64',
181
+ exportDir,
182
+ });
183
+ }
184
+
185
+ await saveFiles(files);
186
+ onComplete();
187
+ }
188
+
189
+ const options = {
190
+ framerate,
191
+ duration,
192
+ quality,
193
+ onStart,
194
+ onTick,
195
+ onComplete: complete,
196
+ };
197
+
198
+ let recorder;
199
+
200
+ if (format === VIDEO_FORMATS.WEBM) {
201
+ recorder = recordCanvasWebM(canvas, options);
202
+ } else if (format === VIDEO_FORMATS.MP4) {
203
+ recorder = recordCanvasMp4(canvas, options);
204
+ } else if (format === VIDEO_FORMATS.GIF) {
205
+ recorder = recordCanvasGIF(canvas, options);
206
+ } else if (format === VIDEO_FORMATS.FRAMES) {
207
+ recorder = recordCanvasFrames(canvas, {
208
+ ...options,
209
+ imageEncoding,
210
+ });
211
+ }
212
+
213
+ if (!recorder) {
214
+ console.error(`Cannot find matching recorder`);
215
+ }
216
+
217
+ return recorder;
218
+ }