@editframe/elements 0.5.0-beta.8 → 0.6.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 (109) hide show
  1. package/dist/lib/av/EncodedAsset.cjs +561 -0
  2. package/dist/{editor/util/EncodedAsset/EncodedAsset.mjs → lib/av/EncodedAsset.js} +40 -33
  3. package/dist/lib/av/MP4File.cjs +182 -0
  4. package/dist/{editor/util/MP4File.mjs → lib/av/MP4File.js} +55 -51
  5. package/dist/lib/av/msToTimeCode.cjs +15 -0
  6. package/dist/lib/util/awaitMicrotask.cjs +8 -0
  7. package/dist/lib/util/memoize.cjs +14 -0
  8. package/dist/{util/memoize.mjs → lib/util/memoize.js} +1 -2
  9. package/dist/packages/elements/src/EF_FRAMEGEN.cjs +197 -0
  10. package/dist/packages/elements/src/EF_FRAMEGEN.d.ts +45 -0
  11. package/dist/packages/elements/src/EF_FRAMEGEN.js +197 -0
  12. package/dist/packages/elements/src/EF_INTERACTIVE.cjs +4 -0
  13. package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +1 -0
  14. package/dist/packages/elements/src/elements/CrossUpdateController.cjs +16 -0
  15. package/dist/packages/elements/src/elements/CrossUpdateController.d.ts +9 -0
  16. package/dist/packages/elements/src/elements/EFAudio.cjs +53 -0
  17. package/dist/packages/elements/src/elements/EFAudio.d.ts +10 -0
  18. package/dist/{elements/src/elements/EFAudio.mjs → packages/elements/src/elements/EFAudio.js} +2 -5
  19. package/dist/packages/elements/src/elements/EFCaptions.cjs +171 -0
  20. package/dist/packages/elements/src/elements/EFCaptions.d.ts +39 -0
  21. package/dist/{elements/src/elements/EFCaptions.mjs → packages/elements/src/elements/EFCaptions.js} +18 -20
  22. package/dist/packages/elements/src/elements/EFImage.cjs +79 -0
  23. package/dist/packages/elements/src/elements/EFImage.d.ts +14 -0
  24. package/dist/{elements/src/elements/EFImage.mjs → packages/elements/src/elements/EFImage.js} +8 -7
  25. package/dist/packages/elements/src/elements/EFMedia.cjs +334 -0
  26. package/dist/packages/elements/src/elements/EFMedia.d.ts +61 -0
  27. package/dist/{elements/src/elements/EFMedia.mjs → packages/elements/src/elements/EFMedia.js} +40 -38
  28. package/dist/packages/elements/src/elements/EFSourceMixin.cjs +55 -0
  29. package/dist/packages/elements/src/elements/EFSourceMixin.d.ts +12 -0
  30. package/dist/{elements/src/elements/EFSourceMixin.mjs → packages/elements/src/elements/EFSourceMixin.js} +6 -8
  31. package/dist/packages/elements/src/elements/EFTemporal.cjs +198 -0
  32. package/dist/packages/elements/src/elements/EFTemporal.d.ts +36 -0
  33. package/dist/{elements/src/elements/EFTemporal.mjs → packages/elements/src/elements/EFTemporal.js} +6 -22
  34. package/dist/packages/elements/src/elements/EFTimegroup.browsertest.d.ts +12 -0
  35. package/{src/elements/EFTimegroup.ts → dist/packages/elements/src/elements/EFTimegroup.cjs} +162 -213
  36. package/dist/packages/elements/src/elements/EFTimegroup.d.ts +39 -0
  37. package/dist/{elements/src/elements/EFTimegroup.mjs → packages/elements/src/elements/EFTimegroup.js} +55 -65
  38. package/{src/elements/EFTimeline.ts → dist/packages/elements/src/elements/EFTimeline.cjs} +5 -3
  39. package/dist/packages/elements/src/elements/EFTimeline.d.ts +3 -0
  40. package/dist/{elements/src/elements/EFTimeline.mjs → packages/elements/src/elements/EFTimeline.js} +5 -2
  41. package/dist/packages/elements/src/elements/EFVideo.cjs +110 -0
  42. package/dist/packages/elements/src/elements/EFVideo.d.ts +14 -0
  43. package/dist/{elements/src/elements/EFVideo.mjs → packages/elements/src/elements/EFVideo.js} +10 -32
  44. package/dist/packages/elements/src/elements/EFWaveform.cjs +235 -0
  45. package/dist/packages/elements/src/elements/EFWaveform.d.ts +28 -0
  46. package/dist/{elements/src/elements/EFWaveform.mjs → packages/elements/src/elements/EFWaveform.js} +15 -16
  47. package/dist/packages/elements/src/elements/FetchMixin.cjs +28 -0
  48. package/dist/packages/elements/src/elements/FetchMixin.d.ts +8 -0
  49. package/dist/{elements/src/elements/FetchMixin.mjs → packages/elements/src/elements/FetchMixin.js} +5 -7
  50. package/dist/packages/elements/src/elements/TimegroupController.cjs +20 -0
  51. package/dist/packages/elements/src/elements/TimegroupController.d.ts +14 -0
  52. package/dist/packages/elements/src/elements/durationConverter.cjs +8 -0
  53. package/dist/packages/elements/src/elements/durationConverter.d.ts +4 -0
  54. package/dist/{elements/src/elements/durationConverter.mjs → packages/elements/src/elements/durationConverter.js} +1 -1
  55. package/dist/packages/elements/src/elements/parseTimeToMs.cjs +12 -0
  56. package/dist/packages/elements/src/elements/parseTimeToMs.d.ts +1 -0
  57. package/dist/packages/elements/src/elements/parseTimeToMs.js +12 -0
  58. package/dist/packages/elements/src/elements/util.cjs +11 -0
  59. package/dist/packages/elements/src/elements/util.d.ts +4 -0
  60. package/dist/{elements/src/elements/util.mjs → packages/elements/src/elements/util.js} +1 -1
  61. package/dist/packages/elements/src/gui/EFFilmstrip.cjs +675 -0
  62. package/dist/packages/elements/src/gui/EFFilmstrip.d.ts +138 -0
  63. package/dist/{elements/src/gui/EFFilmstrip.mjs → packages/elements/src/gui/EFFilmstrip.js} +57 -55
  64. package/dist/packages/elements/src/gui/EFWorkbench.cjs +199 -0
  65. package/dist/packages/elements/src/gui/EFWorkbench.d.ts +44 -0
  66. package/dist/{elements/src/gui/EFWorkbench.mjs → packages/elements/src/gui/EFWorkbench.js} +27 -49
  67. package/{src/gui/TWMixin.ts → dist/packages/elements/src/gui/TWMixin.cjs} +11 -10
  68. package/dist/packages/elements/src/gui/TWMixin.css.cjs +3 -0
  69. package/dist/packages/elements/src/gui/TWMixin.css.js +4 -0
  70. package/dist/packages/elements/src/gui/TWMixin.d.ts +3 -0
  71. package/dist/{elements/src/gui/TWMixin.mjs → packages/elements/src/gui/TWMixin.js} +4 -3
  72. package/dist/packages/elements/src/index.cjs +47 -0
  73. package/dist/packages/elements/src/index.d.ts +10 -0
  74. package/dist/packages/elements/src/index.js +23 -0
  75. package/dist/style.css +13 -4
  76. package/package.json +23 -4
  77. package/dist/elements/src/EF_FRAMEGEN.mjs +0 -130
  78. package/dist/elements/src/elements/parseTimeToMs.mjs +0 -13
  79. package/dist/elements/src/elements.mjs +0 -12
  80. package/dist/elements/src/gui/TWMixin.css.mjs +0 -4
  81. package/dist/util/awaitAnimationFrame.mjs +0 -11
  82. package/docker-compose.yaml +0 -17
  83. package/src/EF_FRAMEGEN.ts +0 -208
  84. package/src/EF_INTERACTIVE.ts +0 -2
  85. package/src/elements/CrossUpdateController.ts +0 -18
  86. package/src/elements/EFAudio.ts +0 -42
  87. package/src/elements/EFCaptions.ts +0 -202
  88. package/src/elements/EFImage.ts +0 -70
  89. package/src/elements/EFMedia.ts +0 -395
  90. package/src/elements/EFSourceMixin.ts +0 -57
  91. package/src/elements/EFTemporal.ts +0 -246
  92. package/src/elements/EFTimegroup.browsertest.ts +0 -360
  93. package/src/elements/EFVideo.ts +0 -114
  94. package/src/elements/EFWaveform.ts +0 -407
  95. package/src/elements/FetchMixin.ts +0 -18
  96. package/src/elements/TimegroupController.ts +0 -25
  97. package/src/elements/buildLitFixture.ts +0 -13
  98. package/src/elements/durationConverter.ts +0 -6
  99. package/src/elements/parseTimeToMs.ts +0 -10
  100. package/src/elements/util.ts +0 -24
  101. package/src/gui/EFFilmstrip.ts +0 -702
  102. package/src/gui/EFWorkbench.ts +0 -242
  103. package/src/gui/TWMixin.css +0 -3
  104. package/src/util.d.ts +0 -1
  105. /package/dist/{editor/msToTimeCode.mjs → lib/av/msToTimeCode.js} +0 -0
  106. /package/dist/{util/awaitMicrotask.mjs → lib/util/awaitMicrotask.js} +0 -0
  107. /package/dist/{elements/src/EF_INTERACTIVE.mjs → packages/elements/src/EF_INTERACTIVE.js} +0 -0
  108. /package/dist/{elements/src/elements/CrossUpdateController.mjs → packages/elements/src/elements/CrossUpdateController.js} +0 -0
  109. /package/dist/{elements/src/elements/TimegroupController.mjs → packages/elements/src/elements/TimegroupController.js} +0 -0
@@ -1,65 +1,61 @@
1
- import { LitElement, html, css, PropertyValueMap } from "lit";
2
- import { provide } from "@lit/context";
3
- import { customElement, property } from "lit/decorators.js";
4
- import {
5
- EFTemporal,
6
- isEFTemporal,
7
- shallowGetTemporalElements,
8
- timegroupContext,
9
- } from "./EFTemporal";
10
- import { TimegroupController } from "./TimegroupController";
11
- import { EF_INTERACTIVE } from "../EF_INTERACTIVE";
12
- import { deepGetMediaElements } from "./EFMedia";
13
- import { Task } from "@lit/task";
14
-
15
- function audioBufferToFloat32(buffer: AudioBuffer) {
16
- const numOfChan = buffer.numberOfChannels;
17
- const length = buffer.length * numOfChan * 4; // 4 bytes per sample for 32-bit float
18
- const resultBuffer = new ArrayBuffer(length);
19
- const view = new DataView(resultBuffer);
20
- const channels = [];
21
-
22
- for (let i = 0; i < numOfChan; i++) {
23
- channels.push(buffer.getChannelData(i));
24
- }
25
-
26
- let offset = 0;
27
- for (let i = 0; i < buffer.length; i++) {
28
- for (let channel = 0; channel < numOfChan; channel++) {
29
- view.setFloat32(offset, channels[channel][i], true); // true for little-endian
30
- offset += 4;
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const lit = require("lit");
4
+ const context = require("@lit/context");
5
+ const decorators_js = require("lit/decorators.js");
6
+ const EFTemporal = require("./EFTemporal.cjs");
7
+ const TimegroupController = require("./TimegroupController.cjs");
8
+ const EF_INTERACTIVE = require("../EF_INTERACTIVE.cjs");
9
+ const EFMedia = require("./EFMedia.cjs");
10
+ const task = require("@lit/task");
11
+ var __defProp = Object.defineProperty;
12
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
+ var __typeError = (msg) => {
14
+ throw TypeError(msg);
15
+ };
16
+ var __decorateClass = (decorators, target, key, kind) => {
17
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
18
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
19
+ if (decorator = decorators[i])
20
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
21
+ if (kind && result) __defProp(target, key, result);
22
+ return result;
23
+ };
24
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
25
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
26
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
27
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
28
+ var _currentTime;
29
+ const shallowGetTimegroups = (element, groups = []) => {
30
+ for (const child of Array.from(element.children)) {
31
+ if (child instanceof exports.EFTimegroup) {
32
+ groups.push(child);
33
+ } else {
34
+ shallowGetTimegroups(child, groups);
31
35
  }
32
36
  }
33
-
34
- return new Blob([resultBuffer], { type: "application/octet-stream" });
35
- }
36
-
37
- @customElement("ef-timegroup")
38
- export class EFTimegroup extends EFTemporal(LitElement) {
39
- static styles = css`
40
- :host {
41
- display: block;
42
- width: 100%;
43
- height: 100%;
44
- position: relative;
45
- top: 0;
46
- }
47
- `;
48
-
49
- @provide({ context: timegroupContext })
50
- _timeGroupContext = this;
51
-
52
- #currentTime = 0;
53
-
54
- @property({
55
- type: String,
56
- attribute: "mode",
57
- })
58
- mode: "fixed" | "sequence" | "contain" = "sequence";
59
-
60
- @property({ type: Number })
61
- set currentTime(time: number) {
62
- this.#currentTime = Math.max(0, Math.min(time, this.durationMs / 1000));
37
+ return groups;
38
+ };
39
+ exports.EFTimegroup = class EFTimegroup extends EFTemporal.EFTemporal(lit.LitElement) {
40
+ constructor() {
41
+ super(...arguments);
42
+ this._timeGroupContext = this;
43
+ __privateAdd(this, _currentTime, 0);
44
+ this.mode = "sequence";
45
+ this.crossoverMs = 0;
46
+ this.frameTask = new task.Task(this, {
47
+ autoRun: EF_INTERACTIVE.EF_INTERACTIVE,
48
+ args: () => [this.ownCurrentTimeMs, this.currentTimeMs],
49
+ task: async ([], { signal: _signal }) => {
50
+ let fullyUpdated = await this.updateComplete;
51
+ while (!fullyUpdated) {
52
+ fullyUpdated = await this.updateComplete;
53
+ }
54
+ }
55
+ });
56
+ }
57
+ set currentTime(time) {
58
+ __privateSet(this, _currentTime, Math.max(0, Math.min(time, this.durationMs / 1e3)));
63
59
  try {
64
60
  if (this.id) {
65
61
  if (this.isConnected) {
@@ -71,78 +67,50 @@ export class EFTimegroup extends EFTemporal(LitElement) {
71
67
  }
72
68
  }
73
69
  get currentTime() {
74
- return this.#currentTime;
70
+ return __privateGet(this, _currentTime);
75
71
  }
76
72
  get currentTimeMs() {
77
- return this.currentTime * 1000;
73
+ return this.currentTime * 1e3;
78
74
  }
79
- set currentTimeMs(ms: number) {
80
- this.currentTime = ms / 1000;
75
+ set currentTimeMs(ms) {
76
+ this.currentTime = ms / 1e3;
81
77
  }
82
-
83
- @property({
84
- attribute: "crossover",
85
- converter: {
86
- fromAttribute: (value: string): number => {
87
- if (value.endsWith("ms")) {
88
- return parseFloat(value);
89
- }
90
- if (value.endsWith("s")) {
91
- return parseFloat(value) * 1000;
92
- } else {
93
- throw new Error(
94
- "`crossover` MUST be in milliseconds or seconds (10s, 10000ms)",
95
- );
96
- }
97
- },
98
- toAttribute: (value: number) => `${value}ms`,
99
- },
100
- })
101
- crossoverMs = 0;
102
-
103
78
  render() {
104
- return html`<slot></slot> `;
79
+ return lit.html`<slot></slot> `;
105
80
  }
106
-
107
81
  maybeLoadTimeFromLocalStorage() {
108
82
  if (this.id) {
109
83
  try {
110
- return parseFloat(localStorage.getItem(this.storageKey) || "0");
84
+ return Number.parseFloat(localStorage.getItem(this.storageKey) || "0");
111
85
  } catch (error) {
112
86
  console.warn("Failed to load time from localStorage", error);
113
87
  }
114
88
  }
115
89
  return 0;
116
90
  }
117
-
118
91
  connectedCallback() {
119
92
  super.connectedCallback();
120
93
  if (this.id) {
121
- this.#currentTime = this.maybeLoadTimeFromLocalStorage();
94
+ __privateSet(this, _currentTime, this.maybeLoadTimeFromLocalStorage());
122
95
  }
123
-
124
96
  if (this.parentTimegroup) {
125
- new TimegroupController(this.parentTimegroup, this);
97
+ new TimegroupController.TimegroupController(this.parentTimegroup, this);
126
98
  }
127
-
128
99
  if (this.shouldWrapWithWorkbench()) {
129
100
  this.wrapWithWorkbench();
130
101
  }
131
102
  }
132
-
133
103
  get storageKey() {
134
104
  if (!this.id) {
135
105
  throw new Error("Timegroup must have an id to use localStorage.");
136
106
  }
137
107
  return `ef-timegroup-${this.id}`;
138
108
  }
139
-
140
109
  get crossoverStartMs() {
141
110
  const parentTimeGroup = this.parentTimegroup;
142
111
  if (!parentTimeGroup || !this.previousElementSibling) {
143
112
  return 0;
144
113
  }
145
-
146
114
  return parentTimeGroup.crossoverMs;
147
115
  }
148
116
  get crossoverEndMs() {
@@ -150,60 +118,57 @@ export class EFTimegroup extends EFTemporal(LitElement) {
150
118
  if (!parentTimeGroup || !this.nextElementSibling) {
151
119
  return 0;
152
120
  }
153
-
154
121
  return parentTimeGroup.crossoverMs;
155
122
  }
156
-
157
123
  get durationMs() {
158
124
  switch (this.mode) {
159
125
  case "fixed":
160
126
  return super.durationMs || 0;
161
- case "sequence":
127
+ case "sequence": {
162
128
  let duration = 0;
163
- this.childTemporals.forEach((node) => {
129
+ for (const node of this.childTemporals) {
164
130
  duration += node.durationMs;
165
- });
131
+ }
166
132
  return duration;
167
- case "contain":
133
+ }
134
+ case "contain": {
168
135
  let maxDuration = 0;
169
- this.childTemporals.forEach((node) => {
136
+ for (const node of this.childTemporals) {
170
137
  if (node.hasOwnDuration) {
171
138
  maxDuration = Math.max(maxDuration, node.durationMs);
172
139
  }
173
- });
140
+ }
174
141
  return maxDuration;
142
+ }
175
143
  default:
176
144
  throw new Error(`Invalid time mode: ${this.mode}`);
177
145
  }
178
146
  }
179
-
180
147
  async waitForMediaDurations() {
181
148
  return await Promise.all(
182
- deepGetMediaElements(this).map(
183
- (media) => media.trackFragmentIndexLoader.taskComplete,
184
- ),
149
+ EFMedia.deepGetMediaElements(this).map(
150
+ (media) => media.trackFragmentIndexLoader.taskComplete
151
+ )
185
152
  );
186
153
  }
187
-
188
154
  get childTemporals() {
189
- return shallowGetTemporalElements(this);
155
+ return EFTemporal.shallowGetTemporalElements(this);
190
156
  }
191
-
192
- protected updated(
193
- changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,
194
- ): void {
157
+ updated(changedProperties) {
195
158
  super.updated(changedProperties);
196
- if (
197
- changedProperties.has("currentTime") ||
198
- changedProperties.has("ownCurrentTimeMs")
199
- ) {
200
- console.log("Updating animations to time", this.ownCurrentTimeMs);
159
+ if (changedProperties.has("currentTime") || changedProperties.has("ownCurrentTimeMs")) {
160
+ const timelineTimeMs = (this.rootTimegroup ?? this).currentTimeMs;
161
+ if (this.startTimeMs > timelineTimeMs || this.endTimeMs < timelineTimeMs) {
162
+ this.style.display = "none";
163
+ return;
164
+ }
165
+ this.style.display = "";
201
166
  const animations = this.getAnimations({ subtree: true });
202
167
  this.style.setProperty(
203
168
  "--ef-duration",
204
- `${this.durationMs + this.crossoverEndMs + this.crossoverStartMs}ms`,
169
+ `${this.durationMs + this.crossoverEndMs + this.crossoverStartMs}ms`
205
170
  );
206
- animations.forEach((animation) => {
171
+ for (const animation of animations) {
207
172
  if (animation.playState === "running") {
208
173
  animation.pause();
209
174
  }
@@ -212,14 +177,18 @@ export class EFTimegroup extends EFTemporal(LitElement) {
212
177
  return;
213
178
  }
214
179
  const target = effect.target;
215
- // Important to avoid going to the end of the animation
216
- // or it will reset awkwardly.
217
- if (isEFTemporal(target)) {
180
+ if (!target) {
181
+ return;
182
+ }
183
+ if (target.closest("ef-timegroup") !== this) {
184
+ return;
185
+ }
186
+ if (EFTemporal.isEFTemporal(target)) {
218
187
  const timing = effect.getTiming();
219
188
  const duration = Number(timing.duration) ?? 0;
220
189
  const delay = Number(timing.delay);
221
190
  const newTime = Math.floor(
222
- Math.min(target.ownCurrentTimeMs, duration - 1 + delay),
191
+ Math.min(target.ownCurrentTimeMs, duration - 1 + delay)
223
192
  );
224
193
  if (Number.isNaN(newTime)) {
225
194
  return;
@@ -234,26 +203,19 @@ export class EFTimegroup extends EFTemporal(LitElement) {
234
203
  const duration = Number(timing.duration) ?? 0;
235
204
  const delay = Number(timing.delay);
236
205
  const newTime = Math.floor(
237
- Math.min(nearestTimegroup.ownCurrentTimeMs, duration - 1 + delay),
206
+ Math.min(nearestTimegroup.ownCurrentTimeMs, duration - 1 + delay)
238
207
  );
239
-
240
208
  if (Number.isNaN(newTime)) {
241
209
  return;
242
210
  }
243
211
  animation.currentTime = newTime;
244
212
  }
245
- });
213
+ }
246
214
  }
247
215
  }
248
-
249
216
  shouldWrapWithWorkbench() {
250
- return (
251
- EF_INTERACTIVE &&
252
- this.closest("ef-timegroup") === this &&
253
- this.closest("ef-workbench") === null
254
- );
217
+ return EF_INTERACTIVE.EF_INTERACTIVE && this.closest("ef-timegroup") === this && this.closest("ef-workbench") === null;
255
218
  }
256
-
257
219
  wrapWithWorkbench() {
258
220
  const workbench = document.createElement("ef-workbench");
259
221
  document.body.append(workbench);
@@ -261,134 +223,121 @@ export class EFTimegroup extends EFTemporal(LitElement) {
261
223
  this.setAttribute("id", "root-this");
262
224
  }
263
225
  this.setAttribute("slot", "canvas");
264
- workbench.append(this as unknown as Element);
265
-
226
+ workbench.append(this);
266
227
  const filmstrip = document.createElement("ef-filmstrip");
267
228
  filmstrip.setAttribute("slot", "timeline");
268
229
  filmstrip.setAttribute("target", `#${this.id}`);
269
230
  workbench.append(filmstrip);
270
231
  }
271
-
272
232
  get hasOwnDuration() {
273
233
  return true;
274
234
  }
275
-
276
235
  get efElements() {
277
236
  return Array.from(
278
237
  this.querySelectorAll(
279
- "ef-audio, ef-video, ef-image, ef-captions, ef-waveform",
280
- ),
238
+ "ef-audio, ef-video, ef-image, ef-captions, ef-waveform"
239
+ )
281
240
  );
282
241
  }
283
-
284
- async renderAudio(fromMs: number, toMs: number) {
242
+ async renderAudio(fromMs, toMs) {
285
243
  await this.waitForMediaDurations();
286
-
287
244
  const durationMs = toMs - fromMs;
288
245
  const audioContext = new OfflineAudioContext(
289
246
  2,
290
- Math.round((48000 * durationMs) / 1000),
291
- 48000,
247
+ Math.round(48e3 * durationMs / 1e3),
248
+ 48e3
292
249
  );
293
-
294
- console.log("RENDERING AUDIO");
295
- console.log(
296
- `renderAudio fromMs=${fromMs} toMs=${toMs} durationMs=${durationMs} ctxSize=${audioContext.length}`,
297
- );
298
-
299
250
  await Promise.all(
300
- deepGetMediaElements(this).map(async (mediaElement) => {
251
+ EFMedia.deepGetMediaElements(this).map(async (mediaElement) => {
301
252
  await mediaElement.trackFragmentIndexLoader.taskComplete;
302
-
303
253
  const mediaStartsBeforeEnd = mediaElement.startTimeMs <= toMs;
304
254
  const mediaEndsAfterStart = mediaElement.endTimeMs >= fromMs;
305
255
  const mediaOverlaps = mediaStartsBeforeEnd && mediaEndsAfterStart;
306
- if (!mediaOverlaps || mediaElement.defaultAudioTrackId === undefined) {
307
- console.log("Skipping audio element due to lack of overlap");
256
+ if (!mediaOverlaps || mediaElement.defaultAudioTrackId === void 0) {
308
257
  return;
309
258
  }
310
-
311
259
  const audio = await mediaElement.fetchAudioSpanningTime(fromMs, toMs);
312
260
  if (!audio) {
313
261
  throw new Error("Failed to fetch audio");
314
262
  }
315
-
316
263
  const ctxStartMs = Math.max(0, mediaElement.startTimeMs - fromMs);
317
264
  const ctxEndMs = Math.min(durationMs, mediaElement.endTimeMs - fromMs);
318
265
  const ctxDurationMs = ctxEndMs - ctxStartMs;
319
-
320
- const offset =
321
- Math.max(0, fromMs - mediaElement.startTimeMs) - audio.startMs;
322
-
323
- // console.log("Fetching audio spanning time", audio.startMs, audio.endMs);
324
- console.log(
325
- "AUDIO SPAN",
326
- JSON.stringify({
327
- fromMs,
328
- toMs,
329
- audio: {
330
- startMs: audio.startMs,
331
- endMs: audio.endMs,
332
- },
333
- elementStart: mediaElement.startTimeMs,
334
- elementEnd: mediaElement.endTimeMs,
335
- ctxStart: ctxStartMs,
336
- ctxEnd: ctxEndMs,
337
- offset,
338
- }),
339
- );
340
-
266
+ const offset = Math.max(0, fromMs - mediaElement.startTimeMs) - audio.startMs;
341
267
  const bufferSource = audioContext.createBufferSource();
342
268
  bufferSource.buffer = await audioContext.decodeAudioData(
343
- await audio.blob.arrayBuffer(),
269
+ await audio.blob.arrayBuffer()
344
270
  );
345
271
  bufferSource.connect(audioContext.destination);
346
-
347
272
  bufferSource.start(
348
- ctxStartMs / 1000,
349
- offset / 1000,
350
- ctxDurationMs / 1000,
273
+ ctxStartMs / 1e3,
274
+ offset / 1e3,
275
+ ctxDurationMs / 1e3
351
276
  );
352
- }),
277
+ })
353
278
  );
354
-
355
279
  return await audioContext.startRendering();
356
280
  }
357
-
358
281
  async loadMd5Sums() {
359
282
  const efElements = this.efElements;
360
- const loaderTasks: Promise<any>[] = [];
361
- efElements.forEach((el) => {
362
- const md5SumLoader = (el as any).md5SumLoader;
363
- if (md5SumLoader instanceof Task) {
283
+ const loaderTasks = [];
284
+ for (const el of efElements) {
285
+ const md5SumLoader = el.md5SumLoader;
286
+ if (md5SumLoader instanceof task.Task) {
364
287
  md5SumLoader.run();
365
288
  loaderTasks.push(md5SumLoader.taskComplete);
366
289
  }
367
- });
368
-
290
+ }
369
291
  await Promise.all(loaderTasks);
370
-
371
292
  efElements.map((el) => {
372
293
  if ("productionSrc" in el && el.productionSrc instanceof Function) {
373
294
  el.setAttribute("src", el.productionSrc());
374
295
  }
375
296
  });
376
297
  }
377
-
378
- frameTask = new Task(this, {
379
- autoRun: EF_INTERACTIVE,
380
- args: () => [this.ownCurrentTimeMs, this.currentTimeMs] as const,
381
- task: async ([], { signal }) => {
382
- let fullyUpdated = await this.updateComplete;
383
- while (!fullyUpdated) {
384
- fullyUpdated = await this.updateComplete;
385
- }
386
- },
387
- });
388
- }
389
-
390
- declare global {
391
- interface HTMLElementTagNameMap {
392
- "ef-timegroup": EFTimegroup & Element;
393
- }
394
- }
298
+ };
299
+ _currentTime = /* @__PURE__ */ new WeakMap();
300
+ exports.EFTimegroup.styles = lit.css`
301
+ :host {
302
+ display: block;
303
+ width: 100%;
304
+ height: 100%;
305
+ position: relative;
306
+ top: 0;
307
+ }
308
+ `;
309
+ __decorateClass([
310
+ context.provide({ context: EFTemporal.timegroupContext })
311
+ ], exports.EFTimegroup.prototype, "_timeGroupContext", 2);
312
+ __decorateClass([
313
+ decorators_js.property({
314
+ type: String,
315
+ attribute: "mode"
316
+ })
317
+ ], exports.EFTimegroup.prototype, "mode", 2);
318
+ __decorateClass([
319
+ decorators_js.property({ type: Number })
320
+ ], exports.EFTimegroup.prototype, "currentTime", 1);
321
+ __decorateClass([
322
+ decorators_js.property({
323
+ attribute: "crossover",
324
+ converter: {
325
+ fromAttribute: (value) => {
326
+ if (value.endsWith("ms")) {
327
+ return Number.parseFloat(value);
328
+ }
329
+ if (value.endsWith("s")) {
330
+ return Number.parseFloat(value) * 1e3;
331
+ }
332
+ throw new Error(
333
+ "`crossover` MUST be in milliseconds or seconds (10s, 10000ms)"
334
+ );
335
+ },
336
+ toAttribute: (value) => `${value}ms`
337
+ }
338
+ })
339
+ ], exports.EFTimegroup.prototype, "crossoverMs", 2);
340
+ exports.EFTimegroup = __decorateClass([
341
+ decorators_js.customElement("ef-timegroup")
342
+ ], exports.EFTimegroup);
343
+ exports.shallowGetTimegroups = shallowGetTimegroups;
@@ -0,0 +1,39 @@
1
+ import { LitElement, PropertyValueMap } from 'lit';
2
+ import { Task } from '@lit/task';
3
+
4
+ export declare const shallowGetTimegroups: (element: Element, groups?: EFTimegroup[]) => EFTimegroup[];
5
+ declare const EFTimegroup_base: (new (...args: any[]) => import('./EFTemporal').TemporalMixinInterface) & typeof LitElement;
6
+ export declare class EFTimegroup extends EFTimegroup_base {
7
+ #private;
8
+ static styles: import('lit').CSSResult;
9
+ _timeGroupContext: this;
10
+ mode: "fixed" | "sequence" | "contain";
11
+ set currentTime(time: number);
12
+ get currentTime(): number;
13
+ get currentTimeMs(): number;
14
+ set currentTimeMs(ms: number);
15
+ crossoverMs: number;
16
+ render(): import('lit-html').TemplateResult<1>;
17
+ maybeLoadTimeFromLocalStorage(): number;
18
+ connectedCallback(): void;
19
+ get storageKey(): string;
20
+ get crossoverStartMs(): number;
21
+ get crossoverEndMs(): number;
22
+ get durationMs(): number;
23
+ waitForMediaDurations(): Promise<Record<number, import('../../../assets/dist/packages/assets/src').TrackFragmentIndex>[]>;
24
+ get childTemporals(): import('./EFTemporal').TemporalMixinInterface[];
25
+ protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
26
+ shouldWrapWithWorkbench(): boolean;
27
+ wrapWithWorkbench(): void;
28
+ get hasOwnDuration(): boolean;
29
+ get efElements(): Element[];
30
+ renderAudio(fromMs: number, toMs: number): Promise<AudioBuffer>;
31
+ loadMd5Sums(): Promise<void>;
32
+ frameTask: Task<readonly [number, number], void>;
33
+ }
34
+ declare global {
35
+ interface HTMLElementTagNameMap {
36
+ "ef-timegroup": EFTimegroup & Element;
37
+ }
38
+ }
39
+ export {};