@editframe/elements 0.7.0-beta.8 → 0.8.0-beta.1

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 (121) hide show
  1. package/dist/EF_INTERACTIVE.d.ts +1 -0
  2. package/dist/{lib/av → assets/dist}/EncodedAsset.js +1 -1
  3. package/dist/{packages/elements/src/elements → elements}/EFAudio.d.ts +2 -2
  4. package/dist/{packages/elements/src/elements → elements}/EFCaptions.d.ts +5 -5
  5. package/dist/{packages/elements/src/elements → elements}/EFImage.d.ts +3 -3
  6. package/dist/{packages/elements/src/elements → elements}/EFMedia.d.ts +4 -4
  7. package/dist/{packages/elements/src/elements → elements}/EFTemporal.d.ts +1 -1
  8. package/dist/{packages/elements/src/elements → elements}/EFTimegroup.browsertest.d.ts +1 -1
  9. package/dist/{packages/elements/src/elements → elements}/EFTimegroup.d.ts +3 -3
  10. package/dist/{packages/elements/src/elements → elements}/EFVideo.d.ts +3 -3
  11. package/dist/{packages/elements/src/elements → elements}/EFWaveform.d.ts +3 -3
  12. package/dist/{packages/elements/src/elements → elements}/TimegroupController.d.ts +1 -1
  13. package/dist/{packages/elements → elements}/src/EF_FRAMEGEN.js +4 -3
  14. package/dist/elements/src/EF_INTERACTIVE.js +7 -0
  15. package/dist/{packages/elements → elements}/src/elements/EFCaptions.js +5 -5
  16. package/dist/{packages/elements → elements}/src/elements/EFMedia.js +6 -3
  17. package/dist/{packages/elements → elements}/src/elements/EFSourceMixin.js +1 -1
  18. package/dist/{packages/elements → elements}/src/elements/EFTemporal.js +37 -2
  19. package/dist/{packages/elements → elements}/src/elements/EFTimegroup.js +4 -2
  20. package/dist/{packages/elements → elements}/src/elements/FetchMixin.js +1 -1
  21. package/dist/elements/src/gui/ContextMixin.js +234 -0
  22. package/dist/{packages/elements → elements}/src/gui/EFFilmstrip.js +30 -134
  23. package/dist/elements/src/gui/EFPreview.js +45 -0
  24. package/dist/{packages/elements → elements}/src/gui/EFWorkbench.js +6 -93
  25. package/dist/{packages/elements → elements}/src/gui/TWMixin.js +10 -2
  26. package/dist/elements/src/gui/apiHostContext.js +5 -0
  27. package/dist/elements/src/gui/fetchContext.js +5 -0
  28. package/dist/elements/src/gui/focusContext.js +5 -0
  29. package/dist/elements/src/gui/focusedElementContext.js +7 -0
  30. package/dist/elements/src/gui/playingContext.js +5 -0
  31. package/dist/{packages/elements → elements}/src/index.js +5 -1
  32. package/dist/{packages/elements/src/elements → elements}/util.d.ts +1 -1
  33. package/dist/gui/ContextMixin.d.ts +23 -0
  34. package/dist/{packages/elements/src/gui → gui}/EFFilmstrip.d.ts +12 -15
  35. package/dist/gui/EFPreview.d.ts +27 -0
  36. package/dist/gui/EFWorkbench.d.ts +34 -0
  37. package/dist/gui/apiHostContext.d.ts +3 -0
  38. package/dist/gui/fetchContext.d.ts +3 -0
  39. package/dist/gui/focusContext.d.ts +6 -0
  40. package/dist/gui/focusedElementContext.d.ts +3 -0
  41. package/dist/gui/playingContext.d.ts +3 -0
  42. package/dist/index.d.ts +11 -0
  43. package/dist/msToTimeCode.d.ts +1 -0
  44. package/dist/style.css +9 -0
  45. package/package.json +6 -9
  46. package/src/elements/EFAudio.ts +1 -1
  47. package/src/elements/EFCaptions.ts +9 -9
  48. package/src/elements/EFImage.ts +3 -3
  49. package/src/elements/EFMedia.ts +11 -8
  50. package/src/elements/EFSourceMixin.ts +1 -1
  51. package/src/elements/EFTemporal.ts +42 -5
  52. package/src/elements/EFTimegroup.browsertest.ts +3 -3
  53. package/src/elements/EFTimegroup.ts +9 -6
  54. package/src/elements/EFVideo.ts +2 -2
  55. package/src/elements/EFWaveform.ts +6 -6
  56. package/src/elements/FetchMixin.ts +5 -3
  57. package/src/elements/TimegroupController.ts +1 -1
  58. package/src/elements/durationConverter.ts +1 -1
  59. package/src/elements/util.ts +1 -1
  60. package/src/gui/ContextMixin.ts +254 -0
  61. package/src/gui/EFFilmstrip.ts +41 -150
  62. package/src/gui/EFPreview.ts +39 -0
  63. package/src/gui/EFWorkbench.ts +7 -105
  64. package/src/gui/TWMixin.ts +10 -3
  65. package/src/gui/apiHostContext.ts +3 -0
  66. package/src/gui/fetchContext.ts +5 -0
  67. package/src/gui/focusContext.ts +7 -0
  68. package/src/gui/focusedElementContext.ts +5 -0
  69. package/src/gui/playingContext.ts +3 -0
  70. package/dist/lib/av/EncodedAsset.cjs +0 -577
  71. package/dist/lib/av/MP4File.cjs +0 -187
  72. package/dist/lib/av/msToTimeCode.cjs +0 -15
  73. package/dist/lib/util/awaitMicrotask.cjs +0 -4
  74. package/dist/lib/util/awaitMicrotask.js +0 -4
  75. package/dist/lib/util/memoize.cjs +0 -14
  76. package/dist/packages/elements/src/EF_FRAMEGEN.cjs +0 -197
  77. package/dist/packages/elements/src/EF_INTERACTIVE.cjs +0 -4
  78. package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +0 -1
  79. package/dist/packages/elements/src/EF_INTERACTIVE.js +0 -4
  80. package/dist/packages/elements/src/elements/CrossUpdateController.cjs +0 -16
  81. package/dist/packages/elements/src/elements/EFAudio.cjs +0 -53
  82. package/dist/packages/elements/src/elements/EFCaptions.cjs +0 -164
  83. package/dist/packages/elements/src/elements/EFImage.cjs +0 -79
  84. package/dist/packages/elements/src/elements/EFMedia.cjs +0 -336
  85. package/dist/packages/elements/src/elements/EFSourceMixin.cjs +0 -55
  86. package/dist/packages/elements/src/elements/EFTemporal.cjs +0 -199
  87. package/dist/packages/elements/src/elements/EFTimegroup.cjs +0 -352
  88. package/dist/packages/elements/src/elements/EFVideo.cjs +0 -109
  89. package/dist/packages/elements/src/elements/EFWaveform.cjs +0 -242
  90. package/dist/packages/elements/src/elements/FetchMixin.cjs +0 -28
  91. package/dist/packages/elements/src/elements/TimegroupController.cjs +0 -20
  92. package/dist/packages/elements/src/elements/durationConverter.cjs +0 -8
  93. package/dist/packages/elements/src/elements/parseTimeToMs.cjs +0 -12
  94. package/dist/packages/elements/src/elements/util.cjs +0 -11
  95. package/dist/packages/elements/src/gui/EFFilmstrip.cjs +0 -825
  96. package/dist/packages/elements/src/gui/EFWorkbench.cjs +0 -214
  97. package/dist/packages/elements/src/gui/EFWorkbench.d.ts +0 -45
  98. package/dist/packages/elements/src/gui/TWMixin.cjs +0 -28
  99. package/dist/packages/elements/src/gui/TWMixin.css.cjs +0 -3
  100. package/dist/packages/elements/src/index.cjs +0 -50
  101. package/dist/packages/elements/src/index.d.ts +0 -10
  102. /package/dist/{packages/elements/src/EF_FRAMEGEN.d.ts → EF_FRAMEGEN.d.ts} +0 -0
  103. /package/dist/{lib/av → assets/dist}/MP4File.js +0 -0
  104. /package/dist/{lib/util → assets/dist}/memoize.js +0 -0
  105. /package/dist/{packages/elements/src/elements → elements}/CrossUpdateController.d.ts +0 -0
  106. /package/dist/{packages/elements/src/elements → elements}/EFSourceMixin.d.ts +0 -0
  107. /package/dist/{packages/elements/src/elements → elements}/FetchMixin.d.ts +0 -0
  108. /package/dist/{packages/elements/src/elements → elements}/durationConverter.d.ts +0 -0
  109. /package/dist/{packages/elements/src/elements → elements}/parseTimeToMs.d.ts +0 -0
  110. /package/dist/{packages/elements → elements}/src/elements/CrossUpdateController.js +0 -0
  111. /package/dist/{packages/elements → elements}/src/elements/EFAudio.js +0 -0
  112. /package/dist/{packages/elements → elements}/src/elements/EFImage.js +0 -0
  113. /package/dist/{packages/elements → elements}/src/elements/EFVideo.js +0 -0
  114. /package/dist/{packages/elements → elements}/src/elements/EFWaveform.js +0 -0
  115. /package/dist/{packages/elements → elements}/src/elements/TimegroupController.js +0 -0
  116. /package/dist/{packages/elements → elements}/src/elements/durationConverter.js +0 -0
  117. /package/dist/{packages/elements → elements}/src/elements/parseTimeToMs.js +0 -0
  118. /package/dist/{packages/elements → elements}/src/elements/util.js +0 -0
  119. /package/dist/{packages/elements → elements}/src/gui/TWMixin.css.js +0 -0
  120. /package/dist/{lib/av → elements/src}/msToTimeCode.js +0 -0
  121. /package/dist/{packages/elements/src/gui → gui}/TWMixin.d.ts +0 -0
@@ -1,187 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const MP4Box = require("mp4box");
4
- const debug = require("debug");
5
- function _interopNamespaceDefault(e) {
6
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
7
- if (e) {
8
- for (const k in e) {
9
- if (k !== "default") {
10
- const d = Object.getOwnPropertyDescriptor(e, k);
11
- Object.defineProperty(n, k, d.get ? d : {
12
- enumerable: true,
13
- get: () => e[k]
14
- });
15
- }
16
- }
17
- }
18
- n.default = e;
19
- return Object.freeze(n);
20
- }
21
- const MP4Box__namespace = /* @__PURE__ */ _interopNamespaceDefault(MP4Box);
22
- const log = debug("ef:av:mp4file");
23
- class MP4File extends MP4Box__namespace.ISOFile {
24
- constructor() {
25
- super(...arguments);
26
- this.readyPromise = new Promise((resolve, reject) => {
27
- this.onReady = () => resolve();
28
- this.onError = reject;
29
- });
30
- this.waitingForSamples = [];
31
- this._hasSeenLastSamples = false;
32
- this._arrayBufferFileStart = 0;
33
- }
34
- setSegmentOptions(id, user, options) {
35
- const trak = this.getTrackById(id);
36
- if (trak) {
37
- trak.nextSample = 0;
38
- this.fragmentedTracks.push({
39
- id,
40
- user,
41
- trak,
42
- segmentStream: null,
43
- nb_samples: "nbSamples" in options && options.nbSamples || 1e3,
44
- rapAlignement: ("rapAlignement" in options && options.rapAlignement) ?? true
45
- });
46
- }
47
- }
48
- /**
49
- * Fragments all tracks in a file into separate array buffers.
50
- */
51
- async fragmentAllTracks() {
52
- const trackBuffers = {};
53
- for await (const segment of this.fragmentIterator()) {
54
- (trackBuffers[segment.track] ??= []).push(segment.data);
55
- }
56
- return trackBuffers;
57
- }
58
- async *fragmentIterator() {
59
- await this.readyPromise;
60
- const trackInfo = {};
61
- for (const videoTrack of this.getInfo().videoTracks) {
62
- trackInfo[videoTrack.id] = { index: 0, complete: false };
63
- this.setSegmentOptions(videoTrack.id, null, {
64
- rapAlignement: true
65
- });
66
- }
67
- for (const audioTrack of this.getInfo().audioTracks) {
68
- trackInfo[audioTrack.id] = { index: 0, complete: false };
69
- const sampleRate = audioTrack.audio.sample_rate;
70
- const probablePacketSize = 1024;
71
- const probableFourSecondsOfSamples = Math.ceil(
72
- sampleRate / probablePacketSize * 4
73
- );
74
- this.setSegmentOptions(audioTrack.id, null, {
75
- nbSamples: probableFourSecondsOfSamples
76
- });
77
- }
78
- const initSegments = this.initializeSegmentation();
79
- for (const initSegment of initSegments) {
80
- yield {
81
- track: initSegment.id,
82
- segment: "init",
83
- data: initSegment.buffer,
84
- complete: false
85
- };
86
- }
87
- const fragmentStartSamples = {};
88
- let finishedReading = false;
89
- const allTracksFinished = () => {
90
- for (const fragmentedTrack of this.fragmentedTracks) {
91
- if (!trackInfo[fragmentedTrack.id]?.complete) {
92
- return false;
93
- }
94
- }
95
- return true;
96
- };
97
- while (!(finishedReading && allTracksFinished())) {
98
- for (const fragTrak of this.fragmentedTracks) {
99
- const trak = fragTrak.trak;
100
- if (trak.nextSample === void 0) {
101
- throw new Error("trak.nextSample is undefined");
102
- }
103
- if (trak.samples === void 0) {
104
- throw new Error("trak.samples is undefined");
105
- }
106
- while (trak.nextSample < trak.samples.length) {
107
- let result = void 0;
108
- const fragTrakNextSample = trak.samples[trak.nextSample];
109
- if (fragTrakNextSample) {
110
- fragmentStartSamples[fragTrak.id] ||= fragTrakNextSample;
111
- }
112
- try {
113
- result = this.createFragment(
114
- fragTrak.id,
115
- trak.nextSample,
116
- fragTrak.segmentStream
117
- );
118
- } catch (error) {
119
- console.error("Failed to createFragment", error);
120
- }
121
- if (result) {
122
- fragTrak.segmentStream = result;
123
- trak.nextSample++;
124
- } else {
125
- finishedReading = await this.waitForMoreSamples();
126
- break;
127
- }
128
- const nextSample = trak.samples[trak.nextSample];
129
- const emitSegment = (
130
- // if rapAlignement is true, we emit a fragment when we have a rap sample coming up next
131
- fragTrak.rapAlignement === true && nextSample?.is_sync || // if rapAlignement is false, we emit a fragment when we have the required number of samples
132
- !fragTrak.rapAlignement && trak.nextSample % fragTrak.nb_samples === 0 || // // if this is the last sample, we emit the fragment
133
- // finished ||
134
- // if we have more samples than the number of samples requested, we emit the fragment
135
- trak.nextSample >= trak.samples.length
136
- );
137
- if (emitSegment) {
138
- const trackInfoForFrag = trackInfo[fragTrak.id];
139
- if (!trackInfoForFrag) {
140
- throw new Error("trackInfoForFrag is undefined");
141
- }
142
- if (trak.nextSample >= trak.samples.length) {
143
- trackInfoForFrag.complete = true;
144
- }
145
- log(
146
- `Yielding fragment #${trackInfoForFrag.index} for track=${fragTrak.id}`
147
- );
148
- const startSample = fragmentStartSamples[fragTrak.id];
149
- const endSample = trak.samples[trak.nextSample - 1];
150
- if (!startSample || !endSample) {
151
- throw new Error("startSample or endSample is undefined");
152
- }
153
- yield {
154
- track: fragTrak.id,
155
- segment: trackInfoForFrag.index,
156
- data: fragTrak.segmentStream.buffer,
157
- complete: trackInfoForFrag.complete,
158
- cts: startSample.cts,
159
- dts: startSample.dts,
160
- duration: endSample.cts - startSample.cts + endSample.duration
161
- };
162
- trackInfoForFrag.index += 1;
163
- fragTrak.segmentStream = null;
164
- delete fragmentStartSamples[fragTrak.id];
165
- }
166
- }
167
- }
168
- finishedReading = await this.waitForMoreSamples();
169
- }
170
- }
171
- waitForMoreSamples() {
172
- if (this._hasSeenLastSamples) {
173
- return Promise.resolve(true);
174
- }
175
- return new Promise((resolve) => {
176
- this.waitingForSamples.push(resolve);
177
- });
178
- }
179
- processSamples(last) {
180
- this._hasSeenLastSamples = last;
181
- for (const observer of this.waitingForSamples) {
182
- observer(last);
183
- }
184
- this.waitingForSamples = [];
185
- }
186
- }
187
- exports.MP4File = MP4File;
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const msToTimeCode = (ms, subSecond = false) => {
4
- const seconds = Math.floor(ms / 1e3);
5
- const minutes = Math.floor(seconds / 60);
6
- const hours = Math.floor(minutes / 60);
7
- const pad = (num) => num.toString().padStart(2, "0");
8
- let timecode = `${pad(hours)}:${pad(minutes % 60)}:${pad(seconds % 60)}`;
9
- if (subSecond) {
10
- const subSeconds = Math.floor(ms % 1e3 / 10);
11
- timecode += `.${subSeconds.toString().padStart(2, "0")}`;
12
- }
13
- return timecode;
14
- };
15
- exports.msToTimeCode = msToTimeCode;
@@ -1,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const awaitMicrotask = () => new Promise(queueMicrotask);
4
- exports.awaitMicrotask = awaitMicrotask;
@@ -1,4 +0,0 @@
1
- const awaitMicrotask = () => new Promise(queueMicrotask);
2
- export {
3
- awaitMicrotask
4
- };
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const memoize = (_target, _propertyKey, descriptor) => {
4
- const get = descriptor.get;
5
- if (!get) return;
6
- const memoized = /* @__PURE__ */ new WeakMap();
7
- descriptor.get = function() {
8
- if (!memoized.has(this)) {
9
- memoized.set(this, get.call(this));
10
- }
11
- return memoized.get(this);
12
- };
13
- };
14
- exports.memoize = memoize;
@@ -1,197 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const debug = require("debug");
4
- const task = require("@lit/task");
5
- const awaitMicrotask = require("../../../lib/util/awaitMicrotask.cjs");
6
- const EFTemporal = require("./elements/EFTemporal.cjs");
7
- const EFTimegroup = require("./elements/EFTimegroup.cjs");
8
- const log = debug("ef:elements:EF_FRAMEGEN");
9
- class TriggerCanvas {
10
- constructor() {
11
- this.canvas = document.createElement("canvas");
12
- this.canvas.width = 1;
13
- this.canvas.height = 1;
14
- Object.assign(this.canvas.style, {
15
- position: "fixed",
16
- top: "0px",
17
- left: "0px",
18
- width: "1px",
19
- height: "1px",
20
- zIndex: "100000"
21
- });
22
- document.body.prepend(this.canvas);
23
- const ctx = this.canvas.getContext("2d", { willReadFrequently: true });
24
- if (!ctx) throw new Error("Canvas 2d context not ready");
25
- this.ctx = ctx;
26
- this.ctx.fillStyle = "black";
27
- }
28
- trigger() {
29
- log("TRIGGERING CANVAS");
30
- this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
31
- }
32
- }
33
- class EfFramegen {
34
- constructor() {
35
- this.time = 0;
36
- this.frameDurationMs = 0;
37
- this.initialBusyTasks = Promise.resolve([]);
38
- this.frameBox = document.createElement("div");
39
- this.BRIDGE = window.FRAMEGEN_BRIDGE;
40
- this.triggerCanvas = new TriggerCanvas();
41
- if (this.BRIDGE) {
42
- this.connectToBridge();
43
- }
44
- }
45
- trace(...args) {
46
- console.trace("[EF_FRAMEGEN]", ...args);
47
- }
48
- connectToBridge() {
49
- const BRIDGE = this.BRIDGE;
50
- if (!BRIDGE) {
51
- throw new Error("No BRIDGE when attempting to connect to bridge");
52
- }
53
- BRIDGE.onInitialize(async (renderId, renderOptions) => {
54
- log("BRIDGE.onInitialize", renderId, renderOptions);
55
- await this.initialize(renderId, renderOptions);
56
- BRIDGE.initialized(renderId);
57
- });
58
- BRIDGE.onBeginFrame((renderId, frameNumber, isLast) => {
59
- log("BRIDGE.onBeginFrame", renderId, frameNumber, isLast);
60
- this.beginFrame(renderId, frameNumber, isLast);
61
- });
62
- }
63
- async initialize(renderId, renderOptions) {
64
- addEventListener("unhandledrejection", (event) => {
65
- this.trace("Unhandled rejection:", event.reason);
66
- if (this.BRIDGE) {
67
- this.BRIDGE.error(renderId, event.reason);
68
- }
69
- });
70
- addEventListener("error", (event) => {
71
- this.trace("Uncaught error", event.error);
72
- if (this.BRIDGE) {
73
- this.BRIDGE.error(renderId, event.error);
74
- }
75
- });
76
- this.renderOptions = renderOptions;
77
- const workbench = document.querySelector("ef-workbench");
78
- if (!workbench) {
79
- throw new Error("No workbench found");
80
- }
81
- workbench.rendering = true;
82
- const timegroups = EFTimegroup.shallowGetTimegroups(workbench);
83
- const temporals = EFTemporal.deepGetElementsWithFrameTasks(workbench);
84
- const firstGroup = timegroups[0];
85
- if (!firstGroup) {
86
- throw new Error("No temporal elements found");
87
- }
88
- firstGroup.currentTimeMs = renderOptions.encoderOptions.fromMs;
89
- this.frameDurationMs = 1e3 / renderOptions.encoderOptions.video.framerate;
90
- this.initialBusyTasks = Promise.all(
91
- temporals.filter((temporal) => temporal.frameTask.status < task.TaskStatus.COMPLETE).map((temporal) => temporal.frameTask).map((task2) => task2.taskComplete)
92
- );
93
- this.time = 0;
94
- if (renderOptions.showFrameBox) {
95
- Object.assign(this.frameBox.style, {
96
- width: "200px",
97
- height: "100px",
98
- font: "30px Arial",
99
- backgroundColor: "white",
100
- position: "absolute",
101
- top: "0px",
102
- left: "0px",
103
- zIndex: "100000"
104
- });
105
- document.body.prepend(this.frameBox);
106
- }
107
- this.audioBufferPromise = firstGroup.renderAudio(
108
- renderOptions.encoderOptions.alignedFromUs / 1e3,
109
- renderOptions.encoderOptions.alignedToUs / 1e3
110
- // renderOptions.encoderOptions.fromMs,
111
- // renderOptions.encoderOptions.toMs,
112
- );
113
- log("Initialized");
114
- }
115
- async beginFrame(renderId, frameNumber, isLast) {
116
- if (this.renderOptions === void 0) {
117
- throw new Error("No renderOptions");
118
- }
119
- if (this.renderOptions.showFrameBox) {
120
- this.frameBox.innerHTML = `
121
- <div>Frame #${frameNumber}</div>
122
- <div>${this.time.toFixed(4)}</div>
123
- `;
124
- }
125
- const workbench = document.querySelector("ef-workbench");
126
- if (!workbench) {
127
- throw new Error("No workbench found");
128
- }
129
- workbench.rendering = true;
130
- const timegroups = EFTimegroup.shallowGetTimegroups(workbench);
131
- const temporals = EFTemporal.deepGetElementsWithFrameTasks(workbench);
132
- const firstGroup = timegroups[0];
133
- if (!firstGroup) {
134
- throw new Error("No temporal elements found");
135
- }
136
- this.time = this.renderOptions.encoderOptions.fromMs + frameNumber * this.frameDurationMs;
137
- firstGroup.currentTimeMs = this.time;
138
- log("Awaiting initialBusyTasks");
139
- await this.initialBusyTasks;
140
- log("Awaiting microtask");
141
- await awaitMicrotask.awaitMicrotask();
142
- log("Awaiting frame tasks");
143
- const now = performance.now();
144
- await Promise.all(
145
- temporals.filter((temporal) => temporal.frameTask.status < task.TaskStatus.COMPLETE).map((temporal) => {
146
- return temporal.frameTask;
147
- }).map((task2) => task2.taskComplete)
148
- );
149
- log(`frame:${frameNumber} All tasks complete ${performance.now() - now}ms`);
150
- if (isLast && this.audioBufferPromise) {
151
- const renderedAudio = await this.audioBufferPromise;
152
- const channelCount = renderedAudio.numberOfChannels;
153
- const interleavedSamples = new Float32Array(
154
- channelCount * renderedAudio.length
155
- );
156
- for (let i = 0; i < renderedAudio.length; i++) {
157
- for (let j = 0; j < channelCount; j++) {
158
- interleavedSamples.set(
159
- renderedAudio.getChannelData(j).slice(i, i + 1),
160
- i * channelCount + j
161
- );
162
- }
163
- }
164
- if (this.BRIDGE) {
165
- this.triggerCanvas.trigger();
166
- this.BRIDGE.frameReady(
167
- renderId,
168
- frameNumber,
169
- interleavedSamples.buffer
170
- );
171
- } else {
172
- const fileReader = new FileReader();
173
- fileReader.readAsDataURL(new Blob([interleavedSamples.buffer]));
174
- await new Promise((resolve, reject) => {
175
- fileReader.onload = resolve;
176
- fileReader.onerror = reject;
177
- });
178
- return fileReader.result;
179
- }
180
- } else {
181
- if (this.BRIDGE) {
182
- this.triggerCanvas.trigger();
183
- this.BRIDGE.frameReady(renderId, frameNumber, new ArrayBuffer(0));
184
- } else {
185
- const fileReader = new FileReader();
186
- fileReader.readAsDataURL(new Blob([]));
187
- await new Promise((resolve, reject) => {
188
- fileReader.onload = resolve;
189
- fileReader.onerror = reject;
190
- });
191
- return fileReader.result;
192
- }
193
- }
194
- }
195
- }
196
- window.EF_FRAMEGEN = new EfFramegen();
197
- exports.EfFramegen = EfFramegen;
@@ -1,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const EF_INTERACTIVE = !window.location.search.includes("EF_NONINTERACTIVE");
4
- exports.EF_INTERACTIVE = EF_INTERACTIVE;
@@ -1 +0,0 @@
1
- export declare const EF_INTERACTIVE: boolean;
@@ -1,4 +0,0 @@
1
- const EF_INTERACTIVE = !window.location.search.includes("EF_NONINTERACTIVE");
2
- export {
3
- EF_INTERACTIVE
4
- };
@@ -1,16 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- class CrossUpdateController {
4
- constructor(host, target) {
5
- this.host = host;
6
- this.target = target;
7
- this.host.addController(this);
8
- }
9
- hostUpdate() {
10
- this.target.requestUpdate();
11
- }
12
- remove() {
13
- this.host.removeController(this);
14
- }
15
- }
16
- exports.CrossUpdateController = CrossUpdateController;
@@ -1,53 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const lit = require("lit");
4
- const ref_js = require("lit/directives/ref.js");
5
- const decorators_js = require("lit/decorators.js");
6
- const EFMedia = require("./EFMedia.cjs");
7
- const task = require("@lit/task");
8
- var __defProp = Object.defineProperty;
9
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
- var __decorateClass = (decorators, target, key, kind) => {
11
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
12
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
13
- if (decorator = decorators[i])
14
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
15
- if (kind && result) __defProp(target, key, result);
16
- return result;
17
- };
18
- exports.EFAudio = class EFAudio extends EFMedia.EFMedia {
19
- constructor() {
20
- super(...arguments);
21
- this.audioElementRef = ref_js.createRef();
22
- this.src = "";
23
- this.frameTask = new task.Task(this, {
24
- args: () => [
25
- this.trackFragmentIndexLoader.status,
26
- this.initSegmentsLoader.status,
27
- this.seekTask.status,
28
- this.fetchSeekTask.status,
29
- this.videoAssetTask.status
30
- ],
31
- task: async () => {
32
- await this.trackFragmentIndexLoader.taskComplete;
33
- await this.initSegmentsLoader.taskComplete;
34
- await this.seekTask.taskComplete;
35
- await this.fetchSeekTask.taskComplete;
36
- await this.videoAssetTask.taskComplete;
37
- this.rootTimegroup?.requestUpdate();
38
- }
39
- });
40
- }
41
- render() {
42
- return lit.html`<audio ${ref_js.ref(this.audioElementRef)}></audio>`;
43
- }
44
- get audioElement() {
45
- return this.audioElementRef.value;
46
- }
47
- };
48
- __decorateClass([
49
- decorators_js.property({ type: String })
50
- ], exports.EFAudio.prototype, "src", 2);
51
- exports.EFAudio = __decorateClass([
52
- decorators_js.customElement("ef-audio")
53
- ], exports.EFAudio);
@@ -1,164 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const EFAudio = require("./EFAudio.cjs");
4
- const lit = require("lit");
5
- const task = require("@lit/task");
6
- const decorators_js = require("lit/decorators.js");
7
- const EFVideo = require("./EFVideo.cjs");
8
- const EFTemporal = require("./EFTemporal.cjs");
9
- const CrossUpdateController = require("./CrossUpdateController.cjs");
10
- const FetchMixin = require("./FetchMixin.cjs");
11
- const EFSourceMixin = require("./EFSourceMixin.cjs");
12
- const EF_INTERACTIVE = require("../EF_INTERACTIVE.cjs");
13
- var __defProp = Object.defineProperty;
14
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
15
- var __decorateClass = (decorators, target, key, kind) => {
16
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
17
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
18
- if (decorator = decorators[i])
19
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
20
- if (kind && result) __defProp(target, key, result);
21
- return result;
22
- };
23
- exports.EFCaptionsActiveWord = class EFCaptionsActiveWord extends EFTemporal.EFTemporal(lit.LitElement) {
24
- constructor() {
25
- super(...arguments);
26
- this.wordStartMs = 0;
27
- this.wordEndMs = 0;
28
- this.wordText = "";
29
- }
30
- render() {
31
- return lit.html`${this.wordText}`;
32
- }
33
- get startTimeMs() {
34
- return this.wordStartMs || 0;
35
- }
36
- get durationMs() {
37
- return this.wordEndMs - this.wordStartMs;
38
- }
39
- };
40
- exports.EFCaptionsActiveWord.styles = [
41
- lit.css`
42
- :host {
43
- display: inline-block;
44
- }
45
- `
46
- ];
47
- __decorateClass([
48
- decorators_js.property({ type: Number, attribute: false })
49
- ], exports.EFCaptionsActiveWord.prototype, "wordStartMs", 2);
50
- __decorateClass([
51
- decorators_js.property({ type: Number, attribute: false })
52
- ], exports.EFCaptionsActiveWord.prototype, "wordEndMs", 2);
53
- __decorateClass([
54
- decorators_js.property({ type: String, attribute: false })
55
- ], exports.EFCaptionsActiveWord.prototype, "wordText", 2);
56
- exports.EFCaptionsActiveWord = __decorateClass([
57
- decorators_js.customElement("ef-captions-active-word")
58
- ], exports.EFCaptionsActiveWord);
59
- exports.EFCaptions = class EFCaptions extends EFSourceMixin.EFSourceMixin(
60
- EFTemporal.EFTemporal(FetchMixin.FetchMixin(lit.LitElement)),
61
- { assetType: "caption_files" }
62
- ) {
63
- constructor() {
64
- super(...arguments);
65
- this.target = null;
66
- this.wordStyle = "";
67
- this.activeWordContainers = this.getElementsByTagName("ef-captions-active-word");
68
- this.md5SumLoader = new task.Task(this, {
69
- autoRun: false,
70
- args: () => [this.target],
71
- task: async ([], { signal }) => {
72
- const md5Path = `/@ef-asset/${this.targetElement.src ?? ""}`;
73
- const response = await fetch(md5Path, { method: "HEAD", signal });
74
- return response.headers.get("etag") ?? void 0;
75
- }
76
- });
77
- this.captionsDataTask = new task.Task(this, {
78
- autoRun: EF_INTERACTIVE.EF_INTERACTIVE,
79
- args: () => [this.captionsPath(), this.fetch],
80
- task: async ([captionsPath, fetch2], { signal }) => {
81
- const response = await fetch2(captionsPath, { signal });
82
- return response.json();
83
- }
84
- });
85
- this.frameTask = new task.Task(this, {
86
- autoRun: EF_INTERACTIVE.EF_INTERACTIVE,
87
- args: () => [this.captionsDataTask.status],
88
- task: async () => {
89
- await this.captionsDataTask.taskComplete;
90
- }
91
- });
92
- }
93
- captionsPath() {
94
- const targetSrc = this.targetElement.src;
95
- if (targetSrc.startsWith("editframe://") || targetSrc.startsWith("http")) {
96
- return targetSrc.replace("isobmff", "caption");
97
- }
98
- return `/@ef-captions/${targetSrc}`;
99
- }
100
- connectedCallback() {
101
- super.connectedCallback();
102
- if (this.targetElement) {
103
- new CrossUpdateController.CrossUpdateController(this.targetElement, this);
104
- }
105
- }
106
- render() {
107
- return this.captionsDataTask.render({
108
- pending: () => lit.html`<div>Generating captions data...</div>`,
109
- error: () => lit.html`<div>🚫 Error generating captions data</div>`,
110
- complete: () => lit.html`<slot></slot>`
111
- });
112
- }
113
- updated(_changedProperties) {
114
- this.updateActiveWord();
115
- }
116
- updateActiveWord() {
117
- const caption = this.captionsDataTask.value;
118
- if (!caption) {
119
- return;
120
- }
121
- const words = [];
122
- let startMs = 0;
123
- let endMs = 0;
124
- for (const segment of caption.segments) {
125
- if (this.targetElement.ownCurrentTimeMs >= segment.start * 1e3 && this.targetElement.ownCurrentTimeMs <= segment.end * 1e3) {
126
- for (const word of segment.words) {
127
- if (this.targetElement.ownCurrentTimeMs >= word.start * 1e3 && this.targetElement.ownCurrentTimeMs <= word.end * 1e3) {
128
- words.push(word.text);
129
- startMs = word.start * 1e3;
130
- endMs = word.end * 1e3;
131
- }
132
- }
133
- }
134
- }
135
- for (const container of Array.from(this.activeWordContainers)) {
136
- container.wordText = words.join(" ");
137
- container.wordStartMs = startMs;
138
- container.wordEndMs = endMs;
139
- }
140
- }
141
- get targetElement() {
142
- const target = document.getElementById(this.getAttribute("target") ?? "");
143
- if (target instanceof EFAudio.EFAudio || target instanceof EFVideo.EFVideo) {
144
- return target;
145
- }
146
- throw new Error("Invalid target, must be an EFAudio or EFVideo element");
147
- }
148
- };
149
- exports.EFCaptions.styles = [
150
- lit.css`
151
- :host {
152
- display: block;
153
- }
154
- `
155
- ];
156
- __decorateClass([
157
- decorators_js.property({ type: String, attribute: "target" })
158
- ], exports.EFCaptions.prototype, "target", 2);
159
- __decorateClass([
160
- decorators_js.property({ attribute: "word-style" })
161
- ], exports.EFCaptions.prototype, "wordStyle", 2);
162
- exports.EFCaptions = __decorateClass([
163
- decorators_js.customElement("ef-captions")
164
- ], exports.EFCaptions);