@editframe/elements 0.19.4-beta.0 → 0.20.1-beta.0
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/elements/ContextProxiesController.d.ts +40 -0
- package/dist/elements/ContextProxiesController.js +69 -0
- package/dist/elements/EFCaptions.d.ts +45 -6
- package/dist/elements/EFCaptions.js +220 -26
- package/dist/elements/EFImage.js +4 -1
- package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +2 -1
- package/dist/elements/EFMedia/AssetIdMediaEngine.js +9 -0
- package/dist/elements/EFMedia/AssetMediaEngine.d.ts +1 -0
- package/dist/elements/EFMedia/AssetMediaEngine.js +11 -0
- package/dist/elements/EFMedia/BaseMediaEngine.d.ts +13 -1
- package/dist/elements/EFMedia/BaseMediaEngine.js +9 -0
- package/dist/elements/EFMedia/JitMediaEngine.d.ts +7 -1
- package/dist/elements/EFMedia/JitMediaEngine.js +15 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +2 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +2 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +1 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +3 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +1 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +1 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +6 -5
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +3 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +2 -0
- package/dist/elements/EFMedia/shared/AudioSpanUtils.js +2 -2
- package/dist/elements/EFMedia/shared/GlobalInputCache.d.ts +39 -0
- package/dist/elements/EFMedia/shared/GlobalInputCache.js +57 -0
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.d.ts +27 -0
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +106 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +1 -1
- package/dist/elements/EFMedia.d.ts +2 -2
- package/dist/elements/EFMedia.js +25 -1
- package/dist/elements/EFSurface.browsertest.d.ts +0 -0
- package/dist/elements/EFSurface.d.ts +30 -0
- package/dist/elements/EFSurface.js +96 -0
- package/dist/elements/EFTemporal.js +7 -6
- package/dist/elements/EFThumbnailStrip.browsertest.d.ts +0 -0
- package/dist/elements/EFThumbnailStrip.d.ts +86 -0
- package/dist/elements/EFThumbnailStrip.js +490 -0
- package/dist/elements/EFThumbnailStrip.media-engine.browsertest.d.ts +0 -0
- package/dist/elements/EFTimegroup.d.ts +6 -1
- package/dist/elements/EFTimegroup.js +53 -11
- package/dist/elements/updateAnimations.browsertest.d.ts +13 -0
- package/dist/elements/updateAnimations.d.ts +5 -0
- package/dist/elements/updateAnimations.js +37 -13
- package/dist/getRenderInfo.js +1 -1
- package/dist/gui/ContextMixin.js +27 -14
- package/dist/gui/EFControls.browsertest.d.ts +0 -0
- package/dist/gui/EFControls.d.ts +38 -0
- package/dist/gui/EFControls.js +51 -0
- package/dist/gui/EFFilmstrip.d.ts +40 -1
- package/dist/gui/EFFilmstrip.js +240 -3
- package/dist/gui/EFPreview.js +2 -1
- package/dist/gui/EFScrubber.d.ts +6 -5
- package/dist/gui/EFScrubber.js +31 -21
- package/dist/gui/EFTimeDisplay.browsertest.d.ts +0 -0
- package/dist/gui/EFTimeDisplay.d.ts +2 -6
- package/dist/gui/EFTimeDisplay.js +13 -23
- package/dist/gui/TWMixin.js +1 -1
- package/dist/gui/currentTimeContext.d.ts +3 -0
- package/dist/gui/currentTimeContext.js +3 -0
- package/dist/gui/durationContext.d.ts +3 -0
- package/dist/gui/durationContext.js +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -1
- package/dist/style.css +1 -1
- package/dist/transcoding/types/index.d.ts +11 -0
- package/dist/utils/LRUCache.d.ts +46 -0
- package/dist/utils/LRUCache.js +382 -1
- package/dist/utils/LRUCache.test.d.ts +1 -0
- package/package.json +2 -2
- package/src/elements/ContextProxiesController.ts +124 -0
- package/src/elements/EFCaptions.browsertest.ts +1820 -0
- package/src/elements/EFCaptions.ts +373 -36
- package/src/elements/EFImage.ts +4 -1
- package/src/elements/EFMedia/AssetIdMediaEngine.ts +30 -1
- package/src/elements/EFMedia/AssetMediaEngine.ts +33 -0
- package/src/elements/EFMedia/BaseMediaEngine.browsertest.ts +3 -8
- package/src/elements/EFMedia/BaseMediaEngine.ts +35 -0
- package/src/elements/EFMedia/JitMediaEngine.ts +34 -0
- package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +6 -5
- package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +5 -0
- package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +8 -5
- package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +5 -5
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +11 -12
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +7 -4
- package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +5 -0
- package/src/elements/EFMedia/shared/AudioSpanUtils.ts +2 -2
- package/src/elements/EFMedia/shared/GlobalInputCache.ts +77 -0
- package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +2 -2
- package/src/elements/EFMedia/shared/RenditionHelpers.ts +2 -2
- package/src/elements/EFMedia/shared/ThumbnailExtractor.ts +227 -0
- package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +1 -1
- package/src/elements/EFMedia.ts +38 -1
- package/src/elements/EFSurface.browsertest.ts +155 -0
- package/src/elements/EFSurface.ts +141 -0
- package/src/elements/EFTemporal.ts +14 -8
- package/src/elements/EFThumbnailStrip.browsertest.ts +591 -0
- package/src/elements/EFThumbnailStrip.media-engine.browsertest.ts +713 -0
- package/src/elements/EFThumbnailStrip.ts +905 -0
- package/src/elements/EFTimegroup.browsertest.ts +56 -7
- package/src/elements/EFTimegroup.ts +88 -16
- package/src/elements/updateAnimations.browsertest.ts +333 -11
- package/src/elements/updateAnimations.ts +68 -19
- package/src/gui/ContextMixin.browsertest.ts +0 -25
- package/src/gui/ContextMixin.ts +44 -20
- package/src/gui/EFControls.browsertest.ts +175 -0
- package/src/gui/EFControls.ts +84 -0
- package/src/gui/EFFilmstrip.ts +323 -4
- package/src/gui/EFPreview.ts +2 -1
- package/src/gui/EFScrubber.ts +29 -25
- package/src/gui/EFTimeDisplay.browsertest.ts +237 -0
- package/src/gui/EFTimeDisplay.ts +12 -40
- package/src/gui/currentTimeContext.ts +5 -0
- package/src/gui/durationContext.ts +3 -0
- package/src/transcoding/types/index.ts +13 -0
- package/src/utils/LRUCache.test.ts +272 -0
- package/src/utils/LRUCache.ts +543 -0
- package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/metadata.json +1 -1
- package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/metadata.json +1 -1
- package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/metadata.json +1 -1
- package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/metadata.json +1 -1
- package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/metadata.json +1 -1
- package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -1
- package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +1 -1
- package/types.json +1 -1
- package/dist/transcoding/cache/CacheManager.d.ts +0 -73
- package/src/transcoding/cache/CacheManager.ts +0 -208
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { TargetController } from "./TargetController.js";
|
|
2
|
+
import { Task } from "@lit/task";
|
|
3
|
+
import { LitElement, css, html } from "lit";
|
|
4
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
5
|
+
import _decorate from "@oxc-project/runtime/helpers/decorate";
|
|
6
|
+
import { createRef, ref } from "lit/directives/ref.js";
|
|
7
|
+
let EFSurface = class EFSurface$1 extends LitElement {
|
|
8
|
+
constructor(..._args) {
|
|
9
|
+
super(..._args);
|
|
10
|
+
this.canvasRef = createRef();
|
|
11
|
+
this.targetElement = null;
|
|
12
|
+
this.target = "";
|
|
13
|
+
this.frameTask = new Task(this, {
|
|
14
|
+
autoRun: false,
|
|
15
|
+
args: () => [this.targetElement],
|
|
16
|
+
task: async ([target]) => {
|
|
17
|
+
if (!target) return;
|
|
18
|
+
try {
|
|
19
|
+
const maybeTask = target.frameTask;
|
|
20
|
+
if (maybeTask && typeof maybeTask.run === "function") {
|
|
21
|
+
maybeTask.run();
|
|
22
|
+
await maybeTask.taskComplete;
|
|
23
|
+
}
|
|
24
|
+
} catch (_err) {}
|
|
25
|
+
this.copyFromTarget(target);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
static {
|
|
30
|
+
this.styles = [css`
|
|
31
|
+
:host {
|
|
32
|
+
display: block;
|
|
33
|
+
position: relative;
|
|
34
|
+
}
|
|
35
|
+
canvas {
|
|
36
|
+
all: inherit;
|
|
37
|
+
width: 100%;
|
|
38
|
+
height: 100%;
|
|
39
|
+
display: block;
|
|
40
|
+
}
|
|
41
|
+
`];
|
|
42
|
+
}
|
|
43
|
+
#targetController = new TargetController(this);
|
|
44
|
+
render() {
|
|
45
|
+
return html`<canvas ${ref(this.canvasRef)}></canvas>`;
|
|
46
|
+
}
|
|
47
|
+
get rootTimegroup() {
|
|
48
|
+
const target = this.targetElement;
|
|
49
|
+
if (target && "rootTimegroup" in target) return target.rootTimegroup;
|
|
50
|
+
let root = this.closest("ef-timegroup");
|
|
51
|
+
while (root?.parentTimegroup) root = root.parentTimegroup;
|
|
52
|
+
return root;
|
|
53
|
+
}
|
|
54
|
+
get currentTimeMs() {
|
|
55
|
+
return this.rootTimegroup?.currentTimeMs ?? 0;
|
|
56
|
+
}
|
|
57
|
+
get durationMs() {
|
|
58
|
+
return this.rootTimegroup?.durationMs ?? 0;
|
|
59
|
+
}
|
|
60
|
+
get startTimeMs() {
|
|
61
|
+
return this.rootTimegroup?.startTimeMs ?? 0;
|
|
62
|
+
}
|
|
63
|
+
get endTimeMs() {
|
|
64
|
+
return this.startTimeMs + this.durationMs;
|
|
65
|
+
}
|
|
66
|
+
updated() {
|
|
67
|
+
if (this.targetElement) this.copyFromTarget(this.targetElement);
|
|
68
|
+
}
|
|
69
|
+
getSourceCanvas(from) {
|
|
70
|
+
const anyEl = from;
|
|
71
|
+
if ("canvasElement" in anyEl) return anyEl.canvasElement ?? null;
|
|
72
|
+
const sr = from.shadowRoot;
|
|
73
|
+
if (sr) {
|
|
74
|
+
const c = sr.querySelector("canvas");
|
|
75
|
+
return c ?? null;
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
copyFromTarget(target) {
|
|
80
|
+
const dst = this.canvasRef.value;
|
|
81
|
+
const src = this.getSourceCanvas(target);
|
|
82
|
+
if (!dst || !src) return;
|
|
83
|
+
if (!src.width || !src.height) return;
|
|
84
|
+
if (dst.width !== src.width || dst.height !== src.height) {
|
|
85
|
+
dst.width = src.width;
|
|
86
|
+
dst.height = src.height;
|
|
87
|
+
}
|
|
88
|
+
const ctx = dst.getContext("2d");
|
|
89
|
+
if (!ctx) return;
|
|
90
|
+
ctx.drawImage(src, 0, 0, dst.width, dst.height);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
_decorate([state()], EFSurface.prototype, "targetElement", void 0);
|
|
94
|
+
_decorate([property({ type: String })], EFSurface.prototype, "target", void 0);
|
|
95
|
+
EFSurface = _decorate([customElement("ef-surface")], EFSurface);
|
|
96
|
+
export { EFSurface };
|
|
@@ -140,25 +140,26 @@ const EFTemporal = (superClass) => {
|
|
|
140
140
|
return void 0;
|
|
141
141
|
}
|
|
142
142
|
get hasOwnDuration() {
|
|
143
|
-
return
|
|
143
|
+
return this.intrinsicDurationMs !== void 0 || this.hasExplicitDuration;
|
|
144
144
|
}
|
|
145
145
|
get intrinsicDurationMs() {
|
|
146
146
|
return void 0;
|
|
147
147
|
}
|
|
148
148
|
get durationMs() {
|
|
149
|
-
|
|
149
|
+
const baseDurationMs = this.intrinsicDurationMs ?? this._durationMs ?? this.parentTimegroup?.durationMs ?? 0;
|
|
150
|
+
if (baseDurationMs === 0) return 0;
|
|
150
151
|
if (this.trimStartMs || this.trimEndMs) {
|
|
151
|
-
const trimmedDurationMs =
|
|
152
|
+
const trimmedDurationMs = baseDurationMs - (this.trimStartMs ?? 0) - (this.trimEndMs ?? 0);
|
|
152
153
|
if (trimmedDurationMs < 0) return 0;
|
|
153
154
|
return trimmedDurationMs;
|
|
154
155
|
}
|
|
155
156
|
if (this.sourceInMs || this.sourceOutMs) {
|
|
156
157
|
const sourceInMs = this.sourceInMs ?? 0;
|
|
157
|
-
const sourceOutMs = this.sourceOutMs ??
|
|
158
|
+
const sourceOutMs = this.sourceOutMs ?? baseDurationMs;
|
|
158
159
|
if (sourceInMs >= sourceOutMs) return 0;
|
|
159
160
|
return sourceOutMs - sourceInMs;
|
|
160
161
|
}
|
|
161
|
-
return
|
|
162
|
+
return baseDurationMs;
|
|
162
163
|
}
|
|
163
164
|
get sourceStartMs() {
|
|
164
165
|
return this.trimStartMs ?? this.sourceInMs ?? 0;
|
|
@@ -284,4 +285,4 @@ const EFTemporal = (superClass) => {
|
|
|
284
285
|
Object.defineProperty(TemporalMixinClass.prototype, EF_TEMPORAL, { value: true });
|
|
285
286
|
return TemporalMixinClass;
|
|
286
287
|
};
|
|
287
|
-
export { EFTemporal, deepGetElementsWithFrameTasks, deepGetTemporalElements, flushStartTimeMsCache,
|
|
288
|
+
export { EFTemporal, deepGetElementsWithFrameTasks, deepGetTemporalElements, flushStartTimeMsCache, resetTemporalCache, shallowGetTemporalElements, timegroupContext };
|
|
File without changes
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { EFVideo } from './EFVideo.js';
|
|
3
|
+
export declare class EFThumbnailStrip extends LitElement {
|
|
4
|
+
static styles: import('lit').CSSResult[];
|
|
5
|
+
canvasRef: import('lit-html/directives/ref').Ref<HTMLCanvasElement>;
|
|
6
|
+
private _targetController;
|
|
7
|
+
private _targetElement;
|
|
8
|
+
get targetElement(): EFVideo | null;
|
|
9
|
+
set targetElement(value: EFVideo | null);
|
|
10
|
+
target: string;
|
|
11
|
+
/**
|
|
12
|
+
* Desired thumbnail width in pixels (height is determined by aspect ratio)
|
|
13
|
+
* Number of thumbnails is derived from this and available strip width
|
|
14
|
+
*/
|
|
15
|
+
thumbnailWidth: number;
|
|
16
|
+
/**
|
|
17
|
+
* Custom start time in milliseconds relative to trimmed timeline (0 = start of trimmed portion)
|
|
18
|
+
* In trimmed mode: 0ms = sourceStartMs, 1000ms = sourceStartMs + 1000ms
|
|
19
|
+
* In intrinsic mode: 0ms = 0ms in source media
|
|
20
|
+
*/
|
|
21
|
+
startTimeMs?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Custom end time in milliseconds relative to trimmed timeline
|
|
24
|
+
* In trimmed mode: relative to sourceStartMs
|
|
25
|
+
* In intrinsic mode: relative to source media start (0ms)
|
|
26
|
+
*/
|
|
27
|
+
endTimeMs?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Use intrinsic duration instead of trimmed duration
|
|
30
|
+
* Accepts "true"/"false" string values or boolean
|
|
31
|
+
*/
|
|
32
|
+
useIntrinsicDuration: boolean;
|
|
33
|
+
private _stripWidth;
|
|
34
|
+
private _stripHeight;
|
|
35
|
+
private _pendingStripWidth;
|
|
36
|
+
private _thumbnailLayoutTask;
|
|
37
|
+
private set stripWidth(value);
|
|
38
|
+
private get stripWidth();
|
|
39
|
+
/**
|
|
40
|
+
* Run thumbnail render task directly with provided layout (bypasses task args dependency)
|
|
41
|
+
*/
|
|
42
|
+
private runThumbnailRenderTask;
|
|
43
|
+
private resizeObserver?;
|
|
44
|
+
private _thumbnailUpdateInProgress;
|
|
45
|
+
private _pendingThumbnailUpdate;
|
|
46
|
+
private _videoPropertyObserver?;
|
|
47
|
+
updated(changedProperties: Map<string | number | symbol, unknown>): void;
|
|
48
|
+
/**
|
|
49
|
+
* Run thumbnail update with responsive debouncing (based on EFTimegroup currentTime pattern)
|
|
50
|
+
*/
|
|
51
|
+
private runThumbnailUpdate;
|
|
52
|
+
private thumbnailLayoutTask;
|
|
53
|
+
/**
|
|
54
|
+
* Calculate layout with a ready media engine
|
|
55
|
+
*/
|
|
56
|
+
private calculateLayoutWithMediaEngine;
|
|
57
|
+
/**
|
|
58
|
+
* Generate layout from calculated time range
|
|
59
|
+
*/
|
|
60
|
+
private generateLayoutFromTimeRange;
|
|
61
|
+
private thumbnailRenderTask;
|
|
62
|
+
/**
|
|
63
|
+
* Render thumbnails with provided layout (main rendering logic)
|
|
64
|
+
*/
|
|
65
|
+
private renderThumbnails;
|
|
66
|
+
connectedCallback(): void;
|
|
67
|
+
disconnectedCallback(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Draw thumbnails to the canvas with cache hits and placeholders
|
|
70
|
+
*/
|
|
71
|
+
private drawThumbnails;
|
|
72
|
+
/**
|
|
73
|
+
* Load missing thumbnails using MediaEngine batch extraction
|
|
74
|
+
*/
|
|
75
|
+
private loadMissingThumbnails;
|
|
76
|
+
/**
|
|
77
|
+
* Convert Canvas to ImageData for caching
|
|
78
|
+
*/
|
|
79
|
+
private canvasToImageData;
|
|
80
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
81
|
+
}
|
|
82
|
+
declare global {
|
|
83
|
+
interface HTMLElementTagNameMap {
|
|
84
|
+
"ef-thumbnail-strip": EFThumbnailStrip;
|
|
85
|
+
}
|
|
86
|
+
}
|