@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.
- package/dist/lib/av/EncodedAsset.cjs +561 -0
- package/dist/{editor/util/EncodedAsset/EncodedAsset.mjs → lib/av/EncodedAsset.js} +40 -33
- package/dist/lib/av/MP4File.cjs +182 -0
- package/dist/{editor/util/MP4File.mjs → lib/av/MP4File.js} +55 -51
- package/dist/lib/av/msToTimeCode.cjs +15 -0
- package/dist/lib/util/awaitMicrotask.cjs +8 -0
- package/dist/lib/util/memoize.cjs +14 -0
- package/dist/{util/memoize.mjs → lib/util/memoize.js} +1 -2
- package/dist/packages/elements/src/EF_FRAMEGEN.cjs +197 -0
- package/dist/packages/elements/src/EF_FRAMEGEN.d.ts +45 -0
- package/dist/packages/elements/src/EF_FRAMEGEN.js +197 -0
- package/dist/packages/elements/src/EF_INTERACTIVE.cjs +4 -0
- package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +1 -0
- package/dist/packages/elements/src/elements/CrossUpdateController.cjs +16 -0
- package/dist/packages/elements/src/elements/CrossUpdateController.d.ts +9 -0
- package/dist/packages/elements/src/elements/EFAudio.cjs +53 -0
- package/dist/packages/elements/src/elements/EFAudio.d.ts +10 -0
- package/dist/{elements/src/elements/EFAudio.mjs → packages/elements/src/elements/EFAudio.js} +2 -5
- package/dist/packages/elements/src/elements/EFCaptions.cjs +171 -0
- package/dist/packages/elements/src/elements/EFCaptions.d.ts +39 -0
- package/dist/{elements/src/elements/EFCaptions.mjs → packages/elements/src/elements/EFCaptions.js} +18 -20
- package/dist/packages/elements/src/elements/EFImage.cjs +79 -0
- package/dist/packages/elements/src/elements/EFImage.d.ts +14 -0
- package/dist/{elements/src/elements/EFImage.mjs → packages/elements/src/elements/EFImage.js} +8 -7
- package/dist/packages/elements/src/elements/EFMedia.cjs +334 -0
- package/dist/packages/elements/src/elements/EFMedia.d.ts +61 -0
- package/dist/{elements/src/elements/EFMedia.mjs → packages/elements/src/elements/EFMedia.js} +40 -38
- package/dist/packages/elements/src/elements/EFSourceMixin.cjs +55 -0
- package/dist/packages/elements/src/elements/EFSourceMixin.d.ts +12 -0
- package/dist/{elements/src/elements/EFSourceMixin.mjs → packages/elements/src/elements/EFSourceMixin.js} +6 -8
- package/dist/packages/elements/src/elements/EFTemporal.cjs +198 -0
- package/dist/packages/elements/src/elements/EFTemporal.d.ts +36 -0
- package/dist/{elements/src/elements/EFTemporal.mjs → packages/elements/src/elements/EFTemporal.js} +6 -22
- package/dist/packages/elements/src/elements/EFTimegroup.browsertest.d.ts +12 -0
- package/{src/elements/EFTimegroup.ts → dist/packages/elements/src/elements/EFTimegroup.cjs} +162 -213
- package/dist/packages/elements/src/elements/EFTimegroup.d.ts +39 -0
- package/dist/{elements/src/elements/EFTimegroup.mjs → packages/elements/src/elements/EFTimegroup.js} +55 -65
- package/{src/elements/EFTimeline.ts → dist/packages/elements/src/elements/EFTimeline.cjs} +5 -3
- package/dist/packages/elements/src/elements/EFTimeline.d.ts +3 -0
- package/dist/{elements/src/elements/EFTimeline.mjs → packages/elements/src/elements/EFTimeline.js} +5 -2
- package/dist/packages/elements/src/elements/EFVideo.cjs +110 -0
- package/dist/packages/elements/src/elements/EFVideo.d.ts +14 -0
- package/dist/{elements/src/elements/EFVideo.mjs → packages/elements/src/elements/EFVideo.js} +10 -32
- package/dist/packages/elements/src/elements/EFWaveform.cjs +235 -0
- package/dist/packages/elements/src/elements/EFWaveform.d.ts +28 -0
- package/dist/{elements/src/elements/EFWaveform.mjs → packages/elements/src/elements/EFWaveform.js} +15 -16
- package/dist/packages/elements/src/elements/FetchMixin.cjs +28 -0
- package/dist/packages/elements/src/elements/FetchMixin.d.ts +8 -0
- package/dist/{elements/src/elements/FetchMixin.mjs → packages/elements/src/elements/FetchMixin.js} +5 -7
- package/dist/packages/elements/src/elements/TimegroupController.cjs +20 -0
- package/dist/packages/elements/src/elements/TimegroupController.d.ts +14 -0
- package/dist/packages/elements/src/elements/durationConverter.cjs +8 -0
- package/dist/packages/elements/src/elements/durationConverter.d.ts +4 -0
- package/dist/{elements/src/elements/durationConverter.mjs → packages/elements/src/elements/durationConverter.js} +1 -1
- package/dist/packages/elements/src/elements/parseTimeToMs.cjs +12 -0
- package/dist/packages/elements/src/elements/parseTimeToMs.d.ts +1 -0
- package/dist/packages/elements/src/elements/parseTimeToMs.js +12 -0
- package/dist/packages/elements/src/elements/util.cjs +11 -0
- package/dist/packages/elements/src/elements/util.d.ts +4 -0
- package/dist/{elements/src/elements/util.mjs → packages/elements/src/elements/util.js} +1 -1
- package/dist/packages/elements/src/gui/EFFilmstrip.cjs +675 -0
- package/dist/packages/elements/src/gui/EFFilmstrip.d.ts +138 -0
- package/dist/{elements/src/gui/EFFilmstrip.mjs → packages/elements/src/gui/EFFilmstrip.js} +57 -55
- package/dist/packages/elements/src/gui/EFWorkbench.cjs +199 -0
- package/dist/packages/elements/src/gui/EFWorkbench.d.ts +44 -0
- package/dist/{elements/src/gui/EFWorkbench.mjs → packages/elements/src/gui/EFWorkbench.js} +27 -49
- package/{src/gui/TWMixin.ts → dist/packages/elements/src/gui/TWMixin.cjs} +11 -10
- package/dist/packages/elements/src/gui/TWMixin.css.cjs +3 -0
- package/dist/packages/elements/src/gui/TWMixin.css.js +4 -0
- package/dist/packages/elements/src/gui/TWMixin.d.ts +3 -0
- package/dist/{elements/src/gui/TWMixin.mjs → packages/elements/src/gui/TWMixin.js} +4 -3
- package/dist/packages/elements/src/index.cjs +47 -0
- package/dist/packages/elements/src/index.d.ts +10 -0
- package/dist/packages/elements/src/index.js +23 -0
- package/dist/style.css +13 -4
- package/package.json +23 -4
- package/dist/elements/src/EF_FRAMEGEN.mjs +0 -130
- package/dist/elements/src/elements/parseTimeToMs.mjs +0 -13
- package/dist/elements/src/elements.mjs +0 -12
- package/dist/elements/src/gui/TWMixin.css.mjs +0 -4
- package/dist/util/awaitAnimationFrame.mjs +0 -11
- package/docker-compose.yaml +0 -17
- package/src/EF_FRAMEGEN.ts +0 -208
- package/src/EF_INTERACTIVE.ts +0 -2
- package/src/elements/CrossUpdateController.ts +0 -18
- package/src/elements/EFAudio.ts +0 -42
- package/src/elements/EFCaptions.ts +0 -202
- package/src/elements/EFImage.ts +0 -70
- package/src/elements/EFMedia.ts +0 -395
- package/src/elements/EFSourceMixin.ts +0 -57
- package/src/elements/EFTemporal.ts +0 -246
- package/src/elements/EFTimegroup.browsertest.ts +0 -360
- package/src/elements/EFVideo.ts +0 -114
- package/src/elements/EFWaveform.ts +0 -407
- package/src/elements/FetchMixin.ts +0 -18
- package/src/elements/TimegroupController.ts +0 -25
- package/src/elements/buildLitFixture.ts +0 -13
- package/src/elements/durationConverter.ts +0 -6
- package/src/elements/parseTimeToMs.ts +0 -10
- package/src/elements/util.ts +0 -24
- package/src/gui/EFFilmstrip.ts +0 -702
- package/src/gui/EFWorkbench.ts +0 -242
- package/src/gui/TWMixin.css +0 -3
- package/src/util.d.ts +0 -1
- /package/dist/{editor/msToTimeCode.mjs → lib/av/msToTimeCode.js} +0 -0
- /package/dist/{util/awaitMicrotask.mjs → lib/util/awaitMicrotask.js} +0 -0
- /package/dist/{elements/src/EF_INTERACTIVE.mjs → packages/elements/src/EF_INTERACTIVE.js} +0 -0
- /package/dist/{elements/src/elements/CrossUpdateController.mjs → packages/elements/src/elements/CrossUpdateController.js} +0 -0
- /package/dist/{elements/src/elements/TimegroupController.mjs → packages/elements/src/elements/TimegroupController.js} +0 -0
|
@@ -1,65 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
70
|
+
return __privateGet(this, _currentTime);
|
|
75
71
|
}
|
|
76
72
|
get currentTimeMs() {
|
|
77
|
-
return this.currentTime *
|
|
73
|
+
return this.currentTime * 1e3;
|
|
78
74
|
}
|
|
79
|
-
set currentTimeMs(ms
|
|
80
|
-
this.currentTime = ms /
|
|
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
|
|
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
|
|
129
|
+
for (const node of this.childTemporals) {
|
|
164
130
|
duration += node.durationMs;
|
|
165
|
-
}
|
|
131
|
+
}
|
|
166
132
|
return duration;
|
|
167
|
-
|
|
133
|
+
}
|
|
134
|
+
case "contain": {
|
|
168
135
|
let maxDuration = 0;
|
|
169
|
-
this.childTemporals
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
|
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(
|
|
291
|
-
|
|
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 ===
|
|
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 /
|
|
349
|
-
offset /
|
|
350
|
-
ctxDurationMs /
|
|
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
|
|
361
|
-
|
|
362
|
-
const 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
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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 {};
|