@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.
Files changed (132) hide show
  1. package/dist/elements/ContextProxiesController.d.ts +40 -0
  2. package/dist/elements/ContextProxiesController.js +69 -0
  3. package/dist/elements/EFCaptions.d.ts +45 -6
  4. package/dist/elements/EFCaptions.js +220 -26
  5. package/dist/elements/EFImage.js +4 -1
  6. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +2 -1
  7. package/dist/elements/EFMedia/AssetIdMediaEngine.js +9 -0
  8. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +1 -0
  9. package/dist/elements/EFMedia/AssetMediaEngine.js +11 -0
  10. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +13 -1
  11. package/dist/elements/EFMedia/BaseMediaEngine.js +9 -0
  12. package/dist/elements/EFMedia/JitMediaEngine.d.ts +7 -1
  13. package/dist/elements/EFMedia/JitMediaEngine.js +15 -0
  14. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +2 -1
  15. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +2 -0
  16. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +1 -1
  17. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +3 -1
  18. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +1 -1
  19. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +1 -1
  20. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +6 -5
  21. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +3 -1
  22. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +2 -0
  23. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +2 -2
  24. package/dist/elements/EFMedia/shared/GlobalInputCache.d.ts +39 -0
  25. package/dist/elements/EFMedia/shared/GlobalInputCache.js +57 -0
  26. package/dist/elements/EFMedia/shared/ThumbnailExtractor.d.ts +27 -0
  27. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +106 -0
  28. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +1 -1
  29. package/dist/elements/EFMedia.d.ts +2 -2
  30. package/dist/elements/EFMedia.js +25 -1
  31. package/dist/elements/EFSurface.browsertest.d.ts +0 -0
  32. package/dist/elements/EFSurface.d.ts +30 -0
  33. package/dist/elements/EFSurface.js +96 -0
  34. package/dist/elements/EFTemporal.js +7 -6
  35. package/dist/elements/EFThumbnailStrip.browsertest.d.ts +0 -0
  36. package/dist/elements/EFThumbnailStrip.d.ts +86 -0
  37. package/dist/elements/EFThumbnailStrip.js +490 -0
  38. package/dist/elements/EFThumbnailStrip.media-engine.browsertest.d.ts +0 -0
  39. package/dist/elements/EFTimegroup.d.ts +6 -1
  40. package/dist/elements/EFTimegroup.js +53 -11
  41. package/dist/elements/updateAnimations.browsertest.d.ts +13 -0
  42. package/dist/elements/updateAnimations.d.ts +5 -0
  43. package/dist/elements/updateAnimations.js +37 -13
  44. package/dist/getRenderInfo.js +1 -1
  45. package/dist/gui/ContextMixin.js +27 -14
  46. package/dist/gui/EFControls.browsertest.d.ts +0 -0
  47. package/dist/gui/EFControls.d.ts +38 -0
  48. package/dist/gui/EFControls.js +51 -0
  49. package/dist/gui/EFFilmstrip.d.ts +40 -1
  50. package/dist/gui/EFFilmstrip.js +240 -3
  51. package/dist/gui/EFPreview.js +2 -1
  52. package/dist/gui/EFScrubber.d.ts +6 -5
  53. package/dist/gui/EFScrubber.js +31 -21
  54. package/dist/gui/EFTimeDisplay.browsertest.d.ts +0 -0
  55. package/dist/gui/EFTimeDisplay.d.ts +2 -6
  56. package/dist/gui/EFTimeDisplay.js +13 -23
  57. package/dist/gui/TWMixin.js +1 -1
  58. package/dist/gui/currentTimeContext.d.ts +3 -0
  59. package/dist/gui/currentTimeContext.js +3 -0
  60. package/dist/gui/durationContext.d.ts +3 -0
  61. package/dist/gui/durationContext.js +3 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.js +4 -1
  64. package/dist/style.css +1 -1
  65. package/dist/transcoding/types/index.d.ts +11 -0
  66. package/dist/utils/LRUCache.d.ts +46 -0
  67. package/dist/utils/LRUCache.js +382 -1
  68. package/dist/utils/LRUCache.test.d.ts +1 -0
  69. package/package.json +2 -2
  70. package/src/elements/ContextProxiesController.ts +124 -0
  71. package/src/elements/EFCaptions.browsertest.ts +1820 -0
  72. package/src/elements/EFCaptions.ts +373 -36
  73. package/src/elements/EFImage.ts +4 -1
  74. package/src/elements/EFMedia/AssetIdMediaEngine.ts +30 -1
  75. package/src/elements/EFMedia/AssetMediaEngine.ts +33 -0
  76. package/src/elements/EFMedia/BaseMediaEngine.browsertest.ts +3 -8
  77. package/src/elements/EFMedia/BaseMediaEngine.ts +35 -0
  78. package/src/elements/EFMedia/JitMediaEngine.ts +34 -0
  79. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +6 -5
  80. package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +5 -0
  81. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +8 -5
  82. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +5 -5
  83. package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +11 -12
  84. package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +7 -4
  85. package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +5 -0
  86. package/src/elements/EFMedia/shared/AudioSpanUtils.ts +2 -2
  87. package/src/elements/EFMedia/shared/GlobalInputCache.ts +77 -0
  88. package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +2 -2
  89. package/src/elements/EFMedia/shared/RenditionHelpers.ts +2 -2
  90. package/src/elements/EFMedia/shared/ThumbnailExtractor.ts +227 -0
  91. package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +1 -1
  92. package/src/elements/EFMedia.ts +38 -1
  93. package/src/elements/EFSurface.browsertest.ts +155 -0
  94. package/src/elements/EFSurface.ts +141 -0
  95. package/src/elements/EFTemporal.ts +14 -8
  96. package/src/elements/EFThumbnailStrip.browsertest.ts +591 -0
  97. package/src/elements/EFThumbnailStrip.media-engine.browsertest.ts +713 -0
  98. package/src/elements/EFThumbnailStrip.ts +905 -0
  99. package/src/elements/EFTimegroup.browsertest.ts +56 -7
  100. package/src/elements/EFTimegroup.ts +88 -16
  101. package/src/elements/updateAnimations.browsertest.ts +333 -11
  102. package/src/elements/updateAnimations.ts +68 -19
  103. package/src/gui/ContextMixin.browsertest.ts +0 -25
  104. package/src/gui/ContextMixin.ts +44 -20
  105. package/src/gui/EFControls.browsertest.ts +175 -0
  106. package/src/gui/EFControls.ts +84 -0
  107. package/src/gui/EFFilmstrip.ts +323 -4
  108. package/src/gui/EFPreview.ts +2 -1
  109. package/src/gui/EFScrubber.ts +29 -25
  110. package/src/gui/EFTimeDisplay.browsertest.ts +237 -0
  111. package/src/gui/EFTimeDisplay.ts +12 -40
  112. package/src/gui/currentTimeContext.ts +5 -0
  113. package/src/gui/durationContext.ts +3 -0
  114. package/src/transcoding/types/index.ts +13 -0
  115. package/src/utils/LRUCache.test.ts +272 -0
  116. package/src/utils/LRUCache.ts +543 -0
  117. 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
  118. 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
  119. 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
  120. 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
  121. 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
  122. 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
  123. 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
  124. 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
  125. 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
  126. 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
  127. 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
  128. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -1
  129. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +1 -1
  130. package/types.json +1 -1
  131. package/dist/transcoding/cache/CacheManager.d.ts +0 -73
  132. 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 false;
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
- if (this.intrinsicDurationMs === void 0) return this._durationMs || this.parentTimegroup?.durationMs || 0;
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 = this.intrinsicDurationMs - (this.trimStartMs ?? 0) - (this.trimEndMs ?? 0);
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 ?? this.intrinsicDurationMs;
158
+ const sourceOutMs = this.sourceOutMs ?? baseDurationMs;
158
159
  if (sourceInMs >= sourceOutMs) return 0;
159
160
  return sourceOutMs - sourceInMs;
160
161
  }
161
- return this.intrinsicDurationMs;
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, isEFTemporal, resetTemporalCache, shallowGetTemporalElements, timegroupContext };
288
+ export { EFTemporal, deepGetElementsWithFrameTasks, deepGetTemporalElements, flushStartTimeMsCache, resetTemporalCache, shallowGetTemporalElements, timegroupContext };
@@ -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
+ }