@editframe/elements 0.23.8-beta.0 → 0.25.0-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/DelayedLoadingState.js +31 -0
- package/dist/DelayedLoadingState.js.map +1 -0
- package/dist/EF_FRAMEGEN.d.ts +50 -46
- package/dist/EF_FRAMEGEN.js +5 -1
- package/dist/EF_FRAMEGEN.js.map +1 -0
- package/dist/EF_INTERACTIVE.js +4 -0
- package/dist/EF_INTERACTIVE.js.map +1 -0
- package/dist/EF_RENDERING.js +4 -0
- package/dist/EF_RENDERING.js.map +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js +4 -1
- package/dist/attachContextRoot.js +6 -1
- package/dist/attachContextRoot.js.map +1 -0
- package/dist/elements/CrossUpdateController.js +4 -0
- package/dist/elements/CrossUpdateController.js.map +1 -0
- package/dist/elements/EFAudio.d.ts +24 -16
- package/dist/elements/EFAudio.js +10 -1
- package/dist/elements/EFAudio.js.map +1 -0
- package/dist/elements/EFCaptions.d.ts +118 -109
- package/dist/elements/EFCaptions.js +11 -6
- package/dist/elements/EFCaptions.js.map +1 -0
- package/dist/elements/EFImage.d.ts +31 -20
- package/dist/elements/EFImage.js +6 -1
- package/dist/elements/EFImage.js.map +1 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.js +5 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/AssetMediaEngine.js +12 -0
- package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/BaseMediaEngine.js +53 -0
- package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +47 -46
- package/dist/elements/EFMedia/BufferedSeekingInput.js +6 -1
- package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -0
- package/dist/elements/EFMedia/JitMediaEngine.js +12 -0
- package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +9 -13
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +6 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +6 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js.map +1 -0
- package/dist/elements/EFMedia/shared/AudioSpanUtils.js +18 -2
- package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -0
- package/dist/elements/EFMedia/shared/BufferUtils.d.ts +9 -67
- package/dist/elements/EFMedia/shared/BufferUtils.js +15 -0
- package/dist/elements/EFMedia/shared/BufferUtils.js.map +1 -0
- package/dist/elements/EFMedia/shared/GlobalInputCache.js +29 -0
- package/dist/elements/EFMedia/shared/GlobalInputCache.js.map +1 -0
- package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +11 -17
- package/dist/elements/EFMedia/shared/PrecisionUtils.js +25 -0
- package/dist/elements/EFMedia/shared/PrecisionUtils.js.map +1 -0
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +22 -0
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +13 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +21 -0
- package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +18 -0
- package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +10 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +6 -1
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +16 -2
- package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +9 -13
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js.map +1 -0
- package/dist/elements/EFMedia.d.ts +115 -104
- package/dist/elements/EFMedia.js +25 -1
- package/dist/elements/EFMedia.js.map +1 -0
- package/dist/elements/EFSourceMixin.d.ts +10 -11
- package/dist/elements/EFSourceMixin.js +5 -0
- package/dist/elements/EFSourceMixin.js.map +1 -0
- package/dist/elements/EFSurface.d.ts +35 -27
- package/dist/elements/EFSurface.js +6 -1
- package/dist/elements/EFSurface.js.map +1 -0
- package/dist/elements/EFTemporal.d.ts +200 -213
- package/dist/elements/EFTemporal.js +24 -4
- package/dist/elements/EFTemporal.js.map +1 -0
- package/dist/elements/EFThumbnailStrip.d.ts +91 -83
- package/dist/elements/EFThumbnailStrip.js +49 -4
- package/dist/elements/EFThumbnailStrip.js.map +1 -0
- package/dist/elements/EFTimegroup.d.ts +107 -88
- package/dist/elements/EFTimegroup.js +74 -4
- package/dist/elements/EFTimegroup.js.map +1 -0
- package/dist/elements/EFVideo.d.ts +120 -108
- package/dist/elements/EFVideo.js +46 -2
- package/dist/elements/EFVideo.js.map +1 -0
- package/dist/elements/EFWaveform.d.ts +48 -41
- package/dist/elements/EFWaveform.js +6 -1
- package/dist/elements/EFWaveform.js.map +1 -0
- package/dist/elements/FetchMixin.d.ts +8 -6
- package/dist/elements/FetchMixin.js +4 -0
- package/dist/elements/FetchMixin.js.map +1 -0
- package/dist/elements/SampleBuffer.d.ts +18 -13
- package/dist/elements/SampleBuffer.js +5 -0
- package/dist/elements/SampleBuffer.js.map +1 -0
- package/dist/elements/TargetController.d.ts +23 -24
- package/dist/elements/TargetController.js +8 -3
- package/dist/elements/TargetController.js.map +1 -0
- package/dist/elements/TimegroupController.d.ts +17 -12
- package/dist/elements/TimegroupController.js +4 -0
- package/dist/elements/TimegroupController.js.map +1 -0
- package/dist/elements/durationConverter.js +9 -4
- package/dist/elements/durationConverter.js.map +1 -0
- package/dist/elements/parseTimeToMs.js +4 -0
- package/dist/elements/parseTimeToMs.js.map +1 -0
- package/dist/elements/renderTemporalAudio.js +4 -0
- package/dist/elements/renderTemporalAudio.js.map +1 -0
- package/dist/elements/updateAnimations.js +29 -8
- package/dist/elements/updateAnimations.js.map +1 -0
- package/dist/elements-ZhsB7B5N.css +9 -0
- package/dist/elements-ZhsB7B5N.css.map +1 -0
- package/dist/getRenderInfo.d.ts +53 -47
- package/dist/getRenderInfo.js +5 -0
- package/dist/getRenderInfo.js.map +1 -0
- package/dist/gui/ContextMixin.d.ts +19 -20
- package/dist/gui/ContextMixin.js +32 -1
- package/dist/gui/ContextMixin.js.map +1 -0
- package/dist/gui/Controllable.d.ts +13 -14
- package/dist/gui/Controllable.js +5 -0
- package/dist/gui/Controllable.js.map +1 -0
- package/dist/gui/EFConfiguration.d.ts +18 -14
- package/dist/gui/EFConfiguration.js +6 -1
- package/dist/gui/EFConfiguration.js.map +1 -0
- package/dist/gui/EFControls.d.ts +35 -31
- package/dist/gui/EFControls.js +8 -3
- package/dist/gui/EFControls.js.map +1 -0
- package/dist/gui/EFDial.d.ts +23 -16
- package/dist/gui/EFDial.js +6 -1
- package/dist/gui/EFDial.js.map +1 -0
- package/dist/gui/EFFilmstrip.d.ts +183 -177
- package/dist/gui/EFFilmstrip.js +30 -25
- package/dist/gui/EFFilmstrip.js.map +1 -0
- package/dist/gui/EFFitScale.d.ts +30 -24
- package/dist/gui/EFFitScale.js +6 -1
- package/dist/gui/EFFitScale.js.map +1 -0
- package/dist/gui/EFFocusOverlay.d.ts +22 -14
- package/dist/gui/EFFocusOverlay.js +6 -1
- package/dist/gui/EFFocusOverlay.js.map +1 -0
- package/dist/gui/EFPause.d.ts +24 -18
- package/dist/gui/EFPause.js +6 -1
- package/dist/gui/EFPause.js.map +1 -0
- package/dist/gui/EFPlay.d.ts +24 -18
- package/dist/gui/EFPlay.js +6 -1
- package/dist/gui/EFPlay.js.map +1 -0
- package/dist/gui/EFPreview.d.ts +22 -15
- package/dist/gui/EFPreview.js +9 -1
- package/dist/gui/EFPreview.js.map +1 -0
- package/dist/gui/EFResizableBox.d.ts +39 -32
- package/dist/gui/EFResizableBox.js +8 -3
- package/dist/gui/EFResizableBox.js.map +1 -0
- package/dist/gui/EFScrubber.d.ts +31 -25
- package/dist/gui/EFScrubber.js +6 -1
- package/dist/gui/EFScrubber.js.map +1 -0
- package/dist/gui/EFTimeDisplay.d.ts +21 -14
- package/dist/gui/EFTimeDisplay.js +6 -1
- package/dist/gui/EFTimeDisplay.js.map +1 -0
- package/dist/gui/EFToggleLoop.d.ts +19 -13
- package/dist/gui/EFToggleLoop.js +6 -1
- package/dist/gui/EFToggleLoop.js.map +1 -0
- package/dist/gui/EFTogglePlay.d.ts +23 -17
- package/dist/gui/EFTogglePlay.js +6 -1
- package/dist/gui/EFTogglePlay.js.map +1 -0
- package/dist/gui/EFWorkbench.d.ts +24 -16
- package/dist/gui/EFWorkbench.js +6 -1
- package/dist/gui/EFWorkbench.js.map +1 -0
- package/dist/gui/PlaybackController.d.ts +54 -50
- package/dist/gui/PlaybackController.js +23 -1
- package/dist/gui/PlaybackController.js.map +1 -0
- package/dist/gui/TWMixin.js +5 -1
- package/dist/gui/TWMixin.js.map +1 -0
- package/dist/gui/TWMixin2.js +6 -1
- package/dist/gui/TWMixin2.js.map +1 -0
- package/dist/gui/TargetOrContextMixin.js +5 -0
- package/dist/gui/TargetOrContextMixin.js.map +1 -0
- package/dist/gui/currentTimeContext.js +5 -0
- package/dist/gui/currentTimeContext.js.map +1 -0
- package/dist/gui/durationContext.js +5 -0
- package/dist/gui/durationContext.js.map +1 -0
- package/dist/gui/efContext.js +5 -0
- package/dist/gui/efContext.js.map +1 -0
- package/dist/gui/fetchContext.js +5 -0
- package/dist/gui/fetchContext.js.map +1 -0
- package/dist/gui/focusContext.d.ts +6 -5
- package/dist/gui/focusContext.js +5 -0
- package/dist/gui/focusContext.js.map +1 -0
- package/dist/gui/focusedElementContext.js +5 -0
- package/dist/gui/focusedElementContext.js.map +1 -0
- package/dist/gui/playingContext.js +5 -0
- package/dist/gui/playingContext.js.map +1 -0
- package/dist/index.d.ts +27 -26
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -0
- package/dist/msToTimeCode.js +4 -0
- package/dist/msToTimeCode.js.map +1 -0
- package/dist/otel/BridgeSpanExporter.js +5 -0
- package/dist/otel/BridgeSpanExporter.js.map +1 -0
- package/dist/otel/setupBrowserTracing.js +7 -2
- package/dist/otel/setupBrowserTracing.js.map +1 -0
- package/dist/otel/tracingHelpers.d.ts +7 -34
- package/dist/otel/tracingHelpers.js +34 -2
- package/dist/otel/tracingHelpers.js.map +1 -0
- package/dist/transcoding/cache/RequestDeduplicator.js +25 -0
- package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -0
- package/dist/transcoding/cache/URLTokenDeduplicator.js +23 -0
- package/dist/transcoding/cache/URLTokenDeduplicator.js.map +1 -0
- package/dist/transcoding/types/index.d.ts +96 -270
- package/dist/transcoding/utils/UrlGenerator.d.ts +30 -25
- package/dist/transcoding/utils/UrlGenerator.js +19 -0
- package/dist/transcoding/utils/UrlGenerator.js.map +1 -0
- package/dist/utils/LRUCache.js +44 -0
- package/dist/utils/LRUCache.js.map +1 -0
- package/package.json +11 -24
- package/src/elements/EFCaptions.browsertest.ts +7 -7
- package/src/elements/EFTimegroup.ts +43 -1
- package/src/gui/PlaybackController.ts +6 -1
- package/tsdown.config.ts +36 -0
- package/types.json +1 -1
- package/dist/DelayedLoadingState.d.ts +0 -48
- package/dist/DelayedLoadingState.integration.test.d.ts +0 -1
- package/dist/DelayedLoadingState.test.d.ts +0 -1
- package/dist/EF_INTERACTIVE.d.ts +0 -1
- package/dist/EF_RENDERING.d.ts +0 -1
- package/dist/LoadingDebounce.test.d.ts +0 -1
- package/dist/ManualScrubTest.test.d.ts +0 -1
- package/dist/ScrubResolvedFlashing.test.d.ts +0 -1
- package/dist/ScrubTrackManager.test.d.ts +0 -1
- package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
- package/dist/VideoStuckDiagnostic.test.d.ts +0 -1
- package/dist/attachContextRoot.d.ts +0 -1
- package/dist/elements/ContextProxiesController.d.ts +0 -39
- package/dist/elements/CrossUpdateController.d.ts +0 -8
- package/dist/elements/EFAudio.browsertest.d.ts +0 -0
- package/dist/elements/EFCaptions.browsertest.d.ts +0 -0
- package/dist/elements/EFImage.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +0 -19
- package/dist/elements/EFMedia/AssetIdMediaEngine.test.d.ts +0 -1
- package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/AssetMediaEngine.d.ts +0 -56
- package/dist/elements/EFMedia/BaseMediaEngine.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/BaseMediaEngine.d.ts +0 -103
- package/dist/elements/EFMedia/BufferedSeekingInput.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/JitMediaEngine.d.ts +0 -46
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +0 -9
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +0 -3
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +0 -9
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +0 -4
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +0 -9
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +0 -3
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +0 -7
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +0 -4
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +0 -4
- package/dist/elements/EFMedia/audioTasks/makeAudioTasksVideoOnly.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +0 -3
- package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +0 -7
- package/dist/elements/EFMedia/shared/GlobalInputCache.d.ts +0 -39
- package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +0 -28
- package/dist/elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +0 -11
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.d.ts +0 -27
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +0 -9
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +0 -17
- package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.d.ts +0 -29
- package/dist/elements/EFMedia/videoTasks/ScrubInputCache.d.ts +0 -25
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.d.ts +0 -8
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.d.ts +0 -4
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.d.ts +0 -3
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.d.ts +0 -6
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.d.ts +0 -4
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.d.ts +0 -4
- package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.d.ts +0 -6
- package/dist/elements/EFMedia.browsertest.d.ts +0 -10
- package/dist/elements/EFSurface.browsertest.d.ts +0 -0
- package/dist/elements/EFTemporal.browsertest.d.ts +0 -22
- package/dist/elements/EFThumbnailStrip.browsertest.d.ts +0 -0
- package/dist/elements/EFThumbnailStrip.media-engine.browsertest.d.ts +0 -0
- package/dist/elements/EFTimegroup.browsertest.d.ts +0 -41
- package/dist/elements/EFVideo.browsertest.d.ts +0 -0
- package/dist/elements/FetchContext.browsertest.d.ts +0 -0
- package/dist/elements/TargetController.browsertest.d.ts +0 -19
- package/dist/elements/durationConverter.d.ts +0 -16
- package/dist/elements/parseTimeToMs.d.ts +0 -1
- package/dist/elements/printTaskStatus.d.ts +0 -2
- package/dist/elements/renderTemporalAudio.d.ts +0 -10
- package/dist/elements/updateAnimations.browsertest.d.ts +0 -13
- package/dist/elements/updateAnimations.d.ts +0 -24
- package/dist/elements/util.d.ts +0 -3
- package/dist/gui/ContextMixin.browsertest.d.ts +0 -15
- package/dist/gui/Controllable.browsertest.d.ts +0 -0
- package/dist/gui/EFControls.browsertest.d.ts +0 -11
- package/dist/gui/EFDial.browsertest.d.ts +0 -0
- package/dist/gui/EFFilmstrip.browsertest.d.ts +0 -11
- package/dist/gui/EFPause.browsertest.d.ts +0 -0
- package/dist/gui/EFPlay.browsertest.d.ts +0 -0
- package/dist/gui/EFResizableBox.browsertest.d.ts +0 -0
- package/dist/gui/EFTimeDisplay.browsertest.d.ts +0 -0
- package/dist/gui/TWMixin.d.ts +0 -2
- package/dist/gui/TargetOrContextMixin.d.ts +0 -10
- package/dist/gui/currentTimeContext.d.ts +0 -3
- package/dist/gui/durationContext.d.ts +0 -3
- package/dist/gui/efContext.d.ts +0 -4
- package/dist/gui/fetchContext.d.ts +0 -3
- package/dist/gui/focusedElementContext.d.ts +0 -3
- package/dist/gui/playingContext.d.ts +0 -6
- package/dist/msToTimeCode.d.ts +0 -1
- package/dist/otel/BridgeSpanExporter.d.ts +0 -13
- package/dist/otel/setupBrowserTracing.d.ts +0 -12
- package/dist/style.css +0 -2
- package/dist/transcoding/cache/RequestDeduplicator.d.ts +0 -29
- package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +0 -1
- package/dist/transcoding/cache/URLTokenDeduplicator.d.ts +0 -38
- package/dist/transcoding/cache/URLTokenDeduplicator.test.d.ts +0 -1
- package/dist/transcoding/utils/MediaUtils.d.ts +0 -9
- package/dist/transcoding/utils/constants.d.ts +0 -27
- package/dist/utils/LRUCache.d.ts +0 -80
- package/dist/utils/LRUCache.test.d.ts +0 -1
- /package/dist/{LoadingIndicator.browsertest.d.ts → elements.js} +0 -0
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import { AudioSample, VideoSample } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import { AudioSample, VideoSample } from "mediabunny";
|
|
2
|
+
|
|
3
|
+
//#region src/elements/SampleBuffer.d.ts
|
|
4
|
+
type MediaSample = VideoSample | AudioSample;
|
|
5
|
+
declare class SampleBuffer {
|
|
6
|
+
private buffer;
|
|
7
|
+
private bufferSize;
|
|
8
|
+
constructor(bufferSize?: number);
|
|
9
|
+
push(sample: MediaSample): void;
|
|
10
|
+
clear(): void;
|
|
11
|
+
peek(): MediaSample | undefined;
|
|
12
|
+
find(desiredSeekTimeMs: number): MediaSample | undefined;
|
|
13
|
+
get length(): number;
|
|
14
|
+
get firstTimestamp(): number;
|
|
15
|
+
getContents(): MediaSample[];
|
|
14
16
|
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { MediaSample, SampleBuffer };
|
|
19
|
+
//# sourceMappingURL=SampleBuffer.d.ts.map
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { roundToMilliseconds } from "./EFMedia/shared/PrecisionUtils.js";
|
|
2
|
+
|
|
3
|
+
//#region src/elements/SampleBuffer.ts
|
|
2
4
|
var SampleBuffer = class {
|
|
3
5
|
constructor(bufferSize = 10) {
|
|
4
6
|
this.buffer = [];
|
|
@@ -45,4 +47,7 @@ var SampleBuffer = class {
|
|
|
45
47
|
return [...this.buffer];
|
|
46
48
|
}
|
|
47
49
|
};
|
|
50
|
+
|
|
51
|
+
//#endregion
|
|
48
52
|
export { SampleBuffer };
|
|
53
|
+
//# sourceMappingURL=SampleBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SampleBuffer.js","names":[],"sources":["../../src/elements/SampleBuffer.ts"],"sourcesContent":["import type { AudioSample, VideoSample } from \"mediabunny\";\nimport { roundToMilliseconds } from \"./EFMedia/shared/PrecisionUtils\";\nexport type MediaSample = VideoSample | AudioSample;\n\n// Generic sample buffer that works with both VideoSample and AudioSample\nexport class SampleBuffer {\n private buffer: MediaSample[] = [];\n private bufferSize: number;\n\n constructor(bufferSize = 10) {\n this.bufferSize = bufferSize;\n }\n\n push(sample: MediaSample) {\n // Defensive copy to avoid concurrent modification during iteration\n const currentBuffer = [...this.buffer];\n currentBuffer.push(sample);\n\n if (currentBuffer.length > this.bufferSize) {\n const shifted = currentBuffer.shift();\n if (shifted) {\n try {\n shifted.close();\n } catch (_error) {\n // Sample already closed, continue\n }\n }\n }\n\n // Update buffer atomically\n this.buffer = currentBuffer;\n }\n\n clear() {\n // Get current buffer and clear atomically\n const toClose = this.buffer;\n this.buffer = [];\n\n // Close samples after clearing to avoid holding references\n for (const sample of toClose) {\n try {\n sample.close();\n } catch (_error) {\n // Sample already closed, continue\n }\n }\n }\n\n peek(): MediaSample | undefined {\n // Defensive read - get current buffer state\n const currentBuffer = this.buffer;\n return currentBuffer[0];\n }\n\n find(desiredSeekTimeMs: number): MediaSample | undefined {\n const currentBuffer = [...this.buffer];\n\n if (currentBuffer.length === 0) return undefined;\n\n // Use consistent precision handling across the entire pipeline\n const targetTimeMs = roundToMilliseconds(desiredSeekTimeMs);\n\n // Find the sample that contains the target time\n for (const sample of currentBuffer) {\n const sampleStartMs = roundToMilliseconds((sample.timestamp || 0) * 1000);\n const sampleDurationMs = roundToMilliseconds(\n (sample.duration || 0) * 1000,\n );\n const sampleEndMs = roundToMilliseconds(sampleStartMs + sampleDurationMs);\n\n // Check if the desired time falls within this sample's time span [start, end], inclusive of end\n if (targetTimeMs >= sampleStartMs && targetTimeMs < sampleEndMs) {\n return sample;\n }\n }\n\n return undefined; // No sample contains the target time\n }\n\n get length() {\n return this.buffer.length;\n }\n\n get firstTimestamp() {\n // Defensive read - get current buffer state\n const currentBuffer = this.buffer;\n return currentBuffer[0]?.timestamp || 0;\n }\n\n getContents(): MediaSample[] {\n // Defensive copy to avoid concurrent modification during iteration\n return [...this.buffer];\n }\n}\n"],"mappings":";;;AAKA,IAAa,eAAb,MAA0B;CAIxB,YAAY,aAAa,IAAI;gBAHG,EAAE;AAIhC,OAAK,aAAa;;CAGpB,KAAK,QAAqB;EAExB,MAAM,gBAAgB,CAAC,GAAG,KAAK,OAAO;AACtC,gBAAc,KAAK,OAAO;AAE1B,MAAI,cAAc,SAAS,KAAK,YAAY;GAC1C,MAAM,UAAU,cAAc,OAAO;AACrC,OAAI,QACF,KAAI;AACF,YAAQ,OAAO;YACR,QAAQ;;AAOrB,OAAK,SAAS;;CAGhB,QAAQ;EAEN,MAAM,UAAU,KAAK;AACrB,OAAK,SAAS,EAAE;AAGhB,OAAK,MAAM,UAAU,QACnB,KAAI;AACF,UAAO,OAAO;WACP,QAAQ;;CAMrB,OAAgC;AAG9B,SADsB,KAAK,OACN;;CAGvB,KAAK,mBAAoD;EACvD,MAAM,gBAAgB,CAAC,GAAG,KAAK,OAAO;AAEtC,MAAI,cAAc,WAAW,EAAG,QAAO;EAGvC,MAAM,eAAe,oBAAoB,kBAAkB;AAG3D,OAAK,MAAM,UAAU,eAAe;GAClC,MAAM,gBAAgB,qBAAqB,OAAO,aAAa,KAAK,IAAK;GAIzE,MAAM,cAAc,oBAAoB,gBAHf,qBACtB,OAAO,YAAY,KAAK,IAC1B,CACwE;AAGzE,OAAI,gBAAgB,iBAAiB,eAAe,YAClD,QAAO;;;CAOb,IAAI,SAAS;AACX,SAAO,KAAK,OAAO;;CAGrB,IAAI,iBAAiB;AAGnB,SADsB,KAAK,OACN,IAAI,aAAa;;CAGxC,cAA6B;AAE3B,SAAO,CAAC,GAAG,KAAK,OAAO"}
|
|
@@ -1,25 +1,24 @@
|
|
|
1
|
-
import { LitElement, ReactiveController } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { LitElement, ReactiveController } from "lit";
|
|
2
|
+
|
|
3
|
+
//#region src/elements/TargetController.d.ts
|
|
4
|
+
|
|
5
|
+
declare class TargetController implements ReactiveController {
|
|
6
|
+
private host;
|
|
7
|
+
private targetController;
|
|
8
|
+
private currentTargetString;
|
|
9
|
+
constructor(host: LitElement & {
|
|
10
|
+
targetElement: Element | null;
|
|
11
|
+
target: string;
|
|
12
|
+
});
|
|
13
|
+
private registryCallback;
|
|
14
|
+
private updateTarget;
|
|
15
|
+
private connectToTarget;
|
|
16
|
+
private disconnectFromTarget;
|
|
17
|
+
private get registry();
|
|
18
|
+
hostDisconnected(): void;
|
|
19
|
+
hostConnected(): void;
|
|
20
|
+
hostUpdate(): void;
|
|
5
21
|
}
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
private host;
|
|
10
|
-
private targetController;
|
|
11
|
-
private currentTargetString;
|
|
12
|
-
constructor(host: LitElement & {
|
|
13
|
-
targetElement: Element | null;
|
|
14
|
-
target: string;
|
|
15
|
-
});
|
|
16
|
-
private registryCallback;
|
|
17
|
-
private updateTarget;
|
|
18
|
-
private connectToTarget;
|
|
19
|
-
private disconnectFromTarget;
|
|
20
|
-
private get registry();
|
|
21
|
-
hostDisconnected(): void;
|
|
22
|
-
hostConnected(): void;
|
|
23
|
-
hostUpdate(): void;
|
|
24
|
-
}
|
|
25
|
-
export {};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { TargetController };
|
|
24
|
+
//# sourceMappingURL=TargetController.d.ts.map
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
//#region src/elements/TargetController.ts
|
|
4
|
+
const EF_TARGETABLE = Symbol("EF_TARGETABLE");
|
|
3
5
|
var TargetRegistry = class {
|
|
4
6
|
constructor() {
|
|
5
7
|
this.idMap = /* @__PURE__ */ new Map();
|
|
@@ -28,8 +30,8 @@ var TargetRegistry = class {
|
|
|
28
30
|
this.callbacks.delete(id);
|
|
29
31
|
}
|
|
30
32
|
};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
const documentRegistries = /* @__PURE__ */ new WeakMap();
|
|
34
|
+
const getRegistry = (root) => {
|
|
33
35
|
let registry = documentRegistries.get(root);
|
|
34
36
|
if (!registry) {
|
|
35
37
|
registry = new TargetRegistry();
|
|
@@ -136,4 +138,7 @@ var TargetController = class {
|
|
|
136
138
|
}
|
|
137
139
|
}
|
|
138
140
|
};
|
|
141
|
+
|
|
142
|
+
//#endregion
|
|
139
143
|
export { EFTargetable, TargetController };
|
|
144
|
+
//# sourceMappingURL=TargetController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TargetController.js","names":["#registry","host: LitElement"],"sources":["../../src/elements/TargetController.ts"],"sourcesContent":["import { LitElement, type ReactiveController } from \"lit\";\n\ntype Constructor<T = {}> = new (...args: any[]) => T;\n\n// Symbol to identify elements that can be targeted\nconst EF_TARGETABLE = Symbol(\"EF_TARGETABLE\");\n\nclass TargetRegistry {\n private idMap = new Map<string, LitElement>();\n private callbacks = new Map<\n string,\n Set<(target: LitElement | undefined) => void>\n >();\n\n subscribe(id: string, callback: (target: LitElement | undefined) => void) {\n this.callbacks.set(id, this.callbacks.get(id) ?? new Set());\n this.callbacks.get(id)?.add(callback);\n }\n\n unsubscribe(\n id: string | null,\n callback: (target: LitElement | undefined) => void,\n ) {\n if (id === null) {\n return;\n }\n this.callbacks.get(id)?.delete(callback);\n if (this.callbacks.get(id)?.size === 0) {\n this.callbacks.delete(id);\n }\n }\n\n get(id: string) {\n return this.idMap.get(id);\n }\n\n register(id: string, target: LitElement) {\n this.idMap.set(id, target);\n for (const callback of this.callbacks.get(id) ?? []) {\n callback(target);\n }\n }\n\n unregister(id: string, target: LitElement) {\n if (this.idMap.get(id) !== target) {\n // Avoid unregistering a target that is not the current target\n return;\n }\n for (const callback of this.callbacks.get(id) ?? []) {\n callback(undefined);\n }\n this.idMap.delete(id);\n this.callbacks.delete(id);\n }\n}\n\n// Map of root nodes to their target registries\nconst documentRegistries = new WeakMap<Node, TargetRegistry>();\n\nconst getRegistry = (root: Node) => {\n let registry = documentRegistries.get(root);\n if (!registry) {\n registry = new TargetRegistry();\n documentRegistries.set(root, registry);\n }\n return registry;\n};\n\nexport declare class TargetableMixinInterface {\n id: string;\n}\n\nexport const isEFTargetable = (obj: any): obj is TargetableMixinInterface =>\n obj[EF_TARGETABLE];\n\nexport const EFTargetable = <T extends Constructor<LitElement>>(\n superClass: T,\n) => {\n class TargetableElement extends superClass {\n #registry: TargetRegistry | null = null;\n\n static get observedAttributes(): string[] {\n // Get parent's observed attributes\n const parentAttributes = (superClass as any).observedAttributes || [];\n // Add 'id' if not already present\n return [...new Set([...parentAttributes, \"id\"])];\n }\n\n private updateRegistry(oldValue: string, newValue: string) {\n if (!this.#registry) return;\n if (oldValue === newValue) return;\n\n if (oldValue) {\n this.#registry.unregister(oldValue, this);\n }\n if (newValue) {\n this.#registry.register(newValue, this);\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.#registry = getRegistry(this.getRootNode());\n const initialId = this.getAttribute(\"id\");\n if (initialId) {\n this.updateRegistry(\"\", initialId);\n }\n }\n\n attributeChangedCallback(\n name: string,\n old: string | null,\n value: string | null,\n ) {\n super.attributeChangedCallback(name, old, value);\n if (name === \"id\") {\n this.updateRegistry(old ?? \"\", value ?? \"\");\n }\n }\n\n disconnectedCallback() {\n if (this.#registry) {\n this.updateRegistry(this.id, \"\");\n this.#registry = null;\n }\n super.disconnectedCallback();\n }\n }\n\n Object.defineProperty(TargetableElement.prototype, EF_TARGETABLE, {\n value: true,\n });\n\n return TargetableElement as T;\n};\n\nclass TargetUpdateController implements ReactiveController {\n constructor(private host: LitElement) {}\n\n hostConnected() {\n this.host.requestUpdate();\n }\n\n hostDisconnected() {\n this.host.requestUpdate();\n }\n\n hostUpdate() {\n this.host.requestUpdate();\n }\n}\n\nexport class TargetController implements ReactiveController {\n private host: LitElement & { targetElement: Element | null; target: string };\n private targetController: ReactiveController | null = null;\n private currentTargetString: string | null = null;\n\n constructor(\n host: LitElement & { targetElement: Element | null; target: string },\n ) {\n this.host = host;\n this.host.addController(this);\n this.currentTargetString = this.host.target;\n if (this.currentTargetString) {\n this.registry.subscribe(this.currentTargetString, this.registryCallback);\n }\n }\n\n private registryCallback = (target: LitElement | undefined) => {\n this.host.targetElement = target ?? null;\n };\n\n private updateTarget() {\n const newTarget = this.registry.get(this.host.target);\n if (this.host.targetElement !== newTarget) {\n this.disconnectFromTarget();\n this.host.targetElement = newTarget ?? (null as Element | null);\n this.connectToTarget();\n this.host.requestUpdate(\"targetElement\");\n }\n }\n\n private connectToTarget() {\n if (this.host.targetElement instanceof LitElement) {\n this.targetController = new TargetUpdateController(this.host);\n this.host.targetElement.addController(this.targetController);\n }\n }\n\n private disconnectFromTarget() {\n if (\n this.host.targetElement instanceof LitElement &&\n this.targetController\n ) {\n this.host.targetElement.removeController(this.targetController);\n this.targetController = null;\n }\n }\n\n private get registry() {\n const root = this.host.getRootNode();\n return getRegistry(root);\n }\n\n hostDisconnected() {\n this.disconnectFromTarget();\n }\n\n hostConnected() {\n this.updateTarget();\n }\n\n hostUpdate() {\n if (this.currentTargetString !== this.host.target) {\n this.registry.unsubscribe(\n this.currentTargetString,\n this.registryCallback,\n );\n this.registry.subscribe(this.host.target, this.registryCallback);\n this.updateTarget();\n this.currentTargetString = this.host.target;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { EFTimegroup } from "./EFTimegroup.js";
|
|
2
|
+
import { LitElement, ReactiveController } from "lit";
|
|
3
|
+
|
|
4
|
+
//#region src/elements/TimegroupController.d.ts
|
|
5
|
+
declare class TimegroupController implements ReactiveController {
|
|
6
|
+
private host;
|
|
7
|
+
private child;
|
|
8
|
+
constructor(host: EFTimegroup, child: {
|
|
9
|
+
currentTimeMs: number;
|
|
10
|
+
startTimeMs?: number;
|
|
11
|
+
} & LitElement);
|
|
12
|
+
remove(): void;
|
|
13
|
+
hostDisconnected(): void;
|
|
14
|
+
hostUpdated(): void;
|
|
13
15
|
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { TimegroupController };
|
|
18
|
+
//# sourceMappingURL=TimegroupController.d.ts.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
//#region src/elements/TimegroupController.ts
|
|
1
2
|
var TimegroupController = class {
|
|
2
3
|
constructor(host, child) {
|
|
3
4
|
this.host = host;
|
|
@@ -16,4 +17,7 @@ var TimegroupController = class {
|
|
|
16
17
|
this.child.currentTimeMs = newChildTimeMs;
|
|
17
18
|
}
|
|
18
19
|
};
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
19
22
|
export { TimegroupController };
|
|
23
|
+
//# sourceMappingURL=TimegroupController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimegroupController.js","names":["host: EFTimegroup","child: { currentTimeMs: number; startTimeMs?: number } & LitElement"],"sources":["../../src/elements/TimegroupController.ts"],"sourcesContent":["import type { LitElement, ReactiveController } from \"lit\";\nimport type { EFTimegroup } from \"./EFTimegroup.js\";\n\nexport class TimegroupController implements ReactiveController {\n constructor(\n private host: EFTimegroup,\n private child: { currentTimeMs: number; startTimeMs?: number } & LitElement,\n ) {\n this.host.addController(this);\n }\n\n remove() {\n this.host.removeController(this);\n }\n\n hostDisconnected(): void {\n this.host.removeController(this);\n }\n\n hostUpdated(): void {\n this.child.requestUpdate();\n const newChildTimeMs =\n this.host.currentTimeMs - (this.child.startTimeMs ?? 0);\n this.child.currentTimeMs = newChildTimeMs;\n }\n}\n"],"mappings":";AAGA,IAAa,sBAAb,MAA+D;CAC7D,YACE,AAAQA,MACR,AAAQC,OACR;EAFQ;EACA;AAER,OAAK,KAAK,cAAc,KAAK;;CAG/B,SAAS;AACP,OAAK,KAAK,iBAAiB,KAAK;;CAGlC,mBAAyB;AACvB,OAAK,KAAK,iBAAiB,KAAK;;CAGlC,cAAoB;AAClB,OAAK,MAAM,eAAe;EAC1B,MAAM,iBACJ,KAAK,KAAK,iBAAiB,KAAK,MAAM,eAAe;AACvD,OAAK,MAAM,gBAAgB"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { parseTimeToMs } from "./parseTimeToMs.js";
|
|
2
|
+
|
|
3
|
+
//#region src/elements/durationConverter.ts
|
|
2
4
|
const durationConverter = {
|
|
3
5
|
fromAttribute: (value) => value === null ? null : parseTimeToMs(value),
|
|
4
6
|
toAttribute: (value) => value === null ? null : `${value}s`
|
|
5
7
|
};
|
|
6
|
-
|
|
8
|
+
const positiveDurationConverter = (error) => {
|
|
7
9
|
return {
|
|
8
10
|
fromAttribute: (value) => {
|
|
9
11
|
if (value === null) return null;
|
|
@@ -13,7 +15,10 @@ var positiveDurationConverter = (error) => {
|
|
|
13
15
|
toAttribute: (value) => value === null ? null : `${value}s`
|
|
14
16
|
};
|
|
15
17
|
};
|
|
16
|
-
positiveDurationConverter("Trimstart & trimend must be a positive value in milliseconds or seconds (1s, 1000ms)");
|
|
17
|
-
positiveDurationConverter("Image duration must be a positive value in milliseconds or seconds (1s, 1000ms)");
|
|
18
|
-
positiveDurationConverter("Sourcein & sourceout must be a positive value in milliseconds or seconds (1s, 1000ms)");
|
|
18
|
+
const trimDurationConverter = positiveDurationConverter("Trimstart & trimend must be a positive value in milliseconds or seconds (1s, 1000ms)");
|
|
19
|
+
const imageDurationConverter = positiveDurationConverter("Image duration must be a positive value in milliseconds or seconds (1s, 1000ms)");
|
|
20
|
+
const sourceDurationConverter = positiveDurationConverter("Sourcein & sourceout must be a positive value in milliseconds or seconds (1s, 1000ms)");
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
19
23
|
export { durationConverter };
|
|
24
|
+
//# sourceMappingURL=durationConverter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durationConverter.js","names":[],"sources":["../../src/elements/durationConverter.ts"],"sourcesContent":["import { parseTimeToMs } from \"./parseTimeToMs.js\";\n\nexport const durationConverter = {\n fromAttribute: (value: string | null) =>\n value === null ? null : parseTimeToMs(value),\n toAttribute: (value: number | null) => (value === null ? null : `${value}s`),\n};\n\nconst positiveDurationConverter = (error: string) => {\n return {\n fromAttribute: (value: string | null): number | null => {\n if (value === null) {\n return null;\n }\n if (value.startsWith(\"-\")) {\n throw new Error(error);\n }\n return parseTimeToMs(value);\n },\n toAttribute: (value: number | null) =>\n value === null ? null : `${value}s`,\n };\n};\n\nexport const trimDurationConverter = positiveDurationConverter(\n \"Trimstart & trimend must be a positive value in milliseconds or seconds (1s, 1000ms)\",\n);\n\nexport const imageDurationConverter = positiveDurationConverter(\n \"Image duration must be a positive value in milliseconds or seconds (1s, 1000ms)\",\n);\n\nexport const sourceDurationConverter = positiveDurationConverter(\n \"Sourcein & sourceout must be a positive value in milliseconds or seconds (1s, 1000ms)\",\n);\n"],"mappings":";;;AAEA,MAAa,oBAAoB;CAC/B,gBAAgB,UACd,UAAU,OAAO,OAAO,cAAc,MAAM;CAC9C,cAAc,UAA0B,UAAU,OAAO,OAAO,GAAG,MAAM;CAC1E;AAED,MAAM,6BAA6B,UAAkB;AACnD,QAAO;EACL,gBAAgB,UAAwC;AACtD,OAAI,UAAU,KACZ,QAAO;AAET,OAAI,MAAM,WAAW,IAAI,CACvB,OAAM,IAAI,MAAM,MAAM;AAExB,UAAO,cAAc,MAAM;;EAE7B,cAAc,UACZ,UAAU,OAAO,OAAO,GAAG,MAAM;EACpC;;AAGH,MAAa,wBAAwB,0BACnC,uFACD;AAED,MAAa,yBAAyB,0BACpC,kFACD;AAED,MAAa,0BAA0B,0BACrC,wFACD"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
//#region src/elements/parseTimeToMs.ts
|
|
1
2
|
const parseTimeToMs = (time) => {
|
|
2
3
|
if (time.endsWith("ms")) return Number.parseFloat(time);
|
|
3
4
|
if (time.endsWith("s")) return Number.parseFloat(time) * 1e3;
|
|
4
5
|
throw new Error("Time must be in milliseconds or seconds (10s, 10000ms)");
|
|
5
6
|
};
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
6
9
|
export { parseTimeToMs };
|
|
10
|
+
//# sourceMappingURL=parseTimeToMs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseTimeToMs.js","names":[],"sources":["../../src/elements/parseTimeToMs.ts"],"sourcesContent":["export const parseTimeToMs = (time: string) => {\n if (time.endsWith(\"ms\")) {\n return Number.parseFloat(time);\n }\n if (time.endsWith(\"s\")) {\n return Number.parseFloat(time) * 1000;\n }\n throw new Error(\"Time must be in milliseconds or seconds (10s, 10000ms)\");\n};\n"],"mappings":";AAAA,MAAa,iBAAiB,SAAiB;AAC7C,KAAI,KAAK,SAAS,KAAK,CACrB,QAAO,OAAO,WAAW,KAAK;AAEhC,KAAI,KAAK,SAAS,IAAI,CACpB,QAAO,OAAO,WAAW,KAAK,GAAG;AAEnC,OAAM,IAAI,MAAM,yDAAyD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
//#region src/elements/renderTemporalAudio.ts
|
|
1
2
|
async function renderTemporalAudio(host, fromMs, toMs) {
|
|
2
3
|
const aacFrames = 48e3 * ((toMs - fromMs) / 1e3) / 1024;
|
|
3
4
|
const contextSize = Math.round(aacFrames) * 1024;
|
|
@@ -32,4 +33,7 @@ async function renderTemporalAudio(host, fromMs, toMs) {
|
|
|
32
33
|
}));
|
|
33
34
|
return audioContext.startRendering();
|
|
34
35
|
}
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
35
38
|
export { renderTemporalAudio };
|
|
39
|
+
//# sourceMappingURL=renderTemporalAudio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderTemporalAudio.js","names":[],"sources":["../../src/elements/renderTemporalAudio.ts"],"sourcesContent":["import type { EFMedia } from \"./EFMedia.js\";\n\ninterface TemporalAudioHost {\n startTimeMs: number;\n endTimeMs: number;\n durationMs: number;\n getMediaElements(): EFMedia[];\n waitForMediaDurations?(): Promise<void>;\n}\n\nexport async function renderTemporalAudio(\n host: TemporalAudioHost,\n fromMs: number,\n toMs: number,\n): Promise<AudioBuffer> {\n const durationMs = toMs - fromMs;\n const duration = durationMs / 1000;\n const exactSamples = 48000 * duration;\n const aacFrames = exactSamples / 1024;\n const alignedFrames = Math.round(aacFrames);\n const contextSize = alignedFrames * 1024;\n\n if (contextSize <= 0) {\n throw new Error(\n `Duration must be greater than 0 when rendering audio. ${contextSize}ms`,\n );\n }\n\n const audioContext = new OfflineAudioContext(2, contextSize, 48000);\n\n if (host.waitForMediaDurations) {\n await host.waitForMediaDurations();\n }\n\n const abortController = new AbortController();\n\n await Promise.all(\n host.getMediaElements().map(async (mediaElement) => {\n if (mediaElement.mute) {\n return;\n }\n\n const mediaStartsBeforeEnd = mediaElement.startTimeMs <= toMs;\n const mediaEndsAfterStart = mediaElement.endTimeMs >= fromMs;\n const mediaOverlaps = mediaStartsBeforeEnd && mediaEndsAfterStart;\n if (!mediaOverlaps) {\n return;\n }\n\n const mediaLocalFromMs = Math.max(0, fromMs - mediaElement.startTimeMs);\n const mediaLocalToMs = Math.min(\n mediaElement.endTimeMs - mediaElement.startTimeMs,\n toMs - mediaElement.startTimeMs,\n );\n\n if (mediaLocalFromMs >= mediaLocalToMs) {\n return;\n }\n\n const sourceInMs =\n mediaElement.sourceInMs || mediaElement.trimStartMs || 0;\n const mediaSourceFromMs = mediaLocalFromMs + sourceInMs;\n const mediaSourceToMs = mediaLocalToMs + sourceInMs;\n\n const audio = await mediaElement.fetchAudioSpanningTime(\n mediaSourceFromMs,\n mediaSourceToMs,\n abortController.signal,\n );\n if (!audio) {\n return;\n }\n\n const bufferSource = audioContext.createBufferSource();\n bufferSource.buffer = await audioContext.decodeAudioData(\n await audio.blob.arrayBuffer(),\n );\n bufferSource.connect(audioContext.destination);\n\n const ctxStartMs = Math.max(0, mediaElement.startTimeMs - fromMs);\n\n const requestedSourceFromMs = mediaSourceFromMs;\n const actualSourceStartMs = audio.startMs;\n const offsetInBufferMs = requestedSourceFromMs - actualSourceStartMs;\n\n const safeOffsetMs = Math.max(0, offsetInBufferMs);\n\n const requestedDurationMs = mediaSourceToMs - mediaSourceFromMs;\n const availableAudioMs = audio.endMs - audio.startMs;\n const actualDurationMs = Math.min(\n requestedDurationMs,\n availableAudioMs - safeOffsetMs,\n );\n\n if (actualDurationMs <= 0) {\n return;\n }\n\n bufferSource.start(\n ctxStartMs / 1000,\n safeOffsetMs / 1000,\n actualDurationMs / 1000,\n );\n }),\n );\n\n return audioContext.startRendering();\n}\n"],"mappings":";AAUA,eAAsB,oBACpB,MACA,QACA,MACsB;CAItB,MAAM,YADe,SAFF,OAAO,UACI,OAEG;CAEjC,MAAM,cADgB,KAAK,MAAM,UAAU,GACP;AAEpC,KAAI,eAAe,EACjB,OAAM,IAAI,MACR,yDAAyD,YAAY,IACtE;CAGH,MAAM,eAAe,IAAI,oBAAoB,GAAG,aAAa,KAAM;AAEnE,KAAI,KAAK,sBACP,OAAM,KAAK,uBAAuB;CAGpC,MAAM,kBAAkB,IAAI,iBAAiB;AAE7C,OAAM,QAAQ,IACZ,KAAK,kBAAkB,CAAC,IAAI,OAAO,iBAAiB;AAClD,MAAI,aAAa,KACf;EAGF,MAAM,uBAAuB,aAAa,eAAe;EACzD,MAAM,sBAAsB,aAAa,aAAa;AAEtD,MAAI,EADkB,wBAAwB,qBAE5C;EAGF,MAAM,mBAAmB,KAAK,IAAI,GAAG,SAAS,aAAa,YAAY;EACvE,MAAM,iBAAiB,KAAK,IAC1B,aAAa,YAAY,aAAa,aACtC,OAAO,aAAa,YACrB;AAED,MAAI,oBAAoB,eACtB;EAGF,MAAM,aACJ,aAAa,cAAc,aAAa,eAAe;EACzD,MAAM,oBAAoB,mBAAmB;EAC7C,MAAM,kBAAkB,iBAAiB;EAEzC,MAAM,QAAQ,MAAM,aAAa,uBAC/B,mBACA,iBACA,gBAAgB,OACjB;AACD,MAAI,CAAC,MACH;EAGF,MAAM,eAAe,aAAa,oBAAoB;AACtD,eAAa,SAAS,MAAM,aAAa,gBACvC,MAAM,MAAM,KAAK,aAAa,CAC/B;AACD,eAAa,QAAQ,aAAa,YAAY;EAE9C,MAAM,aAAa,KAAK,IAAI,GAAG,aAAa,cAAc,OAAO;EAIjE,MAAM,mBAFwB,oBACF,MAAM;EAGlC,MAAM,eAAe,KAAK,IAAI,GAAG,iBAAiB;EAElD,MAAM,sBAAsB,kBAAkB;EAC9C,MAAM,mBAAmB,MAAM,QAAQ,MAAM;EAC7C,MAAM,mBAAmB,KAAK,IAC5B,qBACA,mBAAmB,aACpB;AAED,MAAI,oBAAoB,EACtB;AAGF,eAAa,MACX,aAAa,KACb,eAAe,KACf,mBAAmB,IACpB;GACD,CACH;AAED,QAAO,aAAa,gBAAgB"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { deepGetTemporalElements } from "./EFTemporal.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
|
|
3
|
+
//#region src/elements/updateAnimations.ts
|
|
4
|
+
const ANIMATION_PRECISION_OFFSET = .1;
|
|
5
|
+
const DEFAULT_ANIMATION_ITERATIONS = 1;
|
|
6
|
+
const PROGRESS_PROPERTY = "--ef-progress";
|
|
7
|
+
const DURATION_PROPERTY = "--ef-duration";
|
|
8
|
+
const TRANSITION_DURATION_PROPERTY = "--ef-transition-duration";
|
|
9
|
+
const TRANSITION_OUT_START_PROPERTY = "--ef-transition-out-start";
|
|
10
|
+
/**
|
|
11
|
+
* Evaluates what the element's state should be based on the timeline
|
|
12
|
+
*/
|
|
8
13
|
const evaluateTemporalState = (element) => {
|
|
9
14
|
const timelineTimeMs = (element.rootTimegroup ?? element).currentTimeMs;
|
|
10
15
|
const progress = element.durationMs <= 0 ? 1 : Math.max(0, Math.min(1, element.currentTimeMs / element.durationMs));
|
|
@@ -17,6 +22,10 @@ const evaluateTemporalState = (element) => {
|
|
|
17
22
|
timelineTimeMs
|
|
18
23
|
};
|
|
19
24
|
};
|
|
25
|
+
/**
|
|
26
|
+
* Evaluates element visibility specifically for animation coordination
|
|
27
|
+
* Uses inclusive end boundaries to prevent animation jumps at exact boundaries
|
|
28
|
+
*/
|
|
20
29
|
const evaluateTemporalStateForAnimation = (element) => {
|
|
21
30
|
const timelineTimeMs = (element.rootTimegroup ?? element).currentTimeMs;
|
|
22
31
|
return {
|
|
@@ -25,7 +34,10 @@ const evaluateTemporalStateForAnimation = (element) => {
|
|
|
25
34
|
timelineTimeMs
|
|
26
35
|
};
|
|
27
36
|
};
|
|
28
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Updates the visual state (CSS + display) to match temporal state
|
|
39
|
+
*/
|
|
40
|
+
const updateVisualState = (element, state) => {
|
|
29
41
|
element.style.setProperty(PROGRESS_PROPERTY, `${state.progress * 100}%`);
|
|
30
42
|
if (!state.isVisible) {
|
|
31
43
|
if (element.style.display !== "none") element.style.display = "none";
|
|
@@ -36,7 +48,10 @@ var updateVisualState = (element, state) => {
|
|
|
36
48
|
element.style.setProperty(TRANSITION_DURATION_PROPERTY, `${element.parentTimegroup?.overlapMs ?? 0}ms`);
|
|
37
49
|
element.style.setProperty(TRANSITION_OUT_START_PROPERTY, `${element.durationMs - (element.parentTimegroup?.overlapMs ?? 0)}ms`);
|
|
38
50
|
};
|
|
39
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Coordinates animations for a single element and its subtree, using the element as the time source
|
|
53
|
+
*/
|
|
54
|
+
const coordinateAnimationsForSingleElement = (element) => {
|
|
40
55
|
const animations = element.getAnimations({ subtree: true });
|
|
41
56
|
for (const animation of animations) {
|
|
42
57
|
if (animation.playState === "running") animation.pause();
|
|
@@ -67,6 +82,9 @@ var coordinateAnimationsForSingleElement = (element) => {
|
|
|
67
82
|
}
|
|
68
83
|
}
|
|
69
84
|
};
|
|
85
|
+
/**
|
|
86
|
+
* Main function: synchronizes DOM element with timeline
|
|
87
|
+
*/
|
|
70
88
|
const updateAnimations = (element) => {
|
|
71
89
|
const temporalState = evaluateTemporalState(element);
|
|
72
90
|
deepGetTemporalElements(element).forEach((temporalElement) => {
|
|
@@ -78,4 +96,7 @@ const updateAnimations = (element) => {
|
|
|
78
96
|
if (evaluateTemporalStateForAnimation(temporalElement).isVisible) coordinateAnimationsForSingleElement(temporalElement);
|
|
79
97
|
});
|
|
80
98
|
};
|
|
99
|
+
|
|
100
|
+
//#endregion
|
|
81
101
|
export { evaluateTemporalStateForAnimation, updateAnimations };
|
|
102
|
+
//# sourceMappingURL=updateAnimations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateAnimations.js","names":[],"sources":["../../src/elements/updateAnimations.ts"],"sourcesContent":["import {\n deepGetTemporalElements,\n type TemporalMixinInterface,\n} from \"./EFTemporal.ts\";\n\n// All animatable elements are temporal elements with HTMLElement interface\nexport type AnimatableElement = TemporalMixinInterface & HTMLElement;\n\n// Constants\nconst ANIMATION_PRECISION_OFFSET = 0.1; // Use 0.1ms to safely avoid completion threshold\nconst DEFAULT_ANIMATION_ITERATIONS = 1;\nconst PROGRESS_PROPERTY = \"--ef-progress\";\nconst DURATION_PROPERTY = \"--ef-duration\";\nconst TRANSITION_DURATION_PROPERTY = \"--ef-transition-duration\";\nconst TRANSITION_OUT_START_PROPERTY = \"--ef-transition-out-start\";\n\n/**\n * Represents the temporal state of an element relative to the timeline\n */\ninterface TemporalState {\n progress: number;\n isVisible: boolean;\n timelineTimeMs: number;\n}\n\n/**\n * Evaluates what the element's state should be based on the timeline\n */\nexport const evaluateTemporalState = (\n element: AnimatableElement,\n): TemporalState => {\n // Get timeline time from root timegroup, or use element's own time if it IS a timegroup\n const timelineTimeMs = (element.rootTimegroup ?? element).currentTimeMs;\n\n const progress =\n element.durationMs <= 0\n ? 1\n : Math.max(0, Math.min(1, element.currentTimeMs / element.durationMs));\n\n // Root elements and elements aligned with composition end should remain visible at exact end time\n // Other elements use exclusive end for clean transitions\n const isRootElement = !(element as any).parentTimegroup;\n const isLastElementInComposition =\n element.endTimeMs === element.rootTimegroup?.endTimeMs;\n const useInclusiveEnd = isRootElement || isLastElementInComposition;\n\n const isVisible =\n element.startTimeMs <= timelineTimeMs &&\n (useInclusiveEnd\n ? element.endTimeMs >= timelineTimeMs\n : element.endTimeMs > timelineTimeMs);\n\n return { progress, isVisible, timelineTimeMs };\n};\n\n/**\n * Evaluates element visibility specifically for animation coordination\n * Uses inclusive end boundaries to prevent animation jumps at exact boundaries\n */\nexport const evaluateTemporalStateForAnimation = (\n element: AnimatableElement,\n): TemporalState => {\n // Get timeline time from root timegroup, or use element's own time if it IS a timegroup\n const timelineTimeMs = (element.rootTimegroup ?? element).currentTimeMs;\n\n const progress =\n element.durationMs <= 0\n ? 1\n : Math.max(0, Math.min(1, element.currentTimeMs / element.durationMs));\n\n // For animation coordination, use inclusive end for ALL elements to prevent visual jumps\n const isVisible =\n element.startTimeMs <= timelineTimeMs &&\n element.endTimeMs >= timelineTimeMs;\n\n return { progress, isVisible, timelineTimeMs };\n};\n\n/**\n * Updates the visual state (CSS + display) to match temporal state\n */\nconst updateVisualState = (\n element: AnimatableElement,\n state: TemporalState,\n): void => {\n // Always set progress (needed for many use cases)\n element.style.setProperty(PROGRESS_PROPERTY, `${state.progress * 100}%`);\n\n // Handle visibility\n if (!state.isVisible) {\n if (element.style.display !== \"none\") {\n element.style.display = \"none\";\n }\n return;\n }\n\n if (element.style.display === \"none\") {\n element.style.display = \"\";\n }\n\n // Set other CSS properties for visible elements only\n element.style.setProperty(DURATION_PROPERTY, `${element.durationMs}ms`);\n element.style.setProperty(\n TRANSITION_DURATION_PROPERTY,\n `${element.parentTimegroup?.overlapMs ?? 0}ms`,\n );\n element.style.setProperty(\n TRANSITION_OUT_START_PROPERTY,\n `${element.durationMs - (element.parentTimegroup?.overlapMs ?? 0)}ms`,\n );\n};\n\n/**\n * Coordinates animations for a single element and its subtree, using the element as the time source\n */\nconst coordinateAnimationsForSingleElement = (\n element: AnimatableElement,\n): void => {\n const animations = element.getAnimations({ subtree: true });\n\n for (const animation of animations) {\n if (animation.playState === \"running\") {\n animation.pause();\n }\n\n const effect = animation.effect;\n if (!(effect && effect instanceof KeyframeEffect)) {\n continue;\n }\n\n const target = effect.target;\n if (!target) {\n continue;\n }\n\n // For animations in this element's subtree, always use this element as the time source\n // This handles both animations directly on the temporal element and on its non-temporal children\n const timing = effect.getTiming();\n const duration = Number(timing.duration) || 0;\n const delay = Number(timing.delay) || 0;\n const iterations =\n Number(timing.iterations) || DEFAULT_ANIMATION_ITERATIONS;\n\n if (duration <= 0) {\n animation.currentTime = 0;\n continue;\n }\n\n // Use the element itself as the time source (it's guaranteed to be temporal)\n const currentTime = element.ownCurrentTimeMs ?? 0;\n\n if (currentTime < delay) {\n animation.currentTime = 0;\n continue;\n }\n\n const adjustedTime = currentTime - delay;\n const currentIteration = Math.floor(adjustedTime / duration);\n const currentIterationTime = adjustedTime % duration;\n\n // Calculate the total animation timeline length (delay + duration * iterations)\n const totalAnimationLength = delay + duration * iterations;\n\n // CRITICAL: Always keep currentTime below totalAnimationLength to prevent completion\n const maxSafeCurrentTime =\n totalAnimationLength - ANIMATION_PRECISION_OFFSET;\n\n if (currentIteration >= iterations) {\n // Animation would be complete - clamp to just before completion\n animation.currentTime = maxSafeCurrentTime;\n } else {\n // Animation in progress - clamp to safe value within current iteration\n const proposedCurrentTime =\n Math.min(currentIterationTime, duration - ANIMATION_PRECISION_OFFSET) +\n delay;\n animation.currentTime = Math.min(proposedCurrentTime, maxSafeCurrentTime);\n }\n }\n};\n\n/**\n * Main function: synchronizes DOM element with timeline\n */\nexport const updateAnimations = (element: AnimatableElement): void => {\n const temporalState = evaluateTemporalState(element);\n deepGetTemporalElements(element).forEach((temporalElement) => {\n const temporalState = evaluateTemporalState(temporalElement);\n updateVisualState(temporalElement, temporalState);\n });\n updateVisualState(element, temporalState);\n\n // Coordinate animations - use animation-specific visibility to prevent jumps at exact boundaries\n const animationState = evaluateTemporalStateForAnimation(element);\n if (animationState.isVisible) {\n coordinateAnimationsForSingleElement(element);\n }\n\n // Coordinate animations for child elements using animation-specific visibility\n deepGetTemporalElements(element).forEach((temporalElement) => {\n const childAnimationState =\n evaluateTemporalStateForAnimation(temporalElement);\n if (childAnimationState.isVisible) {\n coordinateAnimationsForSingleElement(temporalElement);\n }\n });\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
|
|
2
|
+
@tailwind base;
|
|
3
|
+
/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
|
|
4
|
+
@tailwind components;
|
|
5
|
+
/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
|
|
6
|
+
@tailwind utilities;
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
/*# sourceMappingURL=elements-ZhsB7B5N.css.map*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elements-ZhsB7B5N.css","names":[],"sources":["../src/elements.css"],"sourcesContent":["/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */\n@tailwind base;\n/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */\n@tailwind components;\n/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */\n@tailwind utilities;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/getRenderInfo.d.ts
CHANGED
|
@@ -1,51 +1,57 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/getRenderInfo.d.ts
|
|
4
|
+
|
|
5
|
+
declare const RenderInfo: z.ZodObject<{
|
|
6
|
+
width: z.ZodNumber;
|
|
7
|
+
height: z.ZodNumber;
|
|
8
|
+
fps: z.ZodNumber;
|
|
9
|
+
durationMs: z.ZodNumber;
|
|
10
|
+
assets: z.ZodObject<{
|
|
11
|
+
efMedia: z.ZodRecord<z.ZodString, z.ZodAny>;
|
|
12
|
+
efCaptions: z.ZodArray<z.ZodString, "many">;
|
|
13
|
+
efImage: z.ZodArray<z.ZodString, "many">;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
efMedia: Record<string, any>;
|
|
16
|
+
efCaptions: string[];
|
|
17
|
+
efImage: string[];
|
|
18
|
+
}, {
|
|
19
|
+
efMedia: Record<string, any>;
|
|
20
|
+
efCaptions: string[];
|
|
21
|
+
efImage: string[];
|
|
22
|
+
}>;
|
|
20
23
|
}, "strip", z.ZodTypeAny, {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
durationMs: number;
|
|
25
|
+
width: number;
|
|
26
|
+
height: number;
|
|
27
|
+
fps: number;
|
|
28
|
+
assets: {
|
|
29
|
+
efMedia: Record<string, any>;
|
|
30
|
+
efCaptions: string[];
|
|
31
|
+
efImage: string[];
|
|
32
|
+
};
|
|
30
33
|
}, {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
durationMs: number;
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
fps: number;
|
|
38
|
+
assets: {
|
|
39
|
+
efMedia: Record<string, any>;
|
|
40
|
+
efCaptions: string[];
|
|
41
|
+
efImage: string[];
|
|
42
|
+
};
|
|
40
43
|
}>;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
declare const getRenderInfo: () => Promise<{
|
|
45
|
+
width: number;
|
|
46
|
+
height: number;
|
|
47
|
+
fps: number;
|
|
48
|
+
durationMs: number;
|
|
49
|
+
assets: {
|
|
50
|
+
efMedia: Record<string, any>;
|
|
51
|
+
efCaptions: string[];
|
|
52
|
+
efImage: string[];
|
|
53
|
+
};
|
|
51
54
|
}>;
|
|
55
|
+
//#endregion
|
|
56
|
+
export { RenderInfo, getRenderInfo };
|
|
57
|
+
//# sourceMappingURL=getRenderInfo.d.ts.map
|
package/dist/getRenderInfo.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/getRenderInfo.ts
|
|
2
4
|
const RenderInfo = z.object({
|
|
3
5
|
width: z.number().positive(),
|
|
4
6
|
height: z.number().positive(),
|
|
@@ -61,4 +63,7 @@ const getRenderInfo = async () => {
|
|
|
61
63
|
console.error("Render info", renderInfo);
|
|
62
64
|
return renderInfo;
|
|
63
65
|
};
|
|
66
|
+
|
|
67
|
+
//#endregion
|
|
64
68
|
export { RenderInfo, getRenderInfo };
|
|
69
|
+
//# sourceMappingURL=getRenderInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRenderInfo.js","names":[],"sources":["../src/getRenderInfo.ts"],"sourcesContent":["/**\n * THIS MODULE DOESNT USE THE DEBUG LOGGER BECAUSE IT IS\n * RUN IN A WEB BROWSER. LOGS ARE CAPTURED AND RE-LOGGED.\n *\n * A similar module exists in @/render. For the time being, we are\n * allowing this divergence to allow for a more efficient implementation\n * of the render info extraction.\n */\n\nimport type {\n EFCaptions,\n EFImage,\n EFMedia,\n EFTimegroup,\n} from \"@editframe/elements\";\nimport { z } from \"zod\";\n\nexport const RenderInfo = z.object({\n width: z.number().positive(),\n height: z.number().positive(),\n fps: z.number().positive(),\n durationMs: z.number().positive(),\n assets: z.object({\n efMedia: z.record(z.any()),\n efCaptions: z.array(z.string()),\n efImage: z.array(z.string()),\n }),\n});\n\nexport const getRenderInfo = async () => {\n const rootTimeGroup = document.querySelector(\"ef-timegroup\") as\n | EFTimegroup\n | undefined;\n if (!rootTimeGroup) {\n throw new Error(\"No ef-timegroup found\");\n }\n\n console.error(\"Waiting for media durations\", rootTimeGroup);\n await rootTimeGroup.waitForMediaDurations();\n\n const width = rootTimeGroup.clientWidth;\n const height = rootTimeGroup.clientHeight;\n const fps = 30;\n const durationMs = Math.round(rootTimeGroup.durationMs);\n\n const elements = document.querySelectorAll(\n \"ef-audio, ef-video, ef-image, ef-captions\",\n );\n\n const assets = {\n efMedia: <Record<string, any>>{},\n efCaptions: new Set<string>(),\n efImage: new Set<string>(),\n };\n\n for (const element of elements) {\n switch (element.tagName) {\n case \"EF-AUDIO\":\n case \"EF-VIDEO\": {\n const src = (element as EFMedia).src;\n console.error(\"Processing element\", element.tagName, src);\n // Access fragment index data from the media engine task\n const mediaEngine = (element as EFMedia).mediaEngineTask.value;\n if (mediaEngine && \"data\" in mediaEngine) {\n assets.efMedia[src] = (mediaEngine as any).data;\n }\n break;\n }\n case \"EF-IMAGE\": {\n const src = (element as EFImage).src;\n console.error(\"Processing element\", element.tagName, src);\n assets.efImage.add(src);\n break;\n }\n case \"EF-CAPTIONS\": {\n const src = (element as EFCaptions).targetElement?.src;\n console.error(\"Processing element\", element.tagName, src);\n assets.efCaptions.add(src ?? \"undefined\");\n break;\n }\n }\n }\n\n const renderInfo = {\n width,\n height,\n fps,\n durationMs,\n assets: {\n efMedia: assets.efMedia,\n efCaptions: Array.from(assets.efCaptions),\n efImage: Array.from(assets.efImage),\n },\n };\n\n console.error(\"Render info\", renderInfo);\n\n return renderInfo;\n};\n"],"mappings":";;;AAiBA,MAAa,aAAa,EAAE,OAAO;CACjC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,KAAK,EAAE,QAAQ,CAAC,UAAU;CAC1B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,QAAQ,EAAE,OAAO;EACf,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;EAC1B,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC;EAC/B,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;EAC7B,CAAC;CACH,CAAC;AAEF,MAAa,gBAAgB,YAAY;CACvC,MAAM,gBAAgB,SAAS,cAAc,eAAe;AAG5D,KAAI,CAAC,cACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,SAAQ,MAAM,+BAA+B,cAAc;AAC3D,OAAM,cAAc,uBAAuB;CAE3C,MAAM,QAAQ,cAAc;CAC5B,MAAM,SAAS,cAAc;CAC7B,MAAM,MAAM;CACZ,MAAM,aAAa,KAAK,MAAM,cAAc,WAAW;CAEvD,MAAM,WAAW,SAAS,iBACxB,4CACD;CAED,MAAM,SAAS;EACb,SAA8B,EAAE;EAChC,4BAAY,IAAI,KAAa;EAC7B,yBAAS,IAAI,KAAa;EAC3B;AAED,MAAK,MAAM,WAAW,SACpB,SAAQ,QAAQ,SAAhB;EACE,KAAK;EACL,KAAK,YAAY;GACf,MAAM,MAAO,QAAoB;AACjC,WAAQ,MAAM,sBAAsB,QAAQ,SAAS,IAAI;GAEzD,MAAM,cAAe,QAAoB,gBAAgB;AACzD,OAAI,eAAe,UAAU,YAC3B,QAAO,QAAQ,OAAQ,YAAoB;AAE7C;;EAEF,KAAK,YAAY;GACf,MAAM,MAAO,QAAoB;AACjC,WAAQ,MAAM,sBAAsB,QAAQ,SAAS,IAAI;AACzD,UAAO,QAAQ,IAAI,IAAI;AACvB;;EAEF,KAAK,eAAe;GAClB,MAAM,MAAO,QAAuB,eAAe;AACnD,WAAQ,MAAM,sBAAsB,QAAQ,SAAS,IAAI;AACzD,UAAO,WAAW,IAAI,OAAO,YAAY;AACzC;;;CAKN,MAAM,aAAa;EACjB;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,OAAO;GAChB,YAAY,MAAM,KAAK,OAAO,WAAW;GACzC,SAAS,MAAM,KAAK,OAAO,QAAQ;GACpC;EACF;AAED,SAAQ,MAAM,eAAe,WAAW;AAExC,QAAO"}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import { TemporalMixinInterface } from "../elements/EFTemporal.js";
|
|
2
|
+
import { LitElement } from "lit";
|
|
3
|
+
|
|
4
|
+
//#region src/gui/ContextMixin.d.ts
|
|
5
|
+
|
|
6
|
+
declare class ContextMixinInterface extends LitElement {
|
|
7
|
+
signingURL?: string;
|
|
8
|
+
apiHost?: string;
|
|
9
|
+
rendering: boolean;
|
|
10
|
+
playing: boolean;
|
|
11
|
+
loop: boolean;
|
|
12
|
+
currentTimeMs: number;
|
|
13
|
+
focusedElement?: HTMLElement;
|
|
14
|
+
targetTemporal: TemporalMixinInterface | null;
|
|
15
|
+
play(): Promise<void>;
|
|
16
|
+
pause(): void;
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export {};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { ContextMixinInterface };
|
|
20
|
+
//# sourceMappingURL=ContextMixin.d.ts.map
|